将以下机器语言代码 (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
到目前为止我已经翻译了这段代码,但我不明白的是如何计算(计算)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