.data # le tas nl: .asciiz "\n" # la chaîne "\n" .text # la zône code .globl __start # Le programme principal __start: li $v0, 5 syscall # lecture de l'argument (dans a0) move $a0, $v0 # le résultat devient argument jal fact # calcul de la factorielle move $a0, $v0 # le résultat devient argument jal writeln # écriture du résultat j Exit # saut à la fin du programme # La fonction factorielle(N) # L'argument N est dans r 1. Le résultat est mis dans r 1. fact: ble $a0, $zero, fact_0 # N = 0 ? sub $sp, $sp, 8 # réserve deux places dans la pile sw $ra, 0($sp) # sauvegarde de l'adresse de retour sw $a0, 4($sp) # et de la valeur de N sub $a0, $a0, 1 jal fact # appel récursif sur N-1 lw $a0, 4($sp) # récupération de la valeur de N mul $v0, $v0, $a0 # calcul de N * fact(N-1) dans v0 lw $ra, 0($sp) # récupération de l'adresse de retour add $sp, $sp, 8 # et de la place en pile j $ra # retour à l'appelant fact_0: li $v0, 1 # mettre 1 dans v0 j $ra # retour à l'appelant writeln: # l'argument est dans a0 li $v0, 1 # le numéro de print_int syscall # appel système li $v0, 4 # la primitive print_string la $a0, nl # la chaîne "\n" syscall j $ra # retour à l'appelant Exit: