Assembly 如何从十六进制获取MIPS操作码

Assembly 如何从十六进制获取MIPS操作码,assembly,binary,hex,mips,mips32,Assembly,Binary,Hex,Mips,Mips32,如何从像0x71014802这样的数字中计算最左边的6位 这6位告诉我们这段代码代表什么MIPS指令。 答案是0x1c,但这本书是如何计算的 例如: 0x10001A08 = 000011 00000 10000 01000 00000 000111 这个71014802是如何转换成二进制的?我如何做到这一点 第一个是十六进制数,很容易将其转换为二进制。每个十六进制数字都可以转换成4个二进制数字,如下例所示 Ex $$_7=2^2+2^1+2^0=0111_$$ 对于您的十六进制数0x710

如何从像
0x71014802这样的数字中计算最左边的6位
这6位告诉我们这段代码代表什么MIPS指令。
答案是
0x1c
,但这本书是如何计算的

例如:

0x10001A08 = 000011 00000 10000 01000 00000 000111

这个
71014802
是如何转换成二进制的?我如何做到这一点

第一个是十六进制数,很容易将其转换为二进制。每个十六进制数字都可以转换成4个二进制数字,如下例所示

Ex $$_7=2^2+2^1+2^0=0111_$$
对于您的十六进制数0x71014802是

0x71014802 => 0111 0001 0000 0001 0100 1000 0000 0010
                 7    1    0    1    4    8    0    2
关于从十进制到二进制的转换,我建议您先将十进制转换为十六进制,然后再将十六进制转换为二进制,让我们以十进制为例(我选择71014802 DEC)

将十进制数转换为二进制数的另一种方法是除以2,然后选择余数。。。但这是一个较长的过程(你可以找到它)

无论如何,如果操作码处于固定位置(26-31),则只需通过掩码获得操作码,然后向右移动,如下所示:

opcode=(reg>>26)&0x3F
打印二进制数的算法如下所示:

void print_binary(int n) {
   while (n) {
      char bit = n & 0x1;
      putchar (bit+'0');
      n >>= 1;
   }
   putchar('\n');
}
尝试:

0x3F=00111111
这是一直向左推的六位,给出了您要查找的结果

编辑:更详细的解释。 我们要做的是得到整数最左边的六位。为了确定某个位是否翻转(即1或0),我们使用
将其翻转为
1
。获取一个数字的六位是通过构造一个具有六个翻转位的整数来完成的,
00111111
,或
0x3F
,以及
用我们的数字进行如下运算:
num&0x3F
。这将给出整数的六个righmost位,为了得到左边的位,我们将数字一直向左移动,并运行相同的
操作:
(num>(sizeof(num)*8-6))&0x3F

$ cat temp.c
#include <stdio.h>
#include <stdint.h>

int main() {
    uint32_t num = 0x71014802;
    char c = (num >> (sizeof(num) * 8 - 6)) & 0x3F;
    printf("0x%X\n", c);
    return 0;
}

$ gcc temp.c && ./a.out
0x1C
$cat温度c
#包括
#包括
int main(){
uint32_t num=0x71014802;
字符c=(num>>(sizeof(num)*8-6))&0x3F;
printf(“0x%X\n”,c);
返回0;
}
$gcc临时c&./a.out
0x1C

EDIT2:我的数学有点不对劲,这就是你浏览的结果,所以午夜过后。。。更新。

抱歉,我读了c,但它是汇编。。。我不明白这个问题。编辑!!请阅读我的editDone,检查我是否理解您的要求,并在下面添加注释,以备不时之需。如何将71014802转换为二进制?这不是我上面向您展示的吗?你要的是algo吗?我可以在这里为您添加一个算法来实现这一点,或者您可以简单地在您的机器上使用计算器并设置“程序员模式”。我在这里添加了一个函数来打印二进制文件。。。。我在这里添加了一个算法来打印任意32位数字@user3025956的二进制文件。这就是你要找的吗?你能解释一下吗?用解释编辑主要帖子。
char bits = (num >> (sizeof(num)*8 - 6)) & 0x3F;
$ cat temp.c
#include <stdio.h>
#include <stdint.h>

int main() {
    uint32_t num = 0x71014802;
    char c = (num >> (sizeof(num) * 8 - 6)) & 0x3F;
    printf("0x%X\n", c);
    return 0;
}

$ gcc temp.c && ./a.out
0x1C