以下代码中的 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);