Salve a tutti. Sto studiando assembly MIPS all'Università ma ho dei dubbi sul passaggio di parametri e sullo stack pointer. Sapevo già che lo stack è una coda con logica LIFO e va verso il basso , quindi da indirizzi più alti ad indirizzi più bassi. Lo stack pointer dovrebbe essere l'indirizzo in cima allo stack: quindi per inserire un elemento decremento lo stack? per toglierlo incremento?

Per quanto riguarda il passaggio di parametri: con l'istruzione jal Funzione passo il controllo alla funzione chiamata (nel mio caso, somma). Per il ritorno alla funzione chiamante si usa jr $ra (che registro è ra?? ).

Qui mi perdo. Vi posto l'esercizio fatto in classe, ho commentato dove potevo ma alcune operazioni con lo stack pointer non mi sono proprio chiare.. per esempio gli indirizzi delle sw e lw, oppure quell'istruzione addi ripetuta due volte.

Qualcuno di voi può aiutarmi a capire?

codice:
.data
str1: .asciiz "Inserire primo numero: "
str2: .asciiz "Inserire secondo numero: "
strout: .asciiz "La somma è: "
.text
.globl main

main: 
li $v0, 4 # Stampa prima stringa
la $a0, str1
syscall

li $v0, 5 # Lettura primo intero
syscall

move $s0, $v0 # Memorizzo il primo intero

li $v0, 4 # Stampa seconda stringa
la $a0, str2
syscall

li $v0, 5 # Lettura secondo intero
syscall

move $s1, $v0 # Memorizzo il secondo intero

# ---- PASSAGGIO PARAMETRI ----
addi $sp, $sp, -12 # Alloca 12 byte nello stack
sw $s0, 8($sp) 
sw $s1, 4($sp)
jal somma # Trasferisce il controllo alla procedura "somma"
lw $s0, 0($sp)
addi $sp, $sp, 12 # Dealloca 12 byte dallo stack
# ---- PASSAGGIO PARAMETRI ----

li $v0, 4 # Stampa terza stringa
la $a0, strout
syscall

li $v0, 1 # Stampa il risultato
move $a0, $s0
syscall

li $v0, 10 # Fine programma
syscall

# Funziona somma
somma: 
addi $sp, $sp, -12 # Salvataggio dello stato
sw $s1, 8($sp)
sw $s0, 4($sp)
sw $ra, 0($sp)

lw $s0, 16($sp) # Prelievo parametro dallo stack
lw $s1, 20($sp)

add $s0, $s0, $s1

sw $s0, 12($sp) # Inserimento risultato nello stack
lw $ra, 0($sp) # Ripristino dello stato

lw $s0, 4($sp)
lw $s1, 8($sp)
addi $sp, $sp, 12

jr $ra # Ritorno alla funzione chiamante