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

时间:2013-11-23 22:32:06

标签: assembly binary hex mips mips32

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

示例:

0x10001A08 = 000011 00000 10000 01000 00000 000111

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

2 个答案:

答案 0 :(得分:1)

第一个是十六进制数,可以直接将其转换为二进制数。每个HEX数字都可以转换成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)

71014802 => 0x43B9992 => 0000 0100 0011 1011 1001 1001 1001 0010
                            0    4    3    B    9    9    9    2

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

无论如何,如果操作码处于固定位置(26-31),操作码可以通过掩码简单地获得并向右移动,如下所示:

opcode=(reg>>26)&0x3F

打印二进制数的算法可以是这样的:

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

答案 1 :(得分:0)

尝试:

char bits = (num >> (sizeof(num)*8 - 6)) & 0x3F;

0x3F = 00111111将六位一直推到左边,为您提供所需的结果。

编辑:更详细的解释。 我们要做的是获取整数的最左边六位。为了确定某个位是否被翻转(即1或0),我们and使用1。获得一个数字的六位是通过构造一个包含六个翻转位001111110x3F的整数,并and使用我们的数字来完成的:num & 0x3F。这将给出整数的六个最右侧位,以获取左侧的位,我们将数字一直向左移动,并运行相同的and操作:{ {1}}。

(num >> (sizeof(num)*8 - 6)) & 0x3F

EDIT2 :我的数学有点偏差,这就是你在午夜后浏览的结果...更新。