gpt4 book ai didi

c - 以下代码中的 char 元素与十六进制数相比如何?

转载 作者:太空宇宙 更新时间:2023-11-04 03:26:47 26 4
gpt4 key购买 nike

我正在学习有关编写 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 block 如何知道 case 语句中的十六进制数何时等于值 *code。我想我可以打印出 *code 的值,并在它的值和十六进制数之间建立一些关联,但这没有帮助。我真的很想知道比较是如何完成的。

最佳答案

fread 函数将字节读入内存而不做任何修改。文件中的任何内容都会被带入内存,并逐字节存储在缓冲区中。

与十六进制的比较是在将 *code 转换为 int 之后完成的。十六进制值只是一个整数的表示;可以用小数代替它,代码将继续以完全相同的方式工作。

要查看比较的值,请在 switch 语句前添加此行:

printf("%02x\n", *code);

关于c - 以下代码中的 char 元素与十六进制数相比如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40555763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com