# Le programme principal
read # lecture de l'argument (dans r 1)
jmp fact, ra # calcul de la factorielle
write # écriture du résultat (r 1)
stop
# La fonction factorielle(N)
# L'argument N est dans r 1. Le résultat est mis dans r 1.
fact: braz r 1, fact_0 # N = 0 ?
sub sp, 8, sp # réserve deux places dans la pile
store sp, 0, ra # sauvegarde de l'adresse de retour
store sp, 4, r 1 # et de la valeur de N
sub r 1, 1, r 1
jmp fact, ra # appel récursif sur N-1
load sp, 4, r 2 # récupération de la valeur de N
mult r 1, r 2, r 1 # calcul de N * fact(N-1)
load sp, 0, ra # récupération de l'adresse de retour
add sp, 8, sp # et de la place en pile
jmp ra, r 0 # retour à l'appelant
fact_0: add r 0, 1, r 1 # mettre 1 dans r1
jmp ra, r 0 # retour à l'appelant |
|