#programma che calcola il fattoriale di un numero definito dall'etichetta di tipo word .data n: .word 5 .text .globl main main: lw $a0, n #carico il valore definito nella word nel registro a0 jal fattoriale #richiamo la funzione fattoriale move $a0, $v0 li $v0,1 #stampa i caratteri presenti in t0 syscall li $v0, 10 #comando di fine del programma syscall fattoriale: beq $a0, $0,casobase #confronto il valore del registro a0 con 0, se è così vado alla funzione casobase sub $sp,$sp,8 #sottraggo allo stack pointer lo spazio per 2 parole(una per il valore una per il puntatore) sw $ra, 0($sp) #immagazina nel registro di ritorno il valore cui punta lo stack pointer sw $a0, 4($sp) #memorizzo nel registro a0 il valore successivo a cui punta lo stack sub $a0,$a0,1 #sottraggo 1 ad a0(cioè a 4) jal fattoriale #ripeto il salto a fattoriale per vedere se devo ancora una volta eserguire l'intera funzione lw $a0, 4($sp) #carica la seconda parola dello stack pointer in a0 lw $ra, 0($sp) #carica la prima parola puntata nel registro di ritorno mul $v0,,$v0,$a0 #moltiplicare v0 per a0 add $sp,$sp,8 #restituire gli 8 bytes all puntatore a stack jr $ra #torna al return address casobase: li $v0,1 #devo solamente salvare il return address jr $ra