加载32位常数以在MIPS中注册

时间:2012-10-31 15:03:15

标签: assembly mips

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

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

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

但为什么我们不做呢

addi $s0, $zero, big

由于寄存器是32位的,这更直接,不是吗?

4 个答案:

答案 0 :(得分:6)

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

(预计另一个问题,没有立即加载的原因或添加立即执行32位立即值的指令是因为MIPS ISA使用固定大小的32位指令,所以总是有< 32位可用于任何指令参数 - 这在RISC架构中非常常见。)

答案 1 :(得分:3)

是寄存器是32位但是如何在32位指令中指定32位数?指令由操作码和数据组成。因此,您无法在单个addi中挤出操作码+ 32位数据。

答案 2 :(得分:1)

或者,使用 .data .text

.data
   word32bits: .word 0xFFFFFFFF

.text
   lw $t0, word32bits # $t0 now contains your 32 bit word.

答案 3 :(得分:0)

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