#Esempio di procedura che riceve come parametri due numeri, ne fa la somma e restituisce il risultato. .data num1: .word 50 #dichiarazione di uno spazio di memoria della dimensione di una word, inizializzato con valore 50 num2: .word 14 result1: .word 0 num3: .word 50 num4: .word -66 result2: .word 0 .globl main #dichiarazione dell'etichetta main come global, sara' quindi visibile anche al di fuori del file in cui e' dichiarata .text main: #prima chiamata della procedura somma1 lw $a0, num1 #passaggio del primo parametro #ATTENZIONE: questo e' un passaggio parametri PER VALORE ("by value"). In $a0 viene messo il VALORE del parametro num1 lw $a1, num2 #passaggio del secondo parametro addi $sp, $sp, -4 #decremento, spostamento verso il basso, dello stack pointer sw $ra, 0($sp) #salvataggio di $ra sullo stack jal somma1 #come effetto di jal, l'indirizzo della istruzione successiva (valore corrente di PC) viene salvato in $ra e in PC viene scritto l'indirizzo dell'etichetta somma1 lw $ra, 0($sp) #recupero $ra dallo stack in modo che abbia il valore di PC salvato prima del passaggio all'esecuzione della procedura addi $sp, $sp, 4 #incremento, spostamento verso l'alto, dello stack pointer sw $v0, result1 #memorizzazione del primo risultato della procedura #seconda chiamata della procedura somma1 lw $a0, num3 #passaggio del primo parametro lw $a1, num4 #passaggio del secondo parametro addi $sp, $sp, -4 sw $ra, 0($sp) jal somma1 lw $ra, 0($sp) addi $sp, $sp, 4 sw $v0, result2 jr $ra #Terminazione del programma #ATTENZIONE: e' importante inserire la chiamata alla syscall di terminazione, ovvero restituire il controllo con jr $ra alla parte di codice (in questo caso del sistema operativo) che ha invocato l'esecuzione del programma #Procedura somma1: si tratta di una procedura foglia, cioe' che non chiama a sua volta un'altra procedura. Non sara' quindi necessario salvare $ra al suo interno. somma1: #questo e' l'indirizzo iniziale della procedura move $t0, $a0 #copia dei parametri della procedura (in questo $a0 e $a1) in registri temporanei usati localmente dalla procedura move $t1, $a1 #non e' indispensabile in casi semplici come questo, ma e' una buona farlo sempre! ovvero una buona REGOLA PROGRAMMATIVA add $v0, $t0, $t1 jr $ra #terminazione della procedura con aggiornamento del PC con l'indirizzo scritto nel registro $ra, ovvero l'indirizzo dell'istruzione successiva alla jal con cui si e' richiesta l'esecuzione della procedura