Je travaille sur un tutoriel sur l'écriture d'un émulateur 8080. Je comprends la majorité de ce qui est en cours, mais cette partie du désassembleur n'enregistre pas avec moi:Comment l'élément char dans le code suivant est-il comparé au nombre hexadécimal?
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;
}
est ici le prochain morceau de code si vous les gars savent quoi et où *codebuffer
est venu de
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;
}
Le fichier transmis via la ligne de commande est le fichier spaceinvaders.h. Je comprends que le contenu de ce fichier est stocké dans le tampon. Ma première question est de savoir comment fread()
stocker ce fichier, c'est-à-dire ['?', 'A' ... etc], j'ai lu à peu près fread()
mais dans ce cas précis il ne clique pas. Ma deuxième question, qui est la plus embarrassante (pour moi au moins), est de savoir comment le bloc de commutation sait quand le nombre hexadécimal dans l'instruction case est équivalent à la valeur *code
. J'ai pensé que je pourrais imprimer les valeurs à *code
et faire une certaine corrélation entre sa valeur et le nombre de sortilège, mais cela n'a pas aidé. Je veux vraiment savoir comment la comparaison est accomplie.
Je ne sais pas ce que vous demandez au sujet. Mais le programme que vous décrivez lit les données binaires représentant le programme 8080 à partir d'un fichier, et imprime les instructions mnémoniques pour chaque octet (ou séquence d'octets). Démonter efficacement le programme. –