# main chiama procedura1 che chiama procedura2 .data # Data segment msg1: .asciiz "Esecuzione Main...\n" msg2: .asciiz "Esecuzione Proc1...\n" msg3: .asciiz "Esecuzione Proc2...\n" msg4: .asciiz "Fine Proc2.\n" msg5: .asciiz "Fine Proc1.\n" msg6: .asciiz "Fine Main.\n" .text main: # Codice del main li $v0, 4 # Stampa stringa la $a0, msg1 #Parametro della procedura di stampa (msg1) syscall #anche main e' una procedura chiamata, che al termine dovra' fare jr $ra al chiamante addi $sp, $sp, -4 #faccio spazio per salvare $ra, spostando $sp verso il basso sw $ra, 0($sp) #salvo $ra prima di jal nello spazio allocato jal procedura1 RIENTRODAPROCEDURA1: #etichetta del punto di rientro da procedura1 li $v0, 4 # Stampa stringa la $a0, msg6 #Parametro della procedura di stampa (msg6) syscall lw $ra, 0($sp) #ripristino $ra prima di jr $ra addi $sp, $sp, 4 #riposiziono puntatore a stack pointer jr $ra # salta a istruzione cui indirizzo e' in registro $ra # chiusura programma main li $v0, 10 syscall procedura1: # Codice della procedura procedura1 addi $sp, $sp, -4 # Faccio spazio nello stack (spostando $sp verso il basso) sw $ra, 0($sp) # e ci salvo $ra, cioe' salvo il punto di rientro chiamante li $v0, 4 # Stampa msg2 la $a0, msg2 syscall jal procedura2 # Salto a proc2 e in $ra etichetta RIENTRODAPROCEDURA2 RIENTRODAPROCEDURA2: li $v0, 4 # Stampa msg5 la $a0, msg5 syscall lw $ra, 0($sp) # Recupera il valore corretto di $ra dallo stack addi $sp, $sp, 4 # libera spazio allocato nello stack jr $ra # salta a istruzione cui indirizzo e' in $ra procedura2: # Codice della procedura procedura2 (foglia) li $v0, 4 # Stampa msg3 la $a0, msg3 syscall li $v0, 4 # Stampa msg4 la $a0, msg4 syscall jr $ra # Restituisce il controllo al chiamante