如何在 MIPS 机器代码中将负数转换/编码为立即数

How to convert / encode a negative number as an immediate in MIPS machine code

我想将此指令更改为二进制或机器代码: addi $s3, $s1, -1000.

我知道如何对操作码 rsrt 进行编码,但我不知道如何将 -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" 寄存器。)