2017-10-07 113 views
1

所以,我有我像02324020这是从MIPS指令的机器代码以数字的txt文件:add $t0, $s1, $s2我如何掩盖我不想从我的机器码中得到的位?

当它在二进制和切成6,5,5,5,5节,6所采取的数字是:0,17,18,8,0,20

这给出了指令的概念:R [rd] = R [rs] + R [rt]和26- 31是操作码0意味着R格式,rd = 8,rs = 17,rt = 18

我试图掩盖位,所以我只看到21-25之间的位,然后收到它们的数字: 0,17,18,8,0,20因为向右移动:printf("\n%x\n", code >>26);给我t他操作码0并告诉我它的R格式。

所以现在我试图找到17,但我不知道该怎么放置后& 0b在:

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

我真的可以用一个例子来从我的电话号码02324020

找到剩余的号码

这是我到目前为止的代码:

#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

做'代码>> 21 0b11111'应该给你你正在寻找的17。这不行吗? – frslm

+0

!!!这确实有效,但为什么ob11111?当我试图获得下一个18时,它会如何改变? – KunaiBunsen

+0

编辑:等我试了与其他部分,他们的工作哦,我的上帝,这是如此简单,我不能相信它,谢谢! – KunaiBunsen

回答

1

要定义一个二进制数,你会使用0b___(如你在你的答案中提到),而不是0x0b0___

要提取您需要的数字,您必须位移code,以便您感兴趣的位位于最右端。然后OR只有那些位你有兴趣把这个放在一起,你有:

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); 
相关问题