,我已经翻译了这段代码,我不明白的是如何计算(计算(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