.text

 .globl fib

fib:

     sub  $sp, $sp, 12      # Allouer le bloc d'activation

     sw   $ra, 8($sp)       # Sauvergarder l'adresse de retour

 

     lw   $t0, 12($sp)      # Chargement de N

     slt  $t0, $t0, 2       # n < 2

     beq  $t0, $zero, fibgt

 

fiblt:

     lw   $t0, 12($sp)      # return N

     j fibend

 

fibgt:

     lw   $t0, 12($sp)      # Chargement de N

     sub  $t0, $t0, 1       # N-1

     sub  $sp, $sp, 4       # Push N-1

     sw   $t0, ($sp)

     jal  fib               # Appel de fib

     add  $sp, $sp, 4

     sw   $v0, 4($sp)       # temp1 <-- fib(n-1)

 

     lw   $t0, 12($sp)      # Chargement de N

     sub  $t0, $t0, 2       # N-2

     sub  $sp, $sp, 4       # Push N-2

     sw   $t0, ($sp)     

     jal  fib               # Appel de fib

     add  $sp, $sp, 4

     sw   $v0, 0($sp)       # temp2 <-- fib(n-2)

 

     lw   $t0, 0($sp)       # Chargement de temp2

     lw   $t0, 4($sp)       # Chargement de temp1

     add  $t0, $t0, $t1     # return temp1 + temp2

 

fibend:

     add  $v0, $t0, $zero   # Deplacer le resultat dans v0

     lw   $ra, 8($sp)       # Chargement de l'adresse de retour

     add  $sp, $sp, 12      # Liberer le bloc d'activation

 

     jr   $ra               # Retour a l'appelant

 

 

 

 

   .text

   .globl main

main:

     sub  $sp, $sp, 4       # Allouer le bloc d'activation

     sw   $ra, ($sp)        # Sauvergarder l'adresse de retour

 

     add  $t0, $zero, 2

     sub  $sp, $sp, 4       # Push 2

     sw   $t0, ($sp)      

     jal  fib               # Appel de fib

     add  $sp, $sp, 4       # Liberer les parametres

 

     add  $v0, $zero, $zero # Valeur de retour

     lw   $ra, ($sp)        # Chargement de l'adresse de retour

     add  $sp, $sp, 4       # Liberer le bloc d'activation

     jr   $ra               # Retour a l'appelant