Advertisement
Jobjob

Lucas MIPS

May 25th, 2013
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.27 KB | None | 0 0
  1. #
  2. # La suite de Lucas est definie recursivement comme :
  3. #
  4. # Lucas(0) = 1
  5. # Lucas(1) = 3
  6. # ...
  7. # Lucas(n) = Lucas(n-1) + Lucas(n-2)
  8. #
  9.  
  10. main:
  11. addiu $sp, $sp, -4 # deplacement du pointeur de pile -4
  12. sw $ra, 0($sp) # stockage de l'adresse de retour dans la pile
  13.  
  14. li $a0, 3 # le registre $a0 est utilise pour le passage en parametre
  15.  
  16. jal lucas # appel de lucas
  17.  
  18. lw $ra, 0($sp) # chargement de l'adresse de retour
  19. addiu $sp, $sp, 4 # deplacement du pointeur de pile a sa position initial
  20.  
  21. jr $ra
  22.  
  23. lucas:
  24. li $v0, 1
  25. bgtz $a0, is_one # on regarde si $a0 > 0, si c'est le cas on test le second cas de base en branchant à is_one
  26. jr $ra # sinon c'est fini car lucas(0) == 1
  27.  
  28. is_one:
  29. li $v0, 3
  30. li $t0, 1 # on charge la valeur 1 dans le registre $t0 afin de faire une comparaison avec $a0
  31. bne $t0, $a0, lucas_gen # si $a0 == $t0 alors $a0 == 1 donc nous somme dans le second cas de base (lucas(1) == 3) donc c'est fini
  32. jr $ra # sinon on branche a lucas_gen car nous ne somme dans aucun des cas de base
  33.  
  34. lucas_gen:
  35. addiu $sp, $sp, -12 # deplacement du pointeur de pile de -12
  36. sw $ra, 0($sp) # on enregistre l'adresse de retour dans la pile avec un offset de 0
  37. sw $a0, 4($sp) # on enregistre la valeur de $a0 dans la pile avec un offset de 4
  38.  
  39. addiu $a0, $a0, -1 # on calcul la valeur pour l'appel récursif 1 lucas($a0-1)
  40. jal lucas # appel recursif 1
  41.  
  42. sw $v0, 8($sp) # on sauve la valeur de retour du premier appel avec un offset de 8
  43.  
  44. lw $a0, 4($sp) # on charge la valeur de $a0 avant le premier appel
  45. addiu $a0, $a0, -2 # on calcul la valeur pour l'appel recursif 2 lucas($a0 -2)
  46. jal lucas # appel recursif 2
  47.  
  48. lw $t1, 8($sp) # on charge la valeur de retour de l'appel rec. 1 dans $t1
  49. add $v0, $v0, $t1 # on additionne $v0 (valeur de l'appel rec 2) et $t1 (valeur de l'appel rec. 1) et on sauve le resultat dans $v0
  50.  
  51. lw $ra, 0($sp) # on charge l'adresse de retour depuis la pile (offset 0)
  52. addiu $sp, $sp, 12 # on replace le pointeur de pile a sa position initial
  53.  
  54. jr $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement