我有一个C代码如下:
int fibonacci(int n){
int a, b, c;
int i;
a = 1;
b = 1;
c = 2;
if(n == 1) return 1;
else if(n == 2) return 1;
else if(n == 3) return 2;
for(i = 3; i < n; i++){
a = b;
b = c;
c = a + b;
}
return c;
}
我像这样编译这段代码。
addi $sp, $sp, -32
sw $t0, 28($sp)
sw $t1, 24($sp)
sw $t2, 20($sp)
sw $t3, 16($sp)
li $t0, 1
li $t1, 1
li $t2, 2
li $t3, 3
move $t4, $a0
beq $a0, 1, FIRSTL
beq $a0, 1, SECONDL
beq $a0, 2, THIRDL
FIRSTL:
li $v0, 1
j FOR
SECONDL:
li $v0, 1
j FOR
THIRDL:
li $v0, 2
j FOR
FOR:
beq $t3, $a0, ENDL
addi $t1, $t1, 1
j FOR
move $s0, $s1
move $s1, $s2
add $s2, $s1, $s0
ENDL:
lw $t1, 16($sp)
lw $s2, 20($sp)
lw $s1, 24($sp)
lw $s0, 28($sp)
addi $sp, $sp, -32
add $v1, $0, $s2
它只显示了第0个斐波那契,其他的斐波那契从未发生过。 我的Mips代码出了什么问题?我很困惑。
答案 0 :(得分:1)
在实际执行斐波那契计算的2x j FOR
和move
指令之前,您有add $s2, $s1, $s0
。
因此,asm循环中的逻辑与此C匹配:
do{ // FOR:
if (i == n) break; // beq
i++; // add 1
}while(true); // j FOR
a = b;
b = c;
c = a + b;
ENDL:
// restore some registers that you didn't need to save/restore, just clobber $t regs.
// missing jr $ra to actually return
将工作放入循环中。