	.text
	.globl main
main:	
	subu	$sp, $sp, 32	# Bloc de pile = 32 octets
	sw	$ra, 20($sp)	# Sauver adresse de retour
	sw	$fp, 16($sp)	# Sauver ancien pointeur de bloc
	addu	$fp, $sp, 32	# Définir le pointeur de bloc

	li	$a0, 5		# Place l'argument (5) dans a0
	jal	fact		# Appel de la fonction factorielle

	la	$a0, LC		# Place la chaine de format dans $a0
	move	$a1, $v0	# place le résultat de fact dans $a1
	jal	printf		# appel fonction d'impression

	lw	$ra, 20($sp)	# restitue adresse de retour
	lw	$fp, 16($sp)	# restitue pointeur de bloc
	addu	$sp, $sp, 32	# dépile le bloc de pile
	jr	$ra		# rend la main à l'appelant

	.data
LC:	.asciiz "La factorielle de 5 vaut "

	.text
fact:
	subu	$sp, $sp, 32	# bloc de pile = 32 octets
	sw	$ra, 20($sp)	# sauver adresse de retour
	sw	$fp, 16($sp)	# sauver pointeur de bloc
	addu	$fp, $sp, 32	# définir pointeur de bloc

	sw	$a0, 0($fp)	# sauver l'argument (n)

	lw	$v0, 0($fp)	# chargement de n
	bgtz	$v0, L2		# branchement si n > 0
	li	$v0, 1		# retourne 1 (sinon)
	j	L1		# saut vers code de retour

L2:
	lw	$v1, 0($fp)	# chargement de n
	subu	$v0, $v1, 1	# calcul de n-1
	move	$a0, $v0	# met la valeur dans $a0
	jal	fact		# appel fonction factorielle
	lw	$v1, 0($fp)	# chargement de n
	mul	$v0, $v0, $v1	# calcule fact(n-1) * n

L1:				# Le résultat est dans $v0
	lw	$ra, 20($sp)	# restitue $ra
	lw	$fp, 16($sp)	# restitue $fp
	addu	$sp, $sp, 32	# dépilement de pile
	jr	$ra		# retour à l'appelant

printf:				# les arguments sont dans $a0 et $a1
	li	$v0, 4
	syscall			# impression de la chaine deja dans $a0
	move	$a0, $a1
	li	$v0, 1
	syscall			# impression du résultat de fact
	la	$a0, RC
	li	$v0, 4
	syscall			# impression d'un retour chariot
	jr	$ra		# rend la main à main
	
	.data
RC:	.asciiz	"\n\n"
	

	
