【问题标题】:Understanding how `lw` and `sw` actually work in a MIPS program了解 `lw` 和 `sw` 在 MIPS 程序中的实际工作方式
【发布时间】:2019-06-05 18:38:20
【问题描述】:

我很难理解 swlw 在 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),那就太好了。

【问题讨论】:

  • 可能相关:stackoverflow.com/a/54066664/4271923(虽然您的措辞和问题似乎有点混乱,并且使用了不精确的措辞,这很难说您是否也感到困惑,或者只是不使用“行话”)
  • 还有一个额外的注意... 32位寄存器物理上直接存储在CPU芯片上,因此CPU在指令中使用它们非常快(但您只有32个寄存器可用MIPS CPU = 32*4 = 128 字节,而计算机内存芯片通常以千/百万/十亿字节大小)。要从内存加载/存储任何东西,它需要更多的时间,因为内存是不同的芯片,CPU必须与内存芯片进行额外的通信,告诉它选择哪个地址并等待读取,或发送值以写入它(这就是sw 所做的)。
  • 官方文档不是已经充分解释了这一点吗?例如:SW rt, offset(base) 描述: memory[base+offset] ← rt 寄存器 rt 的最低有效 32 位字存储在内存中由对齐的有效地址指定的位置。将 16 位带符号的 offset 添加到 GPR base 的内容中,形成有效地址。

标签: assembly mips cpu-architecture


【解决方案1】:

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

lw $2, 4($4) # $2 <- mem($4+4)

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

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

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

 sw $5, 8($7) # mem[$7+8] <- $5

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

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

【讨论】:

    猜你喜欢
    • 2017-07-02
    • 1970-01-01
    • 2021-10-31
    • 2018-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    相关资源
    最近更新 更多