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

MIPS using different register types but same solution wise

我想知道当您使用不同的寄存器时有什么不同,例如下面的代码:

这里正确答案一路使用寄存器$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

我认为这两种代码的工作原理是一样的,你们怎么看?

$v0$t1 都是 call-clobbered general-purpose 整数寄存器。他们不是 "different types".

但在标准 MIPS 调用约定中,$v0(有时 $v1)是调用者期望找到整数 return 值的地方。这就是 get_status$v0.

中计算结果的原因

I think both code works the same, what you guys think?

您的代码修改了它从中加载的静态存储!它不再是 get_status

它是 void update_status(void)int update_status(void),具有 non-standard 调用约定(return 在 $t1 中)。


这是低效的:

lui ...
ori $t0, $t0, 0x0020
lw  $v0,0($t0)

使用lw的立即偏移量space来保存静态地址的低16位。 (它是符号扩展,而 ori zero-extending 是立即数,但在这种情况下你不需要调整 lui 因为偏移量是正数。)

lui ...
lw  $v0, 0x0020($t0)