将以下机器语言代码 (0x2237FFF1) 翻译成 MIPS 汇编

Translate the following machine language code (0x2237FFF1) into MIPS assembly

到目前为止我已经翻译了这段代码,但我不明白的是如何计算(计算)16 位立即地址的数量。

0x2237FFF1

转二进制

0010 0010 0011 0111 1111 1111 1111 0001

现在我正在读取操作码 (001000) 并且知道它是 I 型并且 addi说明

现在我将二进制分组为 I 型指令

   op     rs    rt       imm
 001000 10001 10111 1111111111110001
   8      17    23        ?

查看MIPS参考资料sheet发现指令一定是

 addi $s7,$s1,????

我卡在这里,不知道一般16位立即数地址的判断方法

您可以先让工具为您代劳

.word 0x2237FFF1

然后 assemble 和 disassemble.

mips-elf-as so.s -o so.o
mips-elf-objdump -D so.o

so.o:     file format elf32-bigmips

Disassembly of section .text:

00000000 <.text>:
   0:   2237fff1    addi    s7,s1,-15

然后做你正在做的事情,立即数一般要么有符号要么没有(通常在指令集内和跨指令集)在这种情况下它将是 0x0000FFF1 或 0xFFFFFFF1 你可以使用你的计算器或者只是看看在你扩展的位上,二进制补码取反并加一,这样你的数字就变成了二进制 1110+1 或 1111,它是 15,所以 0xFFFFFFF1 是有符号数 -15。或者 unsigned 0xFFFFFFF1 无论如何,几十亿。

编辑

不高兴看到我的 binutils 使用 abi 寄存器名称,所以修复了:

Disassembly of section .text:

00000000 <.text>:
   0:   2237fff1    addi    ,,-15