我才刚刚开始理解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
的内存地址获取数据?
对不起,我知道我的措词很令人困惑……但是我走对了吗?有人可以简单地向我解释一下,“单词”到底是什么?基本上是数据吗?
答案 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中。
希望有帮助。