Convenzioni per la chiamata a procedure

Documenti analoghi
Convenzioni di chiamata a procedure

Procedure annidate. Università degli Studi di Milano Corso di Laurea in Informatica, A.A Homepage del corso

Procedure SOMMARIO: DIPARTIMENTO DI INFORMATICA Laboratorio di Architetture degli Elaboratori II Turno B : ( G Z )

15 April LABORATORIO 04 PROCEDURE STACK. CHIAMATA A PROCEDURE I. Frosio

Assembly (3): le procedure

Assembly (3): le procedure

Assembly IV Le procedure

Architetture dei Calcolatori

Le procedure. L insieme delle istruzioni (4) Prima della chiamata di una procedura. Le procedure (2) Architetture dei Calcolatori (lettere A-I)

Il linguaggio assembly

Istruzioni di controllo del flusso

Gestione dei sottoprogrammi. temporaneo passaggio del controllo dal programma in esecuzione ad un sottoprogramma

Assembly MIPS: le procedure

Istruzioni di trasferimento dati

Università degli Studi di Cassino

Fetch Decode Execute Program Counter controllare esegue prossima

Università degli Studi di Cassino e del Lazio Meridionale

Architettura dei calcolatori e sistemi operativi. Sottoprogrammi e MIPS. Espressioni algebriche. Capitolo 2 P&H

Gestione dello Stack nel MIPS

Procedure annidate. Università degli studi di Milano

System calls. Università degli Studi di Milano Corso di Laurea in Informatica, A.A Homepage del corso

System calls. Università degli Studi di Milano Corso di Laurea in Informatica, A.A Homepage del corso

Controllo di flusso. Università degli Studi di Milano Corso di Laurea in Informatica, A.A Homepage del corso

Calcolatori Elettronici

Architettura degli STACK. Dott. Franco Liberati

Indirizzamento, lettura e scrittura della memoria

MIPS Instruction Set 2

Il Linguaggio Assembly: Le procedure

Allocazione dinamica della memoria

Assembler MIPS 32 Assembly II

Assembly V: Procedure annidate e recursive

Eccezioni. Università degli Studi di Milano Corso di Laurea in Informatica, A.A

Le procedure. Architetture dei Calcolatori (Lettere. Le procedure (3) Le procedure (2)

Indirizzamento, lettura e scrittura della memoria

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini

Architetture dei Calcolatori

MIPS Instruction Set 2

Invocazione di funzioni. Passaggio parametri Creazione record di attivazione (anche chiamato stack frame o area di attivazione)

Controllo di flusso. Università degli Studi di Milano Corso di Laurea in Informatica, A.A

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010.

ARCHITETTURE DEI CALCOLATORI (canale A-I) - Prima prova in itinere del 16/6/2003 Compito tipo A

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri

Le procedure ricorsive Come eseguire un programma. Architettura degli Elaboratori e delle Reti, Turno I

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri. Sottoprogrammi: richiami

System Calls, Register Spilling

Spazio di indirizzamento virtuale

Record di Attivazione

Programmi in Assembly

Architettura degli. Esercizi sullo STACK. Dott. Franco Liberati

Programmazione Assembly. RISC e CISC Esecuzione sequenziale Esecuzione condizionata Cicli Subroutine

Calcolatori Elettronici Prof. Fabio Roli. Linguaggio Assembly. Capitolo 5. Corso di Laurea di Ingegneria Elettronica

Il Linguaggio Assembly: Controllo del flusso: istruzioni e costrutti

ARM: stack e subroutine

Manualino minimale MIPS

Corso di. Stack: Procedure e variabili locali. Architetture degli Elaboratori. Uno stack anche per i calcoli. Lo stack di esecuzione

FRAMEWORK PER L'ESECUZIONE DI APPLICAZIONI ASSEMBLY SUL MODELLO VERILOG DI UN SISTEMA DI ELABORAZIONE BASATO SUL PROCESSORE emips-sc

Le etichette nei programmi. Istruzioni di branch: beq. Istruzioni di branch: bne. Istruzioni di jump: j

Processore Danilo Dessì. Architettura degli Elaboratori.

La struttura delle istruzioni elementari: il linguaggio Macchina. Sommario

Il linguaggio macchina

Procedure: esempi. Esempi: ricorsione fattoriale Fibonacci ordinamenti

Intro ai tools di MARS

Linguaggio C: le funzioni. Visibilità variabili e passaggio parametri

Lezione 20. della CPU MIPS. Prof. Federico Pedersini Dipartimento di Informatica Università degli Studi di Milano

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Esempi di Programmi Assembly. Luigi Palopoli, Luca Abeni

Gestione delle eccezioni.

Introduzione a MIPS64 (II parte)

Record di Attivazione Cenni sulla ricorsione

Corso di Architettura (Prof. Scarano) 10/05/2002

20. Gestione della memoria. Andrea Marongiu Paolo Valente

Circuiti combinatori

Lezione 20. della CPU MIPS. Prof. Federico Pedersini Dipartimento di Informatica Università degli Studi di Milano

MECCANISMI PER IL PASSAGGIO DEI PARAMETRI

Linguaggio macchina. Architettura degli Elaboratori e delle Reti. Il linguaggio macchina. Lezione 16. Proff. A. Borghese, F.

Addendum: istruzioni linguaggio macchina. Università di Bergamo - corso di Calcolatori Elettronici 1

Esercizio riassuntivo di traduzione e assemblaggio da linguaggio C ad assembly Motorola

Esercitazione di Calcolatori Elettronici Ing. Battista Biggio. Corso di Laurea in Ingegneria Elettronica. Capitolo 5 Linguaggio Assembly

Procedure e variabili locali. Corso di Architettura degli Elaboratori. Uno stack anche per i calcoli. Lo stack di esecuzione

5 April LABORATORIO 03 CONTROLLO DEL FLUSSO DI UN PROGRAMMA JUMP ADDRESS TABLE. I. Frosio

FUNZIONI: IL MODELLO A RUN-TIME!

La gestione della memoria. Gestione della memoria. Uso della Memoria RAM

ISA (Instruction Set Architecture) della CPU MIPS

Richiami: v[i] e &v[i] Organizzazione della memoria. Organizzazione della memoria. Esercitazione di Calcolatori Elettronici Ing. Gian Luca Marcialis

PROVA SCRITTA DEL MODULO DI

Ottenere una modifica del parametro attuale

Istruzioni assembler Istruzione N Registri

L ambiente di simulazione SPIM

slt $t1,$t2,$t3 if ($t2<$t3) $t1=1; Confronto tra registri slti $t1,$t2,100 if ($t2<100)$t1=1; Cfr. registro-costante

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione

Linguaggio Assembly e linguaggio macchina

Università degli Studi di Cassino

ISA (Instruction Set Architecture) della CPU MIPS32

L'architettura del processore MIPS

FUNZIONI: IL MODELLO A RUN-TIME

Transcript:

Università degli Studi di Milano Corso di Laurea in Informatica, A.A. 2017-2018 Convenzioni per la chiamata a procedure Homepage del corso Turno A Nicola Basilico Dipartimento di Informatica Via Comelico 39/41-20135 Milano (MI) Ufficio S242 nicola.basilico@unimi.it +39 02.503.16294 Turno B Jacopo Essenziale Dipartimento di Informatica Via Celoria 20-20133 Milano (MI) AISLab jacopo.essenziale@unimi.it +39 02.503.14010

Chiamata a procedura f = f + 1; int funct (int p1, int p2){ if (f == g) res = funct(f,g); else f = f - 1; } int out; out = p1 * p2; return out; Procedura chiamante (caller) Procedura chiamata (callee) Caller e callee comunicano attraverso: passaggio di parametri di input (dal caller al callee) ritorno di parametri di output (dal callee al caller)

Chiamata a procedura Le informazioni di servizio (registri callee-saved e variabili locali) di una procedura sono contenute nello stack frame: un segmento di stack associato ad ogni procedura, anche detto record di attivazione Le chiamate e i ritorni da procedura seguono un ordine LIFO: l ultima procedura invocata sarà la prima a restituire il controllo al suo chiamante Gli stack frame sono allocati sullo stack seguendo la sequenza delle chiamate (lo stack è gestito con una convenzione LIFO)

Registri caller-saved e registri callee-saved Caller-saved «salvati dal chiamante» sono i registri rispetto a cui non vige una convenzione di preservazione attraverso chiamate a procedura $t0 $t9, $a0 $a3, $v0, $v1 Un callee è libero di sovrascrivere questi registri: se un chiamante vuole essere sicuro di non perderne il valore deve salvarli sullo stack prima della chiamata a procedura Esempio: main ha un dato importante nel registro $t0, prima di invocare f salva $t0 sullo stack, una volta riacquisito il controllo lo ripristina. Callee-saved «salvati dal chiamato» sono i registri rispetto cui la convenzione esige che vengano preservati attraverso chiamate a procedura $s0 $s9, $ra, $fp un callee non può sovrascrivere questi registri: il chiamante si aspetta che restino invariati dopo la chiamata a procedura. Se il callee li vuole usare, deve prima salvarli sullo stack per poi ripristinarli una volta terminato Esempio: main ha un dato importante nel registro $s1 e invoca f; f salva $s1 sullo stack prima di utilizzarlo, una volta terminato lo ripristina.

A cura del chiamato A cura del chiamante Chiamata a procedura Le chiamate a procedura avvengono secondo questa convenzione: 1. Salvataggio dei registri caller-saved: $t0 $t9, $a0 $a3, $v0, $v1 e passaggio parametri: il chiamante alloca i parametri di input in registri a cui la procedura accederà per leggerli. 2. Deviazione del flusso di controllo al blocco di istruzioni della procedura (chiamata a procedura). 3. Allocazione dello stack frame del chiamato e salvataggio dei registri callee-saved: $s0 $s7, $fp, $ra. 4. Esecuzione della procedura. 5. Ritorno dei valori di output (se presenti), ripristino dei registri callee-saved e restituzione del controllo al chiamante (che riprenderà la sua esecuzione dall istruzione successiva alla chiamata a procedura). Nota: «chiamante» e «chiamato» scaturiscono da una distinzione concettuale di due segmenti di codice assembly funzionalmente indipendenti (potremmo anche chiamarli «moduli»). Un chiamante e un chiamato non fanno/richiedono assunzioni sulla loro interazione che vadano oltre la convenzione indicata sopra (punti 1-5).

Chiamante: Passaggio dei parametri (1) Dopo aver salvato sullo stack i registri caller-saved, il chiamante alloca i valori da passare nei registri $a0, $a1, $a2, $a3 Nel caso si debbano passare più di 4 parametri? Per il quinto parametro e i successivi bisogna usare lo stack, come? Ci sono diverse convenzioni, ad esempio MIPS specifica un meccanismo abbastanza efficiente ma intricato, mentre gcc ne utilizza uno più semplice. Noi ci ispiriamo a quello di gcc. Registri caller-saved Parametri aggiuntivi Stack frame del chiamante Stack frame del chiamato Nota: è il chiamato che deve aggiustare propriamente $fp e $sp una volta che riceve il controllo

Chiamante: Deviazione del flusso di controllo (2) Utilizzare l istruzione Jump and Link per passare alla procedura (jump) e salvare l indirizzo di ritorno (link) jal label_procedura Salto incondizionato all istruzione che sta alla label label_procedura, salva l indirizzo della prossima istruzione (PC+4) in $ra

Chiamato: Stack frame e registri callee-saved (3) Creazione dello stack frame: sottrarre allo stack pointer corrente la dimensione del frame (che dipende da ciò che la procedura necessita) $sp = $sp DIM_FRAME Salvare sullo stack i registri callee-saved (se necessario): $s0 $s7 se il chiamato necessita di sovrascriverli (il chiamante si aspetta che restino inalterati); $fp se il chiamato crea uno stack frame (sempre); $ra se il chiamato chiamerà a sua volta un altra procedura Settaggio del frame pointer: sommare allo stack pointer la dimensione del frame 4 (ricordiamo che $fp punta alla prima parola del frame) $fp = $sp + DIM_FRAME - 4 A questo punto la procedura può eseguire le proprie istruzioni (4)

Chiamato: Nota sullo Stack Frame (record di attivazione) L ultimo frame allocato sullo stack è associato alla procedura P correntemente in fase di esecuzione Fintanto che P non ha terminato, $fp contiene l indirizzo della prima parola allocata nel frame di P Supponiamo che P chiami un altra procedura Q: Q dovrà salvare sullo stack il registro $fp prima di rilocarlo sul proprio frame e, prima di restituire il controllo a P, ripristinarlo. Questo per garantire a P la non alterazione del suo frame pointer (è lo stesso principio che vale per ogni calle-saved register). A cosa serve il frame pointer? Può essere comodo per indirizzare sullo stack variabili locali della procedura usandolo come base address del frame; la stessa cosa non vale per lo stack pointer che varia ad ogni operazione di POP o PUSH

Chiamato: operazioni di ritorno (5) Se il chiamato è una funzione avrà un valore di ritorno da restituire al chiamante: viene lasciato nel registro $v0 (e $v1) Ripristino dei registri callee-saved che erano stati salvati precedentemente, assegnandoli il loro valore iniziale presente sullo stack (nota: incluso $fp!) Deallocazione (pop) dello stack frame: sommare la dimensione del frame a $sp $sp = $sp + DIM_FRAME Restituzione del controllo al chiamante con: jr $ra

Esempio: chiamata della procedura «somma» subu $sp, $sp, 4 sw $t0, 0($sp) li $a0,5 li $a1,10 li $a2,7 jal Somma # $v0 contiene il valore della somma

Esempio: procedura «somma» Somma: # alloca nello stack lo spazio per i 3 registri subu $sp,$sp,16 sw $fp, 12($sp) # salvataggio di $fp sw $s0, 8($sp) # salvataggio di $s0 sw $s1, 4($sp) # salvataggio di $s1 sw $s2, 0($sp) # salvataggio di $s2 addiu $fp, $sp, 12 # esegue istruzioni add $s0, $a0, $a1 add $s1, $a2, $a3 add $s2, $s0, $s1 #valore di ritorno add $v0, $s2, $zero # ripristino del vecchio contenuto dei registri estraendolo dallo stack lw $s2, 0($sp) # ripristino di $s2 lw $s1, 4($sp) # ripristino di $s1 lw $s0, 8($sp) # ripristino di $s0 lw $fp, 12($sp) # ripristino di $fp addi $sp, $sp, 16 # deallocazione stack frame #restituzione controllo al chiamante jr $ra

Esempio Prima della chiamata Dopo la chiamata, durante l esecuzione della procedura Dopo il ritorno al chiamante libero libero libero libero $fp $s0 $s1 $s2 libero libero libero libero

Nome del file sorgente: elaboratore.asm Esercizio 5.1 Si scriva una procedura assembly, chiamata Elaboratore, che esegua somma, differenza, moltiplicazione e divisione tra due numeri interi Input: i due operandi e un terzo parametro per la selezione dell operazione Output: risultato (nel caso della divisione restituisca anche il resto) Si scriva poi il main dove: vengono chiesti all utente operandi e operatore il risultato dell operazione è mostrato a terminale

Esercizio 5.2 Nome del file sorgente: sommaselettiva.asm Si scriva un programma che: chieda all utente di inserire un array di interi di dimensione arbitraria invochi una procedura P stampi il valore ritornato da P La procedura P è definita come segue: Input: l array inserito dall utente e un parametro k se k=0 la procedura calcola la somma di tutti gli interi in posizione (indice nell array) dispari se k=1 sommerà quelli in posizioni pari. Suggerimento: allocare l array staticamente in memoria e passare alla procedura il base address (passaggio per indirizzo)

Esercizio 5.3 nome del file sorgente: subseteq.asm, belongs.asm Si implementi la procedura subseteq così definita: Input: due array di interi A1 e A2 Output: 1 se ogni elemento di A1 è presente in A2, 0 altrimenti La procedura subseteq dovrà a sua volta utilizzare un altra procedura belongs così definita: Input: un array A e un intero i Output: 1 se i è contenuto in A, 0 altrimenti Si implementi infine il main che acquisisca i dati, chiami subseteq e raccolga i risultati

Università degli Studi di Milano Laboratorio di Architettura degli Elaboratori II Corso di Laurea in Informatica, A.A. 2017-2018 Nicola Basilico Dipartimento di Informatica Via Comelico 39/41-20135 Milano (MI) Ufficio S242 nicola.basilico@unimi.it +39 02.503.16294 Hanno contribuito alla realizzazione di queste slides: Iuri Frosio Jacopo Essenziale