gpt4 book ai didi

c - 关于查找斐波那契数的 MIPS 代码有什么问题?

转载 作者:太空宇宙 更新时间:2023-11-04 03:23:33 27 4
gpt4 key购买 nike

我有一个 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 个 Fibonacci,而另一个 Fibonacci 从未发生过。我的 Mips 代码有什么问题?我很困惑。

最佳答案

您在 2x moveadd $s2, $s1, $s0 指令之前有 j FOR 实际实现斐波那契计算.

所以你的 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

将工作放在循环中。

关于c - 关于查找斐波那契数的 MIPS 代码有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43290402/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com