我目前正在修建一门建筑课程,作为该课程的一部分,我正在学习MIPS装配。
据我所知,lw和sw操作是I格式指令,允许2个寄存器操作数和一个立即操作数:
[opcode] 6-bits, [rs] 5-bits, [rt] 5-bits, [immediate] 16-bits written as: lw $rt, offset($rs) # where offset is an immediate value
好的,所以我想说我想访问A [i]。假设A的基地址在寄存器$ s7中,而索引(i)在寄存器$ s1中,我将不得不做以下几点:
sll $t0, $s1, 2 # i*4 (offset) add $t0, $s7, $t0 # $t0 = &A[i] lw $t1, 0($t0) # $t1 = A[i]
我感到困惑的是我的教授一直说我们也可以用3个寄存器做这样的lw指令:
sll $t0, $s1, 2 # i*4 (offset) lw $t1, $t0($s7) # $t1 = A[i]
这两种解决方案都是正确的吗?或者我的导师是不正确的?您不能使用寄存器进行偏移吗?我认为偏移量必须是立即数。我的理解是你必须在第一个解决方案中执行额外的 add 指令,实际上是因为你不能使用寄存器作为偏移量。
答案 0 :(得分:0)
lw
/ sw
的偏移必须是即时的。如果您的讲师声称MIPS指令集中有lw
/ sw
的变体接受寄存器偏移,那么他/她是不正确的。
但是,可能有汇编程序接受伪指令这样的变体,并将其转换为实际的MIPS指令。在这种情况下,可能的翻译可能是:
addu $at,$s7,$t0
lw $t1, 0($at)