嗨伙计们,我正在尝试将我的斐波那契c代码转换为MIPS汇编代码,但是,当我将MIPS代码运行到我的MIPS模拟器时,它似乎并没有结束.
C代码:
int fibo(int n)
{
if(n<2) return 1;
else f(n-1)+f(n-2);
}
int main()
{
fibo(5);
}
Run Code Online (Sandbox Code Playgroud)
汇编代码:
main: addi $sp, $sp, -4
sw $ra, 0($sp)
addi $a0, $zero, 5
jal fibo;
lw $ra, 0($sp)
addi $sp, $sp, 4
fibo: addi $sp, $sp, -12
sw $s0, 0($sp)
sw $s1, 4($sp)
sw $ra, 8($sp)
slti $t0, $a0, 2
beq $t0, $zero, ELSE
addi $v0, $zero, 1
jr $ra
ELSE: addi $s0, $a0, 0
addi $a0, $a0, -1
jal fibo;
addi $s1, $v0, 0
addi $a0, $s0, -2
jal fibo
add $s1, $s1, $v0
j EXIT
EXIT: lw $s0, 0($sp)
lw $s1, 4($sp)
lw $ra, 8($sp)
addi $sp, $sp, 12
jr $ra
Run Code Online (Sandbox Code Playgroud)
这里有几个问题.
首先,你的main功能缺少它的终止jr $ra,这意味着在执行之后就会main陷入fibo困境.
其次,在你的if陈述中,你返回的地方1,你jr $ra直接打电话,这意味着堆栈没有恢复.我打电话给我j EXIT.
最后,在你的其他结束时,你添加f(n-1)并f(n-2)进入$s1.该寄存器应该$v0与您打算返回此结果一样.
修复后的代码如下:
main:
addi $sp, $sp, -4
sw $ra, 0($sp)
addi $a0, $zero, 5
jal fibo
move $a0 $v0
li $v0 1
syscall
lw $ra, 0($sp)
addi $sp, $sp, 4
jr $ra
fibo:
addi $sp, $sp, -12
sw $s0, 0($sp)
sw $s1, 4($sp)
sw $ra, 8($sp)
slti $t0, $a0, 2
beq $t0, $zero, ELSE
addi $v0, $zero, 1
j EXIT
ELSE:
addi $s0, $a0, 0
addi $a0, $a0, -1
jal fibo
addi $s1, $v0, 0
addi $a0, $s0, -2
jal fibo
add $v0, $s1, $v0
EXIT:
lw $s0, 0($sp)
lw $s1, 4($sp)
lw $ra, 8($sp)
addi $sp, $sp, 12
jr $ra
Run Code Online (Sandbox Code Playgroud)