我在学习 MIPS 时对这部分感到困惑。
John L. Hennessy教授写的教科书说,如果我们要加载一些大常数,我们应该
lui $s0, upper(big)
ori $s0, $s0, lower(big)
但是我们为什么不做
addi $s0, $zero, big
由于寄存器是 32 位的,这更简单,不是吗?
我在学习 MIPS 时对这部分感到困惑。
John L. Hennessy教授写的教科书说,如果我们要加载一些大常数,我们应该
lui $s0, upper(big)
ori $s0, $s0, lower(big)
但是我们为什么不做
addi $s0, $zero, big
由于寄存器是 32 位的,这更简单,不是吗?
传递给的立即参数addi
只有 16 位。要加载超出 16 位值范围的 32 位立即数,您需要分两次执行,如教科书中的示例。
(期待进一步的问题,没有加载立即数或添加立即数指令采用 32 位立即数的原因是因为 MIPS ISA 使用固定大小的 32 位指令,因此任何指令参数总是有 < 32 位可用- 这在 RISC 架构中很常见。)
是的,寄存器是 32 位的,但是如何在 32 位指令中指定 32 位数字?一条指令由操作码和数据组成。因此,您不能在单个 addi 中压缩操作码 + 32 位数据。
或者,使用.data和.text
.data
word32bits: .word 0xFFFFFFFF
.text
lw $t0, word32bits # $t0 now contains your 32 bit word.