2016-11-11 1 views
1

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.

+0

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. –

Répondre

1

La fonction fread lit les octets en mémoire sans aucune modification. Tout ce que vous avez dans le fichier est mis en mémoire, et stocké dans le tampon, octet pour byte.

La comparaison à hex est effectuée après la conversion * du code en int. La valeur hexadécimale est seulement une représentation d'un entier; on pourrait le remplacer par un nombre décimal, et le code continuerait à fonctionner exactement de la même manière.

Pour voir la valeur comparée, ajoutez cette ligne en face de l'instruction switch:

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

Ahh, je pense que je comprends maintenant. Donc la valeur de caractère que le code pointe vers est automatiquement convertie en int? – Obito

+0

@ caleb15 Oui, il s'agit de la promotion par défaut. C'est un peu déroutant, parce que char ne signifie pas vraiment char dans ce cas; au lieu de cela, cela signifie un octet. – dasblinkenlight

+0

Cela prend tout son sens, merci pour la clarification. – Obito