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)
我想知道当您使用不同的寄存器时有什么不同,例如下面的代码:
这里正确答案一路使用寄存器$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)