偏移量在这行 MIPS 代码中做了什么:lw $s0,4($t0)?

Bwo*_*ods -1 assembly mips cpu-architecture cpu-registers

不确定偏移量是否意味着将指令提取并存储在距“加载字”程序计数器一行(4 字节)的地方到寄存器 $s0,4($t0) 中。这在内存中是如何工作的?如果可能,请提供示例。

Tet*_*ton 5

LW 和 SW 的功能可以在 MIPS 指令集中读取,迈克尔已经说过。

但是,为了快速起见,我仍然在这里提供答案。LW 代表加载字。它从存储该值的地址将 32 位字值加载到目标寄存器 (rt)。

LW rt, offset(base)
Run Code Online (Sandbox Code Playgroud)

让我们举一个简单的例子:

LUI T0, 0x8033
LW T1, 0x2550(T0)
Run Code Online (Sandbox Code Playgroud)

上面的代码现在将加载位于地址的 32 位字值:

0x80332550
Run Code Online (Sandbox Code Playgroud)

LUI 中的值是地址的上半部分,而提供的偏移量 0x2550 是下半部分。现在 MIPS 只需从 0x80332550 加载 32 位值。

假设 0x80332550 包含以下值:

0x80332550: 25 66 99 88 77 14 22 66
Run Code Online (Sandbox Code Playgroud)

在 LW 指令之后,T1 现在将包含值 0x25669988。(如果在 big-endian 上,在 little-endian 上它将是 0x88996625)

SW 与 LW 几乎相同,只是它将 32 位值存储到提供的地址而不是加载它。在这种情况下,rt 寄存器充当值持有者。

  • 一些挑剔:“$t0”是基数,0x2555 是_offset_。并且 0x80332555 不是加载字的有效地址,因为它不是字对齐的。 (2认同)