MIPS使用不同的寄存器类型,但使用相同的解决方案

时间:2019-05-31 12:54:25

标签: assembly mips

我想知道当您使用不同的寄存器(例如以下代码)时有什么区别:

正确的答案始终使用寄存器$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

我认为两个代码的工作原理相同,你们认为呢?

1 个答案:

答案 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)