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