以下代码中的char元素与十六进制数字相比如何?
我正在编写一个8080模拟器的教程。据我所知,大多数的怎么回事,但反汇编的这部分不跟我登记:以下代码中的char元素与十六进制数字相比如何?
int Disassemble8080Op(unsigned char *codebuffer, int pc)
{
unsigned char *code = &codebuffer[pc];
int opbytes = 1;
printf ("%04x ", pc);
switch (*code)
{
case 0x00: printf("NOP"); break;
case 0x01: printf("LXI B,#$%02x%02x", code[2], code[1]); opbytes=3; break;
case 0x02: printf("STAX B"); break;
case 0x03: printf("INX B"); break;
case 0x04: printf("INR B"); break;
case 0x05: printf("DCR B"); break;
case 0x06: printf("MVI B,#$%02x", code[1]); opbytes=2; break;
case 0x07: printf("RLC"); break;
case 0x08: printf("NOP"); break;
/* ........ */
case 0x3e: printf("MVI A,#0x%02x", code[1]); opbytes = 2; break;
/* ........ */
case 0xc3: printf("JMP $%02x%02x",code[2],code[1]); opbytes = 3; break;
/* ........ */
}
printf("\n");
return opbytes;
}
这里是代码的下位,所以你们知道什么,在哪里*codebuffer
从
int main (int argc, char**argv)
{
FILE *f= fopen(argv[1], "rb");
if (f==NULL)
{
printf("error: Couldn't open %s\n", argv[1]);
exit(1);
}
//Get the file size and read it into a memory buffer
fseek(f, 0L, SEEK_END);
int fsize = ftell(f);
fseek(f, 0L, SEEK_SET);
unsigned char *buffer=malloc(fsize);
fread(buffer, fsize, 1, f);
fclose(f);
int pc = 0;
while (pc < fsize)
{
pc += Disassemble8080Op(buffer, pc);
}
return 0;
}
来到
通过命令行传入的文件是spaceinvaders.h文件。我明白这个文件的内容存储在缓冲区中。我的第一个问题是fread()
如何存储这个文件,即['?','a'...等],我已经读了大约fread()
,但在这个特定的情况下,它没有点击。我的第二个问题,最令人困惑的是(至少对我来说),是开关块如何知道case语句中的十六进制数字是否等于*code
的值。我想我可以打印出*code
的值,并在其值和十六进制数之间建立一些相关性,但这并没有帮助。我真的很想知道如何完成比较。
fread函数将字节读入内存而不做任何修改。无论你在文件中有什么被带入内存,并存储在缓冲区中,字节为字节。
与十六进制的比较是在将*代码转换为int后完成的。十六进制值只是一个整数的表示;可以用小数代替它,代码将继续以相同的方式工作。
要查看值进行比较,在switch语句前加上这一行:
printf("%02x\n", *code);
啊,我想我现在明白了。所以* code指向的char值会自动转换为int? – Obito
@ caleb15是的,这是默认的促销。这有点令人困惑,因为在这种情况下char并不是真正意义上的字符;相反,它意味着一个字节。 – dasblinkenlight
非常有意义,谢谢你的澄清。 – Obito
我不知道你在问什么。但是您所描述的程序是从文件中读取代表8080程序的二进制数据,并为每个字节(或字节序列)打印指令助记符。有效地分解程序。 –