将以下机器语言代码 (0x2237FFF1) 转换为 MIPS 程序集


到目前为止

,我已经翻译了这段代码,我不明白的是如何计算(计算(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参考表,发现指令必须是

 addi $s7,$s1,????

我在这里堆叠,不知道如何确定通用中的 16 位即时地址的方法。

您可以从让工具为您完成它开始

.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。 或者未签名0xFFFFFFF1不管是什么,几十亿。

编辑

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

Disassembly of section .text:
00000000 <.text>:
   0:   2237fff1    addi    $23,$17,-15

最新更新