[英]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
都是调用破坏的通用整数寄存器。 他们不是“不同类型”。
但是在标准的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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.