Calcolatori Elettronici Il linguaggio assemblativo MIPS (4) Le function (2) Gestione dei sottoprogrammi $a0 - $a3 - $v1 $ra : 4 registri argomento per il passaggio dei parametri : due registri per la restituzione dei valori : un registro di ritorno per tornare al punto di origine jal etichetta_function : istruzione che salta all etichetta specificata e salva in $ra l indirizzo di ritorno jr $ra : istruzione che permette il ritorno al punto di origine (salta all indirizzo contenuto in $ra) Calcolatori Elettronici - MIPS(5) - Slide 2 L. Tarantino - a.a. 2004/2005 1
Esempio main() $a0,$a1 int a,b,c,d; a = molt(b,c); int molt (int op1, int op2) int prod; prod = 0; while (op2!= 0) prod = prod + op1; op2 = op2-1; return prod; Ipotesi: op2 > 0 Var Registro a $s0 b $s1 c $s2 Nel programma chiamante: La function: add $a0,$s1,$zero add $a1,$s2,$zero jal molt add $s0,,$zero molt: add,$zero,$zero loop: beq $a1,$zero,exit add,,$a0 addi $a1,$a1,-1 j loop exit: jr $ra Calcolatori Elettronici - MIPS(5) - Slide 3 L. Tarantino - a.a. 2004/2005 I registri temporanei (1) int esempio (int g, int h, int f; f = (g + h) - (i + j); $t0,$t1 Si assume che i registri temporanei siano a disposizione del programma chiamato. E compito del chiamante salvarne i valori se vuole che siano preservati vedremo dove Calcolatori Elettronici - MIPS(5) - Slide 4 L. Tarantino - a.a. 2004/2005 2
I registri temporanei (2) int esempio (int g, int h, int f; f = (g + h) - (i + j); $t0,$t1 La function: esempio: add $t0,$a0,$a1 add $t1,$a2,$a3 sub,$t0,$t1 jr $ra Calcolatori Elettronici - MIPS(5) - Slide 5 L. Tarantino - a.a. 2004/2005 Il salvataggio dei registri temporanei Necessario quando il programma chiamante non vuole perdere il contenuto di qualche registro temporaneo E buona norma di programmazione ricordarsi di salvare tutti i registri che non si vogliono perdere e non solo quelli usati dal programma chiamato (potremmo non conoscerlo nei dettagli) Viene usata un area di memoria che può crescere su richiesta del programma (struttura dinamica) Al ritorno al programma chiamante bisogna ripristinare il valore dei registri recuperandoli da tale struttura dinamica Si può utilizzare il protocollo last-in-first-out (lifo), cioè una struttura a pila (stack) Calcolatori Elettronici - MIPS(5) - Slide 6 L. Tarantino - a.a. 2004/2005 3
Lo stack Il puntatore alla cima dello stack (stack pointer ) è in un registro: $sp Lo stack cresce da indirizzi di memoria alti verso indirizzi di memoria più bassi ($sp diminuisce), diminuisce da indirizzi bassi verso indirizzi più alti ($sp aumenta) Memoria $sp $sp Stack vuoto Lo stack cresce $sp Lo stack diminuisce Calcolatori Elettronici - MIPS(5) - Slide 7 L. Tarantino - a.a. 2004/2005 Esempio (1) - La function main() int a,b,c,d,e; a = esempio(b,c,d,e); int esempio (int g, int h, int f; f = (g + h) - (i + j); $t0,$t1 Var Registro a $s0 b $s1 c $s2 d $s3 e $s4 La function: esempio: add $t0,$a0,$a1 add $t1,$a2,$a3 sub,$t0,$t1 jr $ra Calcolatori Elettronici - MIPS(5) - Slide 8 L. Tarantino - a.a. 2004/2005 4
Esempio (2) - Nel programma chiamante main() int a,b,c,d,e; a = esempio(b,c,d,e); Supponiamo di non voler perdere $t0 Var Registro a $s0 b $s1 c $s2 d $s3 e $s4 addi $sp,$sp,-4 # aggiornamento di $sp per far spazio # a un elemento (4 byte) sw $t0,0($sp) # salvataggio di $t0 nello stack add $a0,$s1,$zero # passaggio primo parametro # gli altri sono analoghi jal esempio # salto al sottoprogramma add $s0,,$zero # recupero il valore restituito in lw $t0,0($sp) # recupero il valore di $t0 dallo stack addi $sp,$sp,4 # aggiornamento di $sp per eliminare # un elemento (4 byte) Calcolatori Elettronici - MIPS(5) - Slide 9 L. Tarantino - a.a. 2004/2005 Esempio (3) - Nel programma chiamante Supponiamo di non voler perdere $t0 e $t1 addi $sp,$sp,-8 # aggiornamento di $sp per far spazio # a due elementi (8 byte) sw $t0,4($sp) # salvataggio di $t0 nello stack sw $t1,0($sp) # salvataggio di $t1 nello stack add $a0,$s1,$zero # passaggio primo parametro # gli altri sono analoghi jal esempio # salto al sottoprogramma add $s0,,$zero # recupero il valore restituito in lw $t1,0($sp) # recupero il valore di $t1 dallo stack lw $t0,4($sp) # recupero il valore di $t0 dallo stack addi $sp,$sp,8 # aggiornamento di $sp per eliminare # due elementi (8 byte) Notare l ordine: l ultimo a entrare è il primo a uscire Calcolatori Elettronici - MIPS(5) - Slide 10 L. Tarantino - a.a. 2004/2005 5
Generalizzando elementi del codice da specificare Nel programma chiamante (gestione della chiamata) addi $sp,$sp,-4*n # aggiornamento di $sp per far spazio # a n elementi (4*n byte) sw $t0, 4*(n-1)($sp) #... # salvataggi registri nello stack sw $t1,0($sp) # add $a0,$s_,$zero # passaggi parametri... # gli altri sono analoghi jal etichetta # salto al sottoprogramma add $s_,,$zero # recupero valore restituito in lw $t0, 0($sp) #... # ripristino registri dallo stack lw $t0, 4*(n-1)($sp) # addi $sp,$sp, 4*n # aggiornamento di $sp per eliminare # n elementi (4*n byte) Calcolatori Elettronici - MIPS(5) - Slide 11 L. Tarantino - a.a. 2004/2005 Esercizio (1) Compilare la seguente chiamata a function ipotizzando di non voler perdere il valore dei registri $t0, $t1 e $t3 Si noti che non è necessario conoscere il corpo della function Var Registro a $s0 b $s1 c $s2 main() int a,b,c,d,e; a = esempio(b,c); $a0,$a1 Calcolatori Elettronici - MIPS(5) - Slide 12 L. Tarantino - a.a. 2004/2005 6
I registri salvati ($s_ ) int esempio (int g, int h, int f; int k; k = g + h f = k - (i + j); $t1 $s0 secondo la convenzione che le variabili vadano nei registri $sx Si assume che i registri salvati rimangano inalterati (cioè al ritorno al programma chiamante il valore è lo stesso che avevano prima della chiamata) E compito del chiamato salvarne i valori se vuole che siano preservati nello stack! Calcolatori Elettronici - MIPS(5) - Slide 14 L. Tarantino - a.a. 2004/2005 Il salvataggio dei registri salvati Necessario quando il programma chiamato vuole usare qualche registro salvato (non bisogna perderne il contenuto) Occorre salvare tutti i registri che vengono usati Anche in questo caso viene usato lo stack Prima di ritornare al programma chiamante bisogna ripristinare il valore dei registri recuperandoli dallo stack Calcolatori Elettronici - MIPS(5) - Slide 15 L. Tarantino - a.a. 2004/2005 7
Esempio La function: int esempio (int g, int h, int f; int k; $s0 k = (g + h) f = k - (i + j); $t1 esempio: addi $sp,$sp,-4 # aggiornamento di $sp per far spazio # a un elemento (4 byte) sw $s0,0($sp) # salvataggio di $s0 nello stack add $s0,$a0,$a1 # k = g + h add $t1,$a2,$a3 # $t1 = i + j sub,$s0,$t1 # f = k - (i + j) lw $s0,0($sp) # recupero il valore di $s0 dallo stack addi $sp,$sp,4 # aggiornamento di $sp per eliminare # un elemento (4 byte) jr $ra # ritorno al programma chiamante Calcolatori Elettronici - MIPS(5) - Slide 16 L. Tarantino - a.a. 2004/2005 Generalizzando Nel programma chiamato addi $sp,$sp,-4*n elementi del codice da specificare # aggiornamento di $sp per far spazio # a n elementi (4*n byte) sw $s0, 4*(n-1)($sp) #... # salvataggi registri nello stack sw $s1,0($sp) #... #... # corpo della subroutine... # lw $s1, 0($sp) #... # ripristino registri dallo stack lw $s0, 4*(n-1)($sp) # addi $sp,$sp, 4*n # aggiornamento di $sp per eliminare # n elementi (4*n byte) Calcolatori Elettronici - MIPS(5) - Slide 17 L. Tarantino - a.a. 2004/2005 8
Esercizio (1) Compilare la seguente function: int esercizio (int g, int h, int f; int k1; int k2; $s0,$s1 k1 = g + h; k2 = i - j; f = k1 - k2; Calcolatori Elettronici - MIPS(5) - Slide 18 L. Tarantino - a.a. 2004/2005 Identificatori numerici dei registri $zero 0 costante zero 1 da definire - $v1 2-3 restituzione dei valori $a0 - $a3 4-7 parametri $t0 - $t7 8-15 variabili temporanee $s0 - $s7 16-23 variabili salvate $t8 - $t9 24-25 altre variabili temporanee 26-28 da definire $sp 29 stack pointer 30 da definire $ra 31 indirizzo di ritorno Calcolatori Elettronici - MIPS(5) - Slide 20 L. Tarantino - a.a. 2004/2005 9
Esercizio (1) Determinare i registri ($s_,$t_,$a_,$v_) necessari alla compilazione delle seguenti linee di codice e determinare i necessari salvataggi sullo stack k = A[i] - (g + k); g = molt(k,5): B[i] = g + 10; Calcolatori Elettronici - MIPS(5) - Slide 21 L. Tarantino - a.a. 2004/2005 10