我对MIPS中的lw指令的理解正确吗?

时间:2019-03-16 16:48:01

标签: assembly mips cpu-registers instruction-set

我才刚刚开始理解MIPS,并且特殊的指令“ lw”使我感到困惑。

从线程Understanding how `lw` and `sw` actually work in a MIPS program,这是我收集的信息:

例如,如果我们有:

lw a, 4(b) // a and b are registers

然后,这只是意味着我们将在b的内存地址上递增4来获取数据(或通常称为“单词”,我仍然不知道为什么...)。然后,将其存储在a中。换句话说,由于每个“字”为4个字节,因此获取下一个数据存储在b地址之后的地址。

还,这是否意味着存储在b中的数据应该是数据结构,例如数组?这样我们才能在b+4的内存地址获取数据?

对不起,我知道我的措词很令人困惑……但是我走对了吗?有人可以简单地向我解释一下,“单词”到底是什么?基本上是数据吗?

1 个答案:

答案 0 :(得分:1)

您处在正确的轨道上。 “字”是4个字节的数据。

lw a, 4(b)

此指令从b中的地址加载一个字,偏移量为4。如果在该地址上是诸如“数组”之类的数据结构,则是有意义的,但不需要这样做。取决于您要实现的目标。

我给你举个简短的例子:

.globl main

.data
    array: .word 1, 2, 3, 4, 5, 6,    # numbers

.text
main:
    addi $t0, $0, 0                 # p value in $t0
    addi $t1, $0, 0                 # array in $t1

    la $t1, array                      # load array into $t1
    lw $t0, 0($t1)                  # load first word into $t0 --> 1
    lw $t0, 4($t1)                  # load second word into $t0 --> 2

    addi $t1, $t1, 4                    # increase address  += 4
    lw $t0, 0($t1)                  # load first word into $t0 --> 2
    lw $t0, 4($t1)                  # load second word into $t0 --> 3

    addi $v0, $0, 10                    # load exit syscall 
    syscall                                     

让我们说数组从示例地址1000开始,我们使用伪指令la将该地址加载到$ t1中。 lw $t0, 0($t1)将第一个单词加载到$ t0中(从示例地址1000-1003加载数据)。 lw $t0, 4($t1)将第二个单词加载到$ t0中(从示例地址1004至1007加载数据)。

您可以使用http://spimsimulator.sourceforge.net/调试程序。它会告诉您哪个地址实际在b中。

希望有帮助。