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


).
Rispondi quotando
