【问题标题】:how to fetch the MIPS-opcode from the hex如何从十六进制中获取 MIPS 操作码
【发布时间】:2013-12-08 17:48:51
【问题描述】:

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

例子:

0x10001A08 = 000011 00000 10000 01000 00000 000111

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

【问题讨论】:

  • 对不起,我读了 c 但是汇编...我不明白这个问题。
  • 已编辑!!请阅读我的编辑
  • 完成,检查我是否理解您的要求,请在下方留言以防万一。

标签: assembly binary hex mips mips32


【解决方案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

另一种将十进制数转换为二进制数的方法是除以二并取余数……但这是一个更长的过程(您可以找到它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');
}

【讨论】:

  • 如何将这个 71014802 转换成二进制?
  • 这不是我上面给你看的吗?你要算法吗?我可以在这里给你添加一个算法来做到这一点,或者你可以简单地使用你机器上的计算器并输入“程序员模式”。我在这里添加了一个打印二进制文件的函数
  • 明白....我在这里添加了一个算法来打印任何 32 位数字@user3025956 的二进制文件。这就是你要找的东西吗?
【解决方案2】:

试试:

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

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

EDIT:更详细的解释。 我们要做的是获取整数的最左边六位。要确定一个位是否被翻转(即 1 或 0),我们将and1 结合使用。通过构造一个带有六个翻转位的整数,001111110x3Fand 将它与我们的数字类似:num & 0x3F 来获取数字的六位。这将给出整数的六个 最右边 位,为了获得左侧的位,我们将我们的数字一直向左移动,并运行相同的 and 操作:(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

EDIT2:我的数学有点不对劲,这就是你在午夜后浏览 SO 时得到的结果……更新了。

【讨论】:

  • 你能解释一下吗
  • 编辑主帖并附上解释。
猜你喜欢
  • 1970-01-01
  • 2019-03-29
  • 2014-05-18
  • 2012-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-01
相关资源
最近更新 更多