【发布时间】: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 已经有常用的伪指令,这可能是某些特定汇编程序的另一个伪指令。