########################################################### # Calcolo ricorsivo del fattoriale di un intero, N! ########################################################### .data prompt: .asciiz "Inserire un numero intero : " output: .asciiz "N! = " ########################################################### .text .globl main main: li $v0, 4 la $a0, prompt syscall li $v0, 5 syscall move $s0,$v0 #$s0 = N move $a0, $s0 #$a0 = N jal fat # chiama fat(N) move $s0, $v0 #$s0 = N! li $v0, 4 #stampa del risultato la $a0, output syscall move $a0, $s0 #$a0 = N! li $v0, 1 syscall li $v0, 10 #termine del programma syscall ########################################################### ## fat(N) - funzione RICORSIVA per il ## calcolo del fattoriale dell'intero N ## $a0 : input - l'argomento N ## $v0 : output - il risultato N! ########################################################### fat: addi $sp, $sp,-8 # alloca stack sw $ra, 4($sp) # salvo return address sw $a0, 0($sp) # salvo l’argomento N li $t1, 1 bgt $a0, $t1, ric # se N > 1 salta a ric move $v0, $t1 # ritorna 1 j esci ric: addi $a0, $a0,-1 # decremento N jal fat # chiama fat(N - 1) lw $s0, 0($sp) # $s0 = N mul $v0, $s0, $v0 # ritorno $v0 = N * fat(N - 1) esci: lw $ra, 4($sp) # ripristino return address lw $a0, 0($sp) # ripristino l’argomento N addi $sp, $sp, 8 # dealloca stack jr $ra # ritorno al chiamante ###########################################################