【问题标题】:Format of lw/sw Operations in MIPS Assembly?MIPS 程序集中 lw/sw 操作的格式?
【发布时间】:2017-07-02 07:51:29
【问题描述】:

我目前正在学习架构课程,作为该课程的一部分,我正在学习 MIPS 汇编。

据我了解,lw 和 sw 操作是 I 格式指令,允许 2 个寄存器操作数和一个立即数操作数:

[操作码] 6 位,[rs] 5 位,[rt] 5 位,[立即] 16 位 写成: lw $rt, offset($rs) # 其中offset是一个立即数

好的,假设我想访问 A[i]。假设 A 的基地址在寄存器 $s7 中,索引 (i) 在寄存器 $s1 中,我将不得不按照以下方式做一些事情:

sll $t0, $s1, 2 # i*4 (偏移量) 添加 $t0, $s7, $t0 # $t0 = &A[i] lw $t1, 0($t0) # $t1 = A[i]

让我感到困惑的是我的教授一直说我们也可以用 3 个寄存器执行这样的 lw 指令:

sll $t0, $s1, 2 # i*4 (偏移量) lw $t1, $t0($s7) # $t1 = A[i]

这两种解决方案都正确吗?还是我的导师不正确?您不能使用寄存器进行偏移量吗?我认为偏移量必须是立即数。据我了解,您必须在第一个解决方案中执行额外的 add 指令的原因实际上是因为您不能使用寄存器作为偏移量。

【问题讨论】:

  • 汇编语言作为一种语言是由汇编程序定义的,程序读取它并从中生成机器代码。它通常(如果有的话)不是像 C++ 或 JAVA 这样的标准化语言,在某个地方有某个委员会。 MIPS 已经有常用的伪指令,这可能是某些特定汇编程序的另一个伪指令。

标签: assembly mips mips32


【解决方案1】:

lw/sw 的偏移量必须是立即数。如果您的讲师声称在 MIPS 指令集中有一个接受寄存器偏移量的 lw/sw 变体,那么他/她是不正确的。

但是,可能有汇编程序接受这种变体作为 伪指令,并将其转换为实际的 MIPS 指令。在这种情况下,可能的翻译可能是:

addu $at,$s7,$t0
lw  $t1, 0($at)

【讨论】:

  • 为了迂腐,(过时的)MIPS DSP 架构扩展包括lwx $rd,$rxxx($ryyy) 指令,该指令允许将寄存器用作偏移量。
猜你喜欢
  • 2019-06-05
  • 2021-10-31
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
相关资源
最近更新 更多