2016-11-11 9 views
1

Я работаю над учебником по написанию эмулятора 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() хранить этот файл i.e. ['?', 'A' ... и т. Д.], Я прочитал все о fread(), но в этом конкретном экземпляре его не нажал. Мой второй вопрос, который является самым озадачивающим (по крайней мере для меня), заключается в том, как блок switch знает, когда шестнадцатеричный номер в выражении case эквивалентен значению *code. Я думал, что смогу распечатать значения в *code и сделать некоторую корреляцию между его значением и шестнадцатеричным номером, но это не помогло. Я действительно хочу знать, как выполняется сравнение.

+0

Я понятия не имею, что вы просите о. Но программа, которую вы описываете, считывает двоичные данные, представляющие программу 8080 из файла, и печатает мнемоники команд для каждого байта (или последовательности байтов). Эффективно разобрать программу. –

ответ

1

Функция fread считывает байты в память без каких-либо изменений. Все, что у вас есть в файле, записывается в память и хранится в буфере, байт для байта.

Сравнение с hex выполняется после преобразования * кода в int. Значение Hex является только представлением целого числа; его можно заменить десятичным, и код будет продолжать работать точно так же.

Чтобы увидеть значение сравниваемых, добавьте эту строку перед утверждением переключателя:

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

Ах, думаю, теперь я понимаю. Итак, значение char, которое указывает код *, автоматически преобразуется в int? – Obito

+0

@ caleb15 Да, это поощрение по умолчанию. Это немного сбивает с толку, потому что в этом случае символ на самом деле не означает char; вместо этого это означает байт. – dasblinkenlight

+0

Отличный смысл, спасибо за разъяснение. – Obito