lw $s0,8($0)
与lw $s0,0($v0)
相同吗?
我没有看到差异。我认为8代表偏移量,这意味着我们需要$ 0的地址并将2(8/4)加到地址上。
编辑:
我的问题是关于lw指令和MIPS寄存器集。我很难理解偏移是如何工作的......
答案 0 :(得分:9)
它们不尽相同,尽管在某些情况下它们会表现得相似。
lw
指令的格式如下:
lw RegDest, Offset(RegSource)
其中RegDest和RegSource是MIPS寄存器,而Offset是立即数。
这意味着,通过添加寄存器RegSource的内容和指定的偏移量,将地址中包含的字加载到寄存器RegDest中。得到的源地址必须是字对齐的(即4的倍数)
因此,
lw $s0,8($0)
表示在$s0
中加载位于$0
指定地址的单词内容加上8. $0
是注册$zero
,其中包含常数为零,它会将位于绝对地址8中的单词加载到$s0
。
lw $s0,0($v0)
表示在$s0
中加载位于$v0
指定地址的单词内容。如果$v0
包含值8,则两个指令都具有相同的效果。如果$v0
不是4的倍数,则该指令将生成寻址陷阱。
通常lw
是一个伪指令,意思是汇编器可能会发出多条指令来完成指令。偏移量(位移)必须是16位有符号值。
如果您的指令具有更多位的立即数,则汇编器通常将使用临时寄存器($at
)来保存立即数的内容,然后发出等效指令以执行预期的行为。您可以使用反汇编程序或MIPS监视器(也使用MARS模拟器检查代码)来查看此操作。
答案 1 :(得分:-2)
当您将寄存器名称放在括号内时,它实际上表现得像一个数组,前面的 8 表示您要使用数组的第二个单元格的内容,如果数组有 2 个或更多单元格,则它会放出单元格的内容,否则,它会给你零值。 $0 总是会给你零,所以......是的,在某些情况下,这两条指令做同样的事情。