# programma per il calcolo ricorsivo di n! 

	 .data
prompt: 	.asciiz "Inserire un numero intero:"
output: 	.ascii  "Fattoriale:"

	 .text
	 .globl main

main:
# Lettura dell’intero di cui si calcola il fattoriale
    li $v0, 4 	  	# $v0 codice della print_string
    la $a0, prompt  	# $a0 indirizzo della stringa
    syscall         	# stampa della stringa
		
    li $v0, 5 	  	# $v0 codice della read_int
    syscall         	# legge l’intero n e lo carica in $v0

# Calcolo del fattoriale     
  move $a0, $v0		# $a0 n
  jal  fact			# chiama fact(n)
  move $s0, $v0		# $s0 n!
    
# Stampa del risultato
    li $v0, 4		# $v0 codice della print_string
    la $a0, output	# $a0 indirizzo della stringa
    syscall			# stampa della stringa di output

    move $a0, $s0		# $a0 n!
    li $v0, 1		# $v0 codice della print_int
    syscall			# stampa n!

# Termine del programma    
    li $v0, 10 		# $v0 codice della exit
    syscall			# esce dal programma

    
fact:
    addi $sp, $sp,-8  		# alloca stack
    sw   $ra, 4($sp)		# salvo return address
    sw   $a0, 0($sp)		# salvo l’argomento n

    bgt  $a0, $zero, core	# se n > 0 salta a core
    li   $v0, 1			# $v0  1
    j    end

core:
    addi $a0, $a0,-1		# decremento n -> (n-1)
    jal  fact			# chiama fact(n-1)
    lw   $a0, 0($sp)		# ripristino n in $v1
    mul  $v0, $v0, $a0		# ritorno n * fact (n-1)

end:
    lw   $ra, 4($sp)		# ripristino return address
    addi $sp, $sp, 8		# dealloca stack
    jr   $ra			# ritorno al chiamante

