3

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

0x2237FFF1

转二进制

0010 0010 0011 0111 1111 1111 1111 0001

现在我正在阅读操作码(001000)并且知道它是 I-type 和 addi指令

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

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

查看 MIPS 参考表,发现该指令必须是

 addi $s7,$s1,????

我在这里是堆栈,不知道如何确定一般的 16 位立即地址的方法。

4

1 回答 1

3

您可以先让工具为您完成

.word 0x2237FFF1

然后组装和拆卸。

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    $23,$17,-15
于 2017-02-08T16:20:46.460 回答