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

时间:2017-02-14 06:14:10

标签: assembly mips mips32

我目前正在修建一门建筑课程,作为该课程的一部分,我正在学习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 指令,实际上是因为你不能使用寄存器作为偏移量。

1 个答案:

答案 0 :(得分:0)

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

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

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