Convenzioni di chiamata a procedure

Documenti analoghi
Assembly (3): le procedure

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

Istruzioni di trasferimento dati

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

Calcolatori Elettronici

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

MIPS Instruction Set 2

System Calls, Register Spilling

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri

Architetture dei Calcolatori

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

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

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

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

Spazio di indirizzamento virtuale

Programmi in Assembly

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

Record di Attivazione

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

Il linguaggio macchina

Ottenere una modifica del parametro attuale

ARM: stack e subroutine

Sommario Introduzione al linguaggio Assembly. Calcolatori Elettronici Prof. Gian Luca Marcialis. Le operazioni fondamentali

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

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

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

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

Processore Danilo Dessì. Architettura degli Elaboratori.

L ambiente di simulazione SPIM

Circuiti combinatori

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano

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

Gestione delle subroutine. Appunti di Sistemi per la cl. IV Dinf A cura del prof. Ing. Mario Catalano

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Università degli Studi di Cassino

Istruzioni assembler Istruzione N Registri

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

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

ESERCIZIO 1 Si consideri la seguente funzione f (A, B, C, D) non completamente specificata definita attraverso il suo ON-SET e DC-SET:

Lezione 20. Assembly MIPS: Il set istruzioni, strutture di controllo in Assembly

9 - Array. Programmazione e analisi di dati Modulo A: Programmazione in Java. Paolo Milazzo

ISA (Instruction Set Architecture) della CPU MIPS

Funzioni, Stack e Visibilità delle Variabili in C

LABORATORIO DI PROGRAMMAZIONE 1 CORSO DI LAUREA IN MATEMATICA UNIVERSITÀ DEGLI STUDI DI MILANO III Indice

Corso di Calcolatori Elettronici MIPS: Istruzioni di confronto Istruzioni di controllo Formato delle istruzioni in L.M.

Gestione della memoria

L'architettura del processore MIPS

Linguaggio Assembly e linguaggio macchina

Sottoprogrammi in linguaggio assembly del Motorola 68000

LABORATORIO DI PROGRAMMAZIONE 2 Corso di laurea in matematica. Algoritmi ricorsivi

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

Il linguaggio macchina

ISA e linguaggio macchina

Fondamenti di Informatica T. Linguaggio C: Stack e Ricorsione

Linguaggio Assembly e linguaggio macchina

Dal sorgente all eseguibile I programmi Assembly. Prof. Alberto Borghese Dipartimento di Scienze dell Informazione

L ambiente di simulazione SPIM

Allocazione Dinamica della Memoria

Interazione con il DOS e il BIOS

Linguaggio Assembly e linguaggio macchina

Il linguaggio C. Puntatori e dintorni

Architettura degli Elaboratori

Rappresentazione degli algoritmi

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Università degli Studi di Roma La Sapienza

Architettura degli Elaboratori II Laboratorio

L unità di controllo di CPU a singolo ciclo

Università di Roma Tor Vergata Corso di Laurea triennale in Informatica Sistemi operativi e reti A.A Pietro Frasca.

IJVM. Danilo Dessì. Architettura degli Elaboratori.

Architettura degli Elaboratori. Classe 3 Prof.ssa Anselmo. Appello del 18 Febbraio Attenzione:

7 May INTERRUPT ED ECCEZIONI I. Frosio

Richiami sull architettura del processore MIPS a 32 bit

Accesso a memoria. Accesso a memoria. Accesso a memoria. Modalità di indirizzamento. Lezione 5 e 6. Architettura degli Elaboratori A.

Richiami sull architettura del processore MIPS a 32 bit

/ sezione dichiarativa variabili globali / #define N 10 int vett [N];

MIPS Instruction Set 1

MIPS! !

La ricorsione. Ver Claudio Fornaro - Corso di programmazione in C

Passaggio di Parametri per Valore o Indirizzo

Esercizi sulla macchina assembler, strutturazione a livelli, spazio di indirizzamento

Lezione 20. Assembly MIPS: Il set istruzioni, strutture di controllo in Assembly

Linguaggio assembler e linguaggio macchina (caso di studio: processore MIPS)

Macchina di Riferimento: argomenti

Il processore: unità di controllo

ARCHITETTURA DI UN SISTEMA DI ELABORAZIONE

Calcolatori Elettronici

Esercizi riassuntivi (Fondamenti di Informatica 2 Walter Didimo) Soluzioni

Assembly III SPIM: un ambiente di simulazione MIPS

Un altro tipo di indirizzamento. L insieme delle istruzioni (3) Istruz. di somma e scelta con operando (2) Istruzioni di somma e scelta con operando

MIPS Instruction Set 1

Gestione dinamica della memoria

Il linguaggio C funzioni e puntatori

Università degli Studi di Cassino e del Lazio Meridionale Corso di Fondamenti di Informatica Allocazione dinamica di memoria

Introduzione al linguaggio C Puntatori

Università degli Studi di Milano - Corso Architettura II Prof. Borghese Appello del

Linguaggio macchina: utilizzo di costanti, metodi di indirizzamento

i = 0; somma = 0; while i!= n { somma = somma + A[i]; if somma < n j = 0; else j = f2(a[i],somma); i = i + 1; $v0 return j

Allocazione dinamica della memoria

Perché il linguaggio C?

21 March : ESERCITAZIONE 01 GESTIONE DELLA MEMORIA VETTORI CONTROLLOO O DI FLUSSO DI UN PROGRAMMA. I. Frosio

Transcript:

Università degli Studi di Milano Laboratorio di Architettura degli Elaboratori II Corso di Laurea in Informatica, A.A. 2016-2017 Convenzioni di chiamata a procedure Nicola Basilico Dipartimento di Informatica Via Comelico 39/41-20135 Milano (MI) Ufficio S242 nicola.basilico@unimi.it +39 02.503.16294 Homepage del corso

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

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). Chiamate e ritorni da procedure seguono un ordine LIFO: l ultima procedura invocata è la prima a terminare. Gli stack frame sono allocati sullo stack seguendo la sequenza delle chiamate (lo stack è gestito con una convenzione LIFO)

Registri caller-saved e 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 una procedura è libera 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 una procedura non può sovrascrivere questi registri: il chiamante si aspetta che restino invariati dopo la chiamata a procedura. Se il chiamato 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 il controllo passa a lui

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) Salto incondizionato all istruzione che sta alla label procedura, salva l indirizzo della prossima istruzione (PC+4) in $ra jal procedura

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 ogni volta che viene fatta una POP o un 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 Ritorno del controllo al chiamante con: jr $ra

Esempio 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 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 # $t0 <- g + h add $s1, $a2, $a3 # $t1 <- i + j add $s2, $s0, $s1 # f <- $t0 + $t1 #valore di ritorno add $v0, $s2, $zero # ripristino del vecchio contenuto dei registri estraendolo dallo stack lw $s2, 0($sp) # ripristino di $s0 lw $s1, 4($sp) # ripristino di $t0 lw $s0, 8($sp) # ripristino di $t1 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

Esercizio 6.1 Si scriva una procedura assembly, chiamata Elaboratore, che esegue la 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 restituisce anche il resto). Si scriva poi il main dove: vengono chiesti all utente operandi e operatore; il risultato dell operazione è mostrato a terminale.

Si scriva un programma che Esercizio 6.2 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 6.3 Si scriva un programma che chieda all utente di inserire due array di interi A1 e A2 di dimensione arbitraria e stampi a video un messaggio se ogni elemento di A1 è presente in A2 Si utilizzi una procedura P così definita Input: un array A e un intero i Output: 1 se i è contenuto in A, 0 altrimenti

Università degli Studi di Milano Laboratorio di Architettura degli Elaboratori II Corso di Laurea in Informatica, A.A. 2016-2017 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: Dr. Iuri Frosio