了解 `lw` 和 `sw` 在 MIPS 程序中的实际工作方式

Ski*_*ask 6 assembly mips cpu-architecture

我在理解MIPS 程序中的内容swlw操作时遇到了一些困难。我对这个话题的理解是,我们lw用来将数据从内存传输到寄存器,反之亦然sw。但这究竟是如何实现的呢?

假设我们有以下代码行:

lw Reg.Dest, Offset(Reg.Source)
sw Reg.Source, Offset(Reg.Dest)
Run Code Online (Sandbox Code Playgroud)

如果我们专注于lw它本质上是存储来自内存的数据,并将该数据Reg.Source的地址乘以Offset,始终是 $4$ 的倍数,因为寄存器处理 $32$ 位,而内存使用 $8$ 位,进入特定地址寄存器等于Offset + Reg.Source- 所以如果我们说Offset = 16, Reg.Source = $s1 = 12那么寄存器会将内存中的数据存储到寄存器中的地址 $28$ 中。

假设我的理解lw是正确的,那么我的问题是如何sw工作?

PS:如果答案也可以只包含一个线性示例,例如sw $t0, 32($s3).

Ala*_*got 14

lw(加载字)将一个字从内存加载到寄存器中。

lw $2, 4($4) # $2 <- mem($4+4)
Run Code Online (Sandbox Code Playgroud)

$2 是目标寄存器,$4 是地址寄存器。而信息的来源是记忆。

4 是添加(未乘)到地址寄存器的偏移量。这种内存访问称为基于寻址,在许多情况下非常有用。例如,如果 $4 保存结构的地址,则偏移量允许选择结构的不同字段。或者数组中的下一个或前一个元素等。偏移量不必是 4 的倍数,但(地址寄存器 + 偏移量)必须并且大多数时候两者都是。

Sw 类似,但将寄存器存储到内存中。

 sw $5, 8($7) # mem[$7+8] <- $5
Run Code Online (Sandbox Code Playgroud)

同样,$7 是保存内存地址的寄存器,8 是偏移量,$5 是将写入内存的信息的来源。

请注意,与其他 MIPS 指令相反,第一个操作数是源,而不是目标。这可能是为了加强地址寄存器在两条指令中扮演类似角色的事实,而在 lw 中它用于计算数据源的内存地址,而在 sw 中则用于计算内存目标地址。