以下代码中的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的值,并在其值和十六进制数之间建立一些相关性,但这并没有帮助。我真的很想知道如何完成比较。

+0

我不知道你在问什么。但是您所描述的程序是从文件中读取代表8080程序的二进制数据,并为每个字节(或字节序列)打印指令助记符。有效地分解程序。 –

fread函数将字节读入内存而不做任何修改。无论你在文件中有什么被带入内存,并存储在缓冲区中,字节为字节。

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

要查看值进行比较,在switch语句前加上这一行:

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

啊,我想我现在明白了。所以* code指向的char值会自动转换为int? – Obito

+0

@ caleb15是的,这是默认的促销。这有点令人困惑,因为在这种情况下char并不是真正意义上的字符;相反,它意味着一个字节。 – dasblinkenlight

+0

非常有意义,谢谢你的澄清。 – Obito