C语言到MIPS。斐波那契数

时间:2015-10-08 07:28:19

标签: c assembly mips cpu cpu-registers

我试图将这段代码转换为MIPS指令。让我们说a是$ a0,b是$ a1,n是$ a2,结果是$ v0,并结束 程序,调用“jr $ ra”返回子程序调用程序

int fib_iter(int a, int b, int n) {
 if (n == 0)
     return b;
 else
     return fib_iter(a+b, a, n-1); 

为简单起见,我们忽略了这一帧的堆栈帧 这是我转换的MIPS代码:

bne $a1, $zero, ELISEIF // if b != 0 go to ELSEIF
lw $v0, $0($a1) // load b to result if n == 0
j DONE // done
ELSEIF:
lw $at, $0($a0) // temp = a
add $a0, $a0, $a1 // a = a + b
add $a1, $zero, $zero // clear b
lw $a1, $0($at) // b = a
sub $a2, $a2, $1 // n = n - 1
jr $ra // call the subroutine caller
Done:
what to put??

请指出我的错误(因为我是新手,可能会有很多错误)

感谢您抽出时间帮助我,感谢

1 个答案:

答案 0 :(得分:4)

lw $v0 $0($a1)$v0 = $a1[0]代替$v0 = $a1。要执行后者,请使用mv $v0 $a1

同样$at保留给MIPS中的pseudoinstructions。我的意思是他们被伪指令修改了。所以,除非你确定没有使用任何伪指令,否则不要使用它。 $t1 to $t7是临时登记册。使用其中任何一个。

这是正确的代码

FIB:
    bne $a2, $zero, ELSE // if n != 0 go to ELSE
    mv $v0, $a1 // load b to result if n == 0
    jr $ra // end of recursion, so call the subroutine caller
ELSE:
    mv $t0, $a0 // temp = a
    add $a0, $a0, $a1 // a = a + b
    mv $a1, $t0 // b = a
    addi $a2, $a2, -1 // n = n - 1
    j FIB // call FIB recursively