我想知道当您使用不同的寄存器(例如以下代码)时有什么区别:
正确的答案始终使用寄存器$v0
:
get_status:
lui $t0,0xabab
ori $t0, $t0, 0x0020
lw $v0,0($t0)
andi $v0,$v0,0x4
srl $v0,$v0,2
jr $ra
我使用的是$t1
而不是上面的$v0
,请注意,我还有一个额外的sw
:
get_status:
lui $t0,0xabab
ori $t0, $t0, 0x0020
lw $t1,0($t0)
andi $t1,$t1,0x4
srl $t1,$t1,2
sw $t1, 0($t0)
jr $ra
我认为两个代码的工作原理相同,你们认为呢?
答案 0 :(得分:0)
$v0
和$t1
都是受呼叫限制的通用整数寄存器。它们不是“不同类型”。
但是在标准MIPS调用约定中,调用者期望$v0
(有时是$v1
)查找整数返回值。这就是get_status
在$v0
中计算结果的原因。
我认为两个代码的工作原理相同,你们认为呢?
您的代码修改了它从中加载的静态存储!!!不再是get_status
。
它是具有非标准调用约定的void update_status(void)
或int update_status(void)
(返回$t1
)。
效率低下:
lui ...
ori $t0, $t0, 0x0020
lw $v0,0($t0)
使用lw
的立即偏移量来保存静态地址的低16位。 (它的符号是扩展的,而ori
的立即数是零扩展的,但是在这种情况下,您不需要调整lui
,因为偏移量是正号。)
lui ...
lw $v0, 0x0020($t0)