2017-10-07 8 views
1

Je dispose d'un fichier txt que je prends nombres comme 02324020 qui est le code de la machine de l'instruction MIPS: add $t0, $s1, $s2Comment est-ce que je masque les bits que je ne veux pas de mon machinecode?

Quand il est en binaire et les couper en tronçons de 6,5,5,5,5 , 6 les nombres pris sont: 0,17,18,8,0,20

Cela donne l'idée de l'instruction comme R [rd] = R [rs] + R [rt] et le nombre de 26- J'appelle opcode 0 signifiant format R, rd = 8, rs = 17, rt = 18

J'essaie de masquer les bits afin que je voie seulement les bits entre 21-25 et que je reçois le numéro qu'ils sont: 0,17,18,8,0,20 parce que le décalage vers la droite: printf("\n%x\n", code >>26); me donne t il opcode 0 et me dit que c'est le format R.

Alors maintenant, je suis en train de trouver le 17 mais je ne sais pas quoi placer après & 0b dans:

printf("\n%x\n", code >>21 & 0b____); 

je pourrais vraiment utiliser un exemple pour trouver les numéros restants de mon numéro 02324020

Ceci est mon code à ce jour:

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) 
{ 

    unsigned int code = 0; 
    FILE *fp; 
    fp = fopen(argv[1], "r+"); 
    int result = fscanf(fp, "%x", &code); 
    printf("\n hex-1: %08X, decimal-1: %d \n", code, code); 

    printf("\n%x\n", code >>26); 
    printf("\n%x\n", code >>21 & 0x0b00000011111); //what can i do to change this 
    while (result != EOF) 
    { 
     result = fscanf(fp, "%x", &code); 
     printf("\n read hex: %08X, decimal: %d \n", code, code); 
     if(feof(fp)) 
     { 
      puts("EOF"); 
      break; 
     }//if 
    }//while 
} 
+1

Faire code '>> 21 & 0b11111' devrait vous donner 17 que vous recherchez. Est-ce que ça ne marche pas? – frslm

+0

!!! cela fonctionne, mais pourquoi ob11111? et comment cela changerait-il quand j'essayerais d'obtenir le prochain 18? – KunaiBunsen

+0

Modifier: attendre je l'ai essayé avec les autres sections et ils travaillent oh mon dieu qui était si simple je ne peux pas le croire, merci! – KunaiBunsen

Répondre

1

Pour définir un nombre binaire, vous utiliseriez 0b___ (comme vous l'avez mentionné dans votre réponse), non 0x0b0___.

Pour extraire le nombre dont vous avez besoin, vous devez décaler code afin que les bits qui vous intéressent soient à l'extrême droite. . Ensuite OR seulement les bits que vous êtes intéressé par ce Putting ensemble, vous avez:

printf("\n%x\n", code >> 26); 
printf("\n%x\n", code >> 21 & 0b11111); 
printf("\n%x\n", code >> 16 & 0b11111); 
printf("\n%x\n", code >> 11 & 0b11111); 
printf("\n%x\n", code >> 6 & 0b11111); 
printf("\n%x\n", code  & 0b111111);