了解 `lw` 和 `sw` 在 MIPS 程序中的实际工作方式
Understanding how `lw` and `sw` actually work in a MIPS program
我有点难以理解 sw
和 lw
在 MIPS 程序中的作用。我对该主题的理解是,我们使用 lw
将数据从内存传输到寄存器,反之亦然 sw
。但这究竟是如何实现的呢?
假设我们有以下代码行:
lw Reg.Dest, Offset(Reg.Source)
sw Reg.Source, Offset(Reg.Dest)
如果我们专注于 lw
它本质上是存储内存中的数据,Reg.Source
并将该数据的地址乘以 Offset
,始终是 $4$ 的倍数,因为寄存器处理 $32$ 位,内存使用 $8$ 位,进入寄存器中等于 Offset + Reg.Source
的特定地址 - 所以如果我们说 Offset = 16, Reg.Source = $s1 = 12
那么寄存器将存储来自内存写入寄存器中的地址$28$。
假设我对 lw
的理解是正确的,那么我的问题是 sw
是如何工作的?
PS:如果答案也能只包含一个例子就好了,比如 sw $t0, 32($s3)
.
lw(加载字)从内存中加载一个字到寄存器。
lw , 4() # <- mem(+4)
$2 是目标寄存器,$4 是地址寄存器。而信息的来源就是记忆。
4 是添加(而不是相乘)到地址寄存器的偏移量。这种内存访问称为基于寻址,在许多情况下非常有用。例如,如果 $4 保存结构的地址,偏移量允许选择结构的不同字段。或者数组中的下一个或前一个元素等。偏移量不一定是 4 的倍数,但(地址寄存器 + 偏移量)必须并且大多数时候都是。
Sw类似,只是将一个寄存器存入内存
sw , 8() # mem[+8] <-
同样,$7 是保存内存地址的寄存器,8 是偏移量,$5 是将写入内存的信息源。
请注意,与其他 MIPS 指令相反,第一个操作数是源,而不是目标。可能这是为了强调地址寄存器在两条指令中起着相似作用的事实,而在 lw 中它用于计算数据源的内存地址,在 sw 中用于计算内存目标地址。
我有点难以理解 sw
和 lw
在 MIPS 程序中的作用。我对该主题的理解是,我们使用 lw
将数据从内存传输到寄存器,反之亦然 sw
。但这究竟是如何实现的呢?
假设我们有以下代码行:
lw Reg.Dest, Offset(Reg.Source)
sw Reg.Source, Offset(Reg.Dest)
如果我们专注于 lw
它本质上是存储内存中的数据,Reg.Source
并将该数据的地址乘以 Offset
,始终是 $4$ 的倍数,因为寄存器处理 $32$ 位,内存使用 $8$ 位,进入寄存器中等于 Offset + Reg.Source
的特定地址 - 所以如果我们说 Offset = 16, Reg.Source = $s1 = 12
那么寄存器将存储来自内存写入寄存器中的地址$28$。
假设我对 lw
的理解是正确的,那么我的问题是 sw
是如何工作的?
PS:如果答案也能只包含一个例子就好了,比如 sw $t0, 32($s3)
.
lw(加载字)从内存中加载一个字到寄存器。
lw , 4() # <- mem(+4)
$2 是目标寄存器,$4 是地址寄存器。而信息的来源就是记忆。
4 是添加(而不是相乘)到地址寄存器的偏移量。这种内存访问称为基于寻址,在许多情况下非常有用。例如,如果 $4 保存结构的地址,偏移量允许选择结构的不同字段。或者数组中的下一个或前一个元素等。偏移量不一定是 4 的倍数,但(地址寄存器 + 偏移量)必须并且大多数时候都是。
Sw类似,只是将一个寄存器存入内存
sw , 8() # mem[+8] <-
同样,$7 是保存内存地址的寄存器,8 是偏移量,$5 是将写入内存的信息源。
请注意,与其他 MIPS 指令相反,第一个操作数是源,而不是目标。可能这是为了强调地址寄存器在两条指令中起着相似作用的事实,而在 lw 中它用于计算数据源的内存地址,在 sw 中用于计算内存目标地址。