如何在 MIPS 机器代码中将负数转换/编码为立即数
How to convert / encode a negative number as an immediate in MIPS machine code
我想将此指令更改为二进制或机器代码:
addi $s3, $s1, -1000
.
我知道如何对操作码 rs
和 rt
进行编码,但我不知道如何将 -1000
转换为二进制。
我知道如何求 1 的补码和 2 的补码。但是我不知道如何在这个输入指令中表达它。
我只是不知道如何将 -1000 表示为二进制数的最后 16 位。
因为 1000(十进制)是 16 位的 0000001111101000。
1's complement is 1111110000010111
+1
= 1111110000011000 2's complement
所以整个指令的答案是
001000 10001 10011 1111110000011000
addi rs rt immediate
这样对吗?
是的,MIPSaddi
/addiu
使用一个16位有符号的2的补码立即数作为指令字的低16位。 CPU 将在解码时将其符号扩展为 32(或 64)位。
但请注意 ori
/ xori
/ andi
逻辑指令使用 unsigned 零扩展为 32 的 16 位立即数-位(或 64 位),因此 -1000
不可编码。
要实现 xori $t0, $t1, -1000
,您需要在寄存器中创建一个 32 位 -1000
,类似 addiu $at, $zero, -1000
,然后您可以 xori $t0, $t1, $at
。 ($at
是像 bgt
这样的伪指令使用的 "assembler temporary" 寄存器。)
我想将此指令更改为二进制或机器代码:
addi $s3, $s1, -1000
.
我知道如何对操作码 rs
和 rt
进行编码,但我不知道如何将 -1000
转换为二进制。
我知道如何求 1 的补码和 2 的补码。但是我不知道如何在这个输入指令中表达它。
我只是不知道如何将 -1000 表示为二进制数的最后 16 位。
因为 1000(十进制)是 16 位的 0000001111101000。
1's complement is 1111110000010111
+1
= 1111110000011000 2's complement
所以整个指令的答案是
001000 10001 10011 1111110000011000
addi rs rt immediate
这样对吗?
是的,MIPSaddi
/addiu
使用一个16位有符号的2的补码立即数作为指令字的低16位。 CPU 将在解码时将其符号扩展为 32(或 64)位。
但请注意 ori
/ xori
/ andi
逻辑指令使用 unsigned 零扩展为 32 的 16 位立即数-位(或 64 位),因此 -1000
不可编码。
要实现 xori $t0, $t1, -1000
,您需要在寄存器中创建一个 32 位 -1000
,类似 addiu $at, $zero, -1000
,然后您可以 xori $t0, $t1, $at
。 ($at
是像 bgt
这样的伪指令使用的 "assembler temporary" 寄存器。)