10

我在学习 MIPS 时对这部分感到困惑。

John L. Hennessy教授写的教科书说,如果我们要加载一些大常数,我们应该

lui $s0, upper(big)
ori $s0, $s0, lower(big)

但是我们为什么不做

addi $s0, $zero, big

由于寄存器是 32 位的,这更简单,不是吗?

4

4 回答 4

10

传递给的立即参数addi只有 16 位。要加载超出 16 位值范围的 32 位立即数,您需要分两次执行,如教科书中的示例。

(期待进一步的问题,没有加载立即数或添加立即数指令采用 32 位立即数的原因是因为 MIPS ISA 使用固定大小的 32 位指令,因此任何指令参数总是有 < 32 位可用- 这在 RISC 架构中很常见。)

于 2012-10-31T15:06:35.423 回答
6

是的,寄存器是 32 位的,但是如何在 32 位指令中指定 32 位数字?一条指令由操作码和数据组成。因此,您不能在单个 addi 中压缩操作码 + 32 位数据。

于 2012-10-31T15:07:48.797 回答
1

或者,使用.data.text

.data
   word32bits: .word 0xFFFFFFFF

.text
   lw $t0, word32bits # $t0 now contains your 32 bit word.
于 2018-03-29T02:39:52.187 回答
0

如果需要加载大量常量,可以使用文字池。然后每个恒定加载仅花费 1 条加载指令。更多信息在这里这里

于 2013-08-01T13:52:33.377 回答