Я работаю над учебником по написанию эмулятора 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
и сделать некоторую корреляцию между его значением и шестнадцатеричным номером, но это не помогло. Я действительно хочу знать, как выполняется сравнение.
Я понятия не имею, что вы просите о. Но программа, которую вы описываете, считывает двоичные данные, представляющие программу 8080 из файла, и печатает мнемоники команд для каждого байта (или последовательности байтов). Эффективно разобрать программу. –