C语言中的斐波那契计算器,编译成mips,导致无限循环

C语言中的斐波那契计算器,编译成mips,导致无限循环,mips,fibonacci,Mips,Fibonacci,我正在尝试将斐波那契c代码转换为MIPS汇编代码,但是,当我将MIPS代码运行到我的MIPS模拟器时,它似乎并没有结束 C代码: intfibo(intn) { 如果(n这里有几个问题 首先,您的main函数缺少其终止jr$ra,这意味着main在执行后落入fibo 其次,在您的if语句中,返回1,直接调用jr$ra,这意味着堆栈未被存储。我将此替换为调用j EXIT 最后,在else的末尾,将f(n-1)和f(n-2)添加到$s1中。此寄存器应为$v0,因为您打算返回此结果 固定代码如下: m

我正在尝试将斐波那契c代码转换为MIPS汇编代码,但是,当我将MIPS代码运行到我的MIPS模拟器时,它似乎并没有结束

C代码:

intfibo(intn)
{
如果(n这里有几个问题

首先,您的
main
函数缺少其终止
jr$ra
,这意味着
main
在执行后落入
fibo

其次,在您的
if
语句中,返回
1
,直接调用
jr$ra
,这意味着堆栈未被存储。我将此替换为调用
j EXIT

最后,在else的末尾,将
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 

除了Konrad()的答案之外,我注意到您的算法中有一个错误。如果n这里是我的代码,但它是用RISC-V编写的

.text

#x5 me n hai
#x7 me output
li x5 7
li x6 2
jal x1 FIB
j EXIT

FIB:
    bge x5 x6 REC 
    addi x7 x5 0
    jalr x0 0(x1)
    #Handled Base Case

REC:
    # Handling Rec. Case

    addi sp sp -12
    sw x1 0(sp)
    sw x5 4(sp)

    addi x5 x5 -1
    jal x1 FIB


    sw x7 8(sp)
    lw x5 4(sp)
    addi x5 x5 -2
    jal x1 FIB 

    lw x13 8(sp)
    add x7 x13 x7


    lw x1 0(sp)
    addi sp sp 12
    jalr x0 0(x1)

EXIT:

在模拟器中逐步执行
fibo
例程,查看哪里开始出错。
addi $v0, $zero, 1
add $v0, $zero, $a0
.text

#x5 me n hai
#x7 me output
li x5 7
li x6 2
jal x1 FIB
j EXIT

FIB:
    bge x5 x6 REC 
    addi x7 x5 0
    jalr x0 0(x1)
    #Handled Base Case

REC:
    # Handling Rec. Case

    addi sp sp -12
    sw x1 0(sp)
    sw x5 4(sp)

    addi x5 x5 -1
    jal x1 FIB


    sw x7 8(sp)
    lw x5 4(sp)
    addi x5 x5 -2
    jal x1 FIB 

    lw x13 8(sp)
    add x7 x13 x7


    lw x1 0(sp)
    addi sp sp 12
    jalr x0 0(x1)

EXIT: