Chiamate a Procedure. Per lesecuzione di una procedura, un programma deve eseguire i seguenti sei...
-
Upload
gabriele-foti -
Category
Documents
-
view
213 -
download
0
Transcript of Chiamate a Procedure. Per lesecuzione di una procedura, un programma deve eseguire i seguenti sei...
Chiamate a Procedure
Per l’esecuzione di una procedura, un programma deve eseguire i seguenti sei passi:
mettere i parametri in un posto dove la procedura possa recuperarli
trasferire il controllo alla procedura allocare le risorse (di memorizzazione dei dati)
necessarie alla procedura effettuare la computazione della procedura mettere i risultati in un posto accessibile al
chiamante restituire il controllo al chiamante
Chiamata semplice (jal) La procedura A chiama la procedura B. La procedura B non chiama nessun altra
procedura
A:....jal B…
B:....jr $ra
0x00400032
$ra=0x00400032
• $ra -> registro di ritorno per tornare al punto di origine
Chiamata con passaggio parametri
La procedura A chiama la procedura B passandogli 3 parametri
La procedura B esegue la somma dei tre parametri, restituisce il risultato ad A e non chiama nessun altra procedura
$ra -> contiene l’indirizzo di ritorno $a0 - $a3 -> quattro registri argomento
per il passaggio dei parametri $v0 - $v1 -> due registri valore per la
restituzione dei valori
Esempio .text __start: Li $s0, 2 Li $s1, 3 Li $s2, 4 move $a0, $s0 move $a1, $s1 move $a2, $s2 jal somma Move $s3, $v0
Somma: add $t0, $a0,
$a1 Add $t0, $t0,
$a2 Move $v0, $t0 Jr $ra
Convenzione utilizzo dei registri Vedere appendice A -> $t0 (temporanei)
il cui contenuto può essere modificato durante la chiamata ad altre procedure
-> $s0 il cui contenuto non deve essere
modificato durante la chiamata ad altre procedure
-> $ra
Utilizzo dello stack lo stack cresce verso gli indirizzi di memoria
inferiori Il registro stack pointer $sp ($29) punta
all'indirizzo dell'ultima parola in stack gli elementi in stack sono raggiunti mediante
indirizzi composti dallo stack pointer e da un offset positivo
Es. lw $t0 4($sp) Tutto lo spazio in stack di cui ha bisogno una
subroutine deve essere esplicitamente allocato in una sola volta
deve essere multiplo di due parole
Lo spazio nello stack viene allocato sottraendo allo stack pointer la dimensione dello stack
Es. sub $sp,24 -> sono disponibili le seguenti 6 locazioni. 0($sp) 4($sp) 8($sp) 12($sp) 16($sp) 20($sp)
Al ritorno da una subroutine il record di attivazione viene deallocato incrementando lo stack pointer della stessa quantità di cui lo si era decrementato
Gli elementi sono "pushed" nello stack mediante la loro memorizzaziore ad un offset positivo rispetto allo stack pointer
Es. sw $ra,20($sp) e vengono "popped" dallo stack leggendo dalla stessa
locazione Es. lw $ra,20($sp)
20($sp)
16($sp)
12($sp)
8($sp)
4($sp)
0($sp)
Subroutine non Foglia
Quando deve chiamare un’altra procedura, devono allocare almeno 24 bytes di spazio in stack
4 parole per i registri $a0-$a3 1 parola per l'indirizzo di ritorno una parola per mantenere l'allineamento alla doppia parola
Il record di attivazione di una subroutine contiene quindi
spazio per $a0-$a3 (per le subroutines chiamate) argomenti passati alle funzioni chiamate registri general purpose da salvarsi spazio per variabili locali allocate dalla subroutine
Esempio di uso dello stack La procedura A:
riceve 5 parametri di ingresso scalari (4 nei registri ed 1 in stack)
chiama a sua volta altre subroutines (B, C, D, E), con differente numero di parametri scalari; la chiamata con massimo numero di parametri è per una subroutine che riceve in ingresso 7 parametri scalari
ha bisogno di salvare, per il suo funzionamento interno, 4 registri floating point
ha bisogno di salvare, per il suo funzionamento interno, 5 registri general purpose
utilizza 16 parole di spazio in stack per memorizzarvi le sue (di A) variabili locali