Advertisement
Jobjob

Factorielle MIPS

May 25th, 2013
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.66 KB | None | 0 0
  1. main:
  2. addiu $sp, $sp, -4 # on deplace le pointeur de pile de -4
  3. sw $ra, 0($sp) # on sauve l'adresse de retour dans la pile avec un offset de 0
  4. li $a0, 3 # on charge la valeur du parametre la fonction dans le registre $a0
  5. jal fact # appel de la fonction factorielle
  6. lw $ra, 0($sp) # on charge l'adresse de retour depuis la pile (offset 0)
  7. addiu $sp, $sp, 4 # on replace le pointeur de pile à sa position d'origine
  8. jr $ra
  9.  
  10. fact:
  11. li $v0, 1 # on charge la valeur 1 dans $v0
  12. bne $a0, $v0, fact_gen # on test si $a0 != $v0 i.e si $a0 != 1 car dans ce cas la on est pas dans le cas de base donc on branche à fact_gen
  13. jr $ra # si on $a0 == 1, nous sommes dans le cas de base donc puisque 1! == 1, c'est fini on branche dans le main ligne 6
  14.  
  15. fact_gen:
  16. addiu $sp, $sp, -8 # on deplace le pointeur de pile de -8
  17. sw $ra, 0($sp) # on sauve l adresse de retour dans la pile avec un offset de 0
  18. sw $a0, 4($sp) # on sauve le $a0 courant dans la pile avec un offset de 4
  19.  
  20. addiu $a0, $a0, -1 # on soustrait 1 à $a0
  21. jal fact # on effectue l'appel rec. i.e fact($a0-1)
  22.  
  23. lw $t0, 4($sp) # on charge la valeur de $a0 d avant l appel rec. (i.e la valeur de $a0 en entrant dans la fonction) dans le registre $t0 (offset 4)
  24. mul $v0, $v0, $t0 # on multiplie $v0 par $t0 et on sauve le resultat dans $v0 (i.e $v0 = $t0 * $v0 ou encore $v0 = $a0 * fibo($a0-1))
  25. lw $ra, 0($sp) # on charge l'adresse de retour depuis la pile (offset 0)
  26. addiu $sp, $sp, 8 # on replace le pointeur de pile à sa position d'origine
  27. jr $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement