我很困惑这个部分,而我学习MIPS。
由教授写的教科书约翰·亨尼斯说,如果我们得到了一些大的不断加载,我们应该
lui $s0, upper(big)
ori $s0, $s0, lower(big)
但是,为什么我们不只是做
addi $s0, $zero, big
由于寄存器是32位,这是更strightforward,是吗?
我很困惑这个部分,而我学习MIPS。
由教授写的教科书约翰·亨尼斯说,如果我们得到了一些大的不断加载,我们应该
lui $s0, upper(big)
ori $s0, $s0, lower(big)
但是,为什么我们不只是做
addi $s0, $zero, big
由于寄存器是32位,这是更strightforward,是吗?
传递给眼前的说法addi
是只有16位。 要加载32位立即值,你需要做的是在两个16位的价值远远的范围之外,如从教科书的例子。
(预见进一步的问题,其原因是没有负载直接或添加立即指令,其采取32位的立即值是因为MIPS ISA使用固定尺寸的32个指令,因此总是有<可用于任何指令参数32位 - 这在RISC架构很常见的。)
是的寄存器是32位,但你怎么能在32位的指令指定一个32位的数字? 指令由操作码和数据。 所以,你不能在一个单一的阿迪挤压操作码+ 32位数据。
或者,使用。数据和的.text
.data
word32bits: .word 0xFFFFFFFF
.text
lw $t0, word32bits # $t0 now contains your 32 bit word.
如果你需要加载大量的常数,您可以使用文字池。 然后,每个恒定载荷成本只有1加载指令。 更多的信息在这里和这里