MIPS:lw(加载字)指令
MIPS: lw (load word) instruction
lw $s0,8([=10=])
和lw $s0,0($v0)
一样吗?
我看不出有什么不同。我认为8代表偏移量,这意味着我们需要$0的地址并将地址加2(8/4)。
编辑:
我的问题是关于 lw 指令和 MIPS 寄存器集。我很难理解偏移量究竟是如何工作的...
它们并不相同,尽管在某些情况下它们的行为相似。
lw
指令格式如下:
lw RegDest, Offset(RegSource)
其中 RegDest 和 RegSource 是 MIPS 寄存器,Offset 是立即数。
表示将寄存器RegSource的内容与指定的Offset相加得到的地址中包含的字载入寄存器RegDest。生成的源地址必须是字对齐的(即 4 的倍数)
因此,
lw $s0,8([=12=])
表示将位于 [=14=]
指定地址的字的内容加载到 $s0
加 8。因为 [=14=]
是寄存器 $zero
,它将始终包含常数零,它会将位于绝对地址 8 的字加载到 $s0
.
lw $s0,0($v0)
表示加载$s0
位于$v0
指定地址的字的内容。如果 $v0
包含值 8,则两条指令具有相同的效果。如果 $v0
不是 4 的倍数,指令将产生寻址陷阱。
通常 lw
是一种伪指令,因为汇编器可能会发出多条指令来完成指令。偏移量(位移)必须是 16 位有符号值。
如果您的指令具有更多位的立即数,汇编程序通常会使用一个临时寄存器 ($at
) 来保存立即数的内容,然后发出等效指令来执行预期的行为。您可能会使用反汇编程序或 MIPS 监视器(也可以使用 MARS 模拟器检查代码)看到这一点。
lw $s0,8([=10=])
和lw $s0,0($v0)
一样吗?
我看不出有什么不同。我认为8代表偏移量,这意味着我们需要$0的地址并将地址加2(8/4)。
编辑:
我的问题是关于 lw 指令和 MIPS 寄存器集。我很难理解偏移量究竟是如何工作的...
它们并不相同,尽管在某些情况下它们的行为相似。
lw
指令格式如下:
lw RegDest, Offset(RegSource)
其中 RegDest 和 RegSource 是 MIPS 寄存器,Offset 是立即数。
表示将寄存器RegSource的内容与指定的Offset相加得到的地址中包含的字载入寄存器RegDest。生成的源地址必须是字对齐的(即 4 的倍数)
因此,
lw $s0,8([=12=])
表示将位于 [=14=]
指定地址的字的内容加载到 $s0
加 8。因为 [=14=]
是寄存器 $zero
,它将始终包含常数零,它会将位于绝对地址 8 的字加载到 $s0
.
lw $s0,0($v0)
表示加载$s0
位于$v0
指定地址的字的内容。如果 $v0
包含值 8,则两条指令具有相同的效果。如果 $v0
不是 4 的倍数,指令将产生寻址陷阱。
通常 lw
是一种伪指令,因为汇编器可能会发出多条指令来完成指令。偏移量(位移)必须是 16 位有符号值。
如果您的指令具有更多位的立即数,汇编程序通常会使用一个临时寄存器 ($at
) 来保存立即数的内容,然后发出等效指令来执行预期的行为。您可能会使用反汇编程序或 MIPS 监视器(也可以使用 MARS 模拟器检查代码)看到这一点。