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

luc*_*sKo 7 assembly mips

在学习MIPS的过程中,我对这部分感到困惑.

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

lui $s0, upper(big)
ori $s0, $s0, lower(big)
Run Code Online (Sandbox Code Playgroud)

但为什么我们不这样做呢

addi $s0, $zero, big
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*l R 7

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

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


yam*_*man 6

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