我想将此代码传输到MIPS
// Returns b times a, or a^b
int power(int a, int b) {
int result = 1;
for(int i=b; i>0; --i)
result*=a;
return result;
}
这些是我的尝试
power:
li $a0, 1
move $v0, $a0
loop: beq $v0, $zero, exit
mul $v0, $v0, $a0
addi $v0, $v0, -1
j loop
exit: jr $ra
虽然很接近,但您犯了一些错误。
让我们从我们所知道的开始:在条目中,参数变量a
在$a0
中,而参数变量b
在$a1
中。
您的代码会立即覆盖$a0
,因此对参数变量a
的原始值的访问将丢失。此外,该代码从不使用$a1
,因此不引用参数变量b
。(这两者都与C代码的作用形成对比。(
此函数必须在函数退出时将返回值放在$v0
中(这可以通过对result
使用$v0
来隐式完成,也可以使用另一个寄存器并在函数退出前将其复制到$v0
中。(
您的汇编指令是合理的,但寄存器的用法却不合理。
因此,从根本上讲,您需要重新审视C中逻辑变量的映射,包括:
- 参数
- 局部变量和返回值
到汇编语言中的物理存储。不要猜测——例如,使用方法论,在纸上或评论中注释哪个寄存器用于什么目的。(还要记住,一个物理存储位置不能同时容纳两个活动变量!(
对于这个函数,这些变量映射应该是直接的(这个函数不会因为进一步的函数调用或堆栈框架的其他要求而变得复杂(。
一旦有了好的映射,语句和表达式的代码就应该简单地遵循这些映射,然后它就应该是正确的。