int fib(int n)
        {
           if (n <= 1) return 1;
           else return fib(n-1)+fib(n-2);
        }

Oplossing

        fib:    addi    $sp,$sp,-12
                sw      $ra,8($sp)              # push $ra on stack
                sw      $a0,4($sp)              # push n ($a0) on stack
                sw      $s0,0($sp)              # push $s0 on stack!
                slti    $t0,$a0,2               # $t0 = (n <= 1)
                beq     $t0,$zero,fib_else      # if (!$t0) goto fib_else
                addi    $v0,$zero,1             # return 1 (in $v0)
                addi    $sp,$sp,8               # no need to restore $ra,$a0,$s0
                jr      $ra                     # return
        fib_else:
                addi    $a0,$a0,-1              # n = n-1
                jal     fib                     # $v0 = fib(n-1)
                lw      $a0,0($sp)              # restore $a0
                addi    $a0,$a0,-2              # n = n-2
                add     $s0,$v0,$zero           # $s0 = fib(n-1)
                jal     fib                     # $v0 = fib(n-2)
                add     $v0,$v0,$s0             # return fib(n) = fib(n-1)+fib(n-2)
                lw      $s0,0($sp)              # restore $s0
                lw      $ra,8($sp)              # restore $ra; need not restore $a0
                addi    $sp,$sp,12              # restore $sp
                jr      $ra                     # return
Opmerkingen: