⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 reloc.c

📁 一个C style Assembler的source code
💻 C
字号:
#include <stdio.h>#include <ctype.h>#include <string.h>typedef unsigned char byte;typedef unsigned int word;byte Nib(int X) {   if (X >= '0' && X <= '9') return X - '0';   if (X >= 'a' && X <= 'f') return X - 'a' + 10;   if (X >= 'A' && X <= 'F') return X - 'A' + 10;   fprintf(stderr, "Bad hexadecimal digit in input\n");   exit(1);}byte CheckSum;byte GetHex(FILE *InF) {   int A, B; byte Bt;   A = fgetc(InF); B = fgetc(InF);   if (A == EOF || B == EOF) {      fprintf(stderr, "Unexpected EOF.\n"); exit(1);   }   Bt = Nib(A) << 4 | Nib(B);   CheckSum = (CheckSum + Bt)&0xff; return Bt;}word GetWord(FILE *InF) {   word A, B;   A = GetHex(InF); B = GetHex(InF);   return (A << 8) | B;}void PutHex(FILE *OutF, byte Ch) {   fprintf(OutF, "%02x", Ch); CheckSum = (CheckSum + Ch)&0xff;}void PutWord(FILE *OutF, word W) {   PutHex(OutF, (byte)(W >> 8)); PutHex(OutF, (byte)(W&0xff));}void Relocate(word Offset, FILE *InF, FILE *OutF) {   int Ch, I;   byte Size, Mark; word Addr;   byte Buffer[0x10];   while (1) {      do {         Ch = fgetc(InF);         if (Ch == EOF) { fprintf(stderr, "Unexpected EOF.\n"); exit(1); }      } while (Ch != ':');      CheckSum = 0;      Size = GetHex(InF); Addr = GetWord(InF) + Offset; Mark = GetHex(InF);      for (I = 0; I < Size; I++) Buffer[I] = GetHex(InF);      (void)GetHex(InF); (void)fgetc(InF);      if (CheckSum != 0) {         fprintf(stderr, "Bad checksum.\n"); exit(1);      }      fputc(':', OutF);      CheckSum = 0;      PutHex(OutF, Size); PutWord(OutF, Addr); PutHex(OutF, Mark);      for (I = 0; I < Size; I++) PutHex(OutF, Buffer[I]);      PutHex(OutF, (byte)-CheckSum);      fputc('\n', OutF);      if (Mark) break;   }}word atoh(char *S) {   word Val;   for (Val = 0; *S != '\0'; S++) {      if (isdigit(*S)) Val = (Val << 4) | (*S - '0');      else if (isxdigit(*S)) Val = (Val << 4) | (tolower(*S) - 'a' + 10);      else return 0;   }   return Val;}char *Convert(char *Path) {   static char *S; char *T;   S = (char *)malloc(strlen(Path) + 1);   if (S == 0) return 0;   strcpy(S, Path);   for (T = S + strlen(S); T > S; T--)      if (T[-1] == '.') break;   if (T == S) { free(S); return 0; }   *T++ = 'h', *T++ = 'x', *T = '\0';   return S;}main(int ArgC, char **ArgV) {   word Offset; FILE *InF, *OutF; char *OutName;   if (ArgC != 3) { printf("Usage: relocate Offset Input.\n"); exit(0); }   Offset = atoh(ArgV[1]);   if (Offset == 0) printf("Zero offset/bad offset specified.\n");   OutName = Convert(ArgV[2]);   if (OutName == 0) { printf("%s not of form *.hex.\n", ArgV[2]); exit(0); }   InF = fopen(ArgV[2], "r");   if (InF == 0) { printf("Cannot open %s.\n", ArgV[2]); exit(0); }   OutF = fopen(OutName, "w");   if (OutF == 0) { printf("Cannot open %s.\n", OutName); exit(0); }   Relocate(Offset, InF, OutF);   fclose(InF), fclose(OutF);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -