以下代码中的 char 元素与十六进制数相比如何?
How is the char element in the following code compared to the hex number?
我正在学习有关编写 8080 仿真器的教程。我了解大部分情况,但是反汇编程序的这一部分没有向我注册:
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'...etc],我已经阅读了所有有关 fread()
的内容,但在这个特定实例中它不是点击。我的第二个问题,也是最令人困惑的(至少对我而言),是 switch 块如何知道 case 语句中的十六进制数何时等于值 *code
。我以为我可以打印出 *code
处的值,并在其值和十六进制数之间建立一些相关性,但这没有帮助。我真的很想知道比较是如何完成的。
fread 函数将字节读入内存而不做任何修改。文件中的任何内容都会被带入内存,并逐字节存储在缓冲区中。
与十六进制的比较是在将 *code 转换为 int 之后完成的。十六进制值只是一个整数的表示;可以用小数代替它,代码将继续以完全相同的方式工作。
要查看比较的值,请在 switch 语句前添加此行:
printf("%02x\n", *code);
我正在学习有关编写 8080 仿真器的教程。我了解大部分情况,但是反汇编程序的这一部分没有向我注册:
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'...etc],我已经阅读了所有有关 fread()
的内容,但在这个特定实例中它不是点击。我的第二个问题,也是最令人困惑的(至少对我而言),是 switch 块如何知道 case 语句中的十六进制数何时等于值 *code
。我以为我可以打印出 *code
处的值,并在其值和十六进制数之间建立一些相关性,但这没有帮助。我真的很想知道比较是如何完成的。
fread 函数将字节读入内存而不做任何修改。文件中的任何内容都会被带入内存,并逐字节存储在缓冲区中。
与十六进制的比较是在将 *code 转换为 int 之后完成的。十六进制值只是一个整数的表示;可以用小数代替它,代码将继续以完全相同的方式工作。
要查看比较的值,请在 switch 语句前添加此行:
printf("%02x\n", *code);