关于有符号位的 MIPS 指令

MIPS Instructions on signed bits

我在 MIPS 中将两个数字(一个负数和一个正数)相乘,当我将值打印到控制台时,它正确地将其解释为负整数。但是,在我执行此指令后:

andi $t3, $t3, 255 

(我这样做是为了只访问前 8 位)

打印到我的控制台的值是正值。有没有办法通过MIPS中的各种instructions/operations来维护二进制数的有符号值?

不,不是这样(即 anding)。

负数设置了 MSB(即 0x80000000)。当您执行 andi 时,您会丢失此位(即销毁它)。

考虑 -1,即 0xFFFFFFFF。当你和 255 (0x000000FF) 对时,你得到 0x000000FF,也就是十进制的 255。

考虑 -2,即 0xFFFFFFFE。当你和 255 (0x000000FF) 对时,你得到 0x000000FE,也就是十进制的 254。

如果你有一个 signed char [在 C 中],范围是 -128 (0x80) 到 127 (0x7F).

您可以通过以下方式签署扩展:

    sll     $t3,$t3,24              # force sign bit of byte into sign of word
    sra     $t3,$t3,24              # sign extend the register

但是,这只适用于 signed char 值的范围。例如,如果您最初有 511 (0x000001FF) 并这样做,您最终会得到 -1,这是不正确的。

所以,实际上,做 andi 可以说这个问题无效。

您可以保留原始的符号,方法是并行保留原始值,并在以后对其进行处理。