FIBO CODE TO MIPS

Hi guys, I'm trying to translate the fibonacci code to the MIPS build code, however, when I run the MIPS code on my MIPS simulator, it doesn't seem to end.

C code:

int fibo(int n)
{
    if(n<2) return 1;
    else f(n-1)+f(n-2);
}

int main()
{
    fibo(5);
}

Build Code:

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
+4
source share
2 answers

A few questions are here.

Firstly, your function maindid not have its final jr $ra, which means that it mainfailed in fiboafter execution.

Secondly, in the instruction ifwhere you return 1, you call jr $radirectly, which means that the stack is not restored. I replaced this with a challenge 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 
+3

Konrad (fooobar.com/questions/1537285/...), , . n < 2, fib n 1.

:

addi $v0, $zero, 1

add $v0, $zero, $a0
0

Source: https://habr.com/ru/post/1537285/


All Articles