MIPS 汇编中 lw/sw 操作的格式?

Format of lw/sw Operations in MIPS Assembly?

我目前正在学习架构课程,作为其中的一部分class我正在学习 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 指令的原因实际上是因为您 cannot 使用寄存器作为偏移量。

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

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

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