GENERAZIONE CODICE MACCHINA

Slides:



Advertisements
Presentazioni simili
Ricorsione in SQL-99.
Advertisements

Tecnologia delle basi di dati: Strutture fisiche di accesso
Puntatori in C e C++.
Organizzazione della memoria
Introduzione alla programmazione A. Ferrari. Il linguaggio C Nel 1972 Dennis Ritchie nei Bell Laboratories progettò il linguaggio C Il linguaggio possiede.
Università degli Studi di Napoli Federico II Facoltà di Ingegneria Dipartimento di Informatica e Sistemistica Corso di Sistemi ad elevate prestazioni –
Analizzatori Lessicali con JLex
MATLAB.
MATLAB. Scopo della lezione Programmare in Matlab Funzioni Cicli Operatori relazionali Esercizi vari.
Type Checking (1° parte)
Generazione di Codice Intermedio
Ottimizzazione statica del codice per processori pipelined Canella Matteo & Miglioli Filippo.
Chiamate a Procedure. Per lesecuzione di una procedura, un programma deve eseguire i seguenti sei passi: mettere i parametri in un posto dove la procedura.
Anno accademico Le classi di memorizzazione.
Insiemi disgiunti.
Introduzione agli algoritmi. Definizione Sistema di regole e procedure di calcolo ben definite che portano alla soluzione di un problema con un numero.
Stato di Avanzamento dello sviluppo del modulo Concretizator
Esercizi su alberi binari
Università degli Studi di Roma La Sapienza Architettura degli elaboratori II Funzioni.
Informatica di base A.A. 2003/2004 Algoritmi e programmi
File.
Alcuni esercizi e domande per il compitino quali sono le parti principali dellarchitettura di von Neumann? citare le caratteristiche salienti della RAM.
Allocazione dinamica della memoria
Laboratorio di Linguaggi lezione VIII Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese Corso di Laurea.
MATLAB. …oggi… Programmare in Matlab Programmare in Matlab m-file m-file script script Funzioni Funzioni Cicli Cicli Operatori relazionali Operatori relazionali.
1 2. Analisi degli Algoritmi. 2 Algoritmi e strutture dati - Definizioni Struttura dati: organizzazione sistematica dei dati e del loro accesso Algoritmo:
Gestione delle subroutine
Ottimizzazione nella gestione dei progetti
Corso di Informatica Applicata - Lezione 3 - © 2005 Saverio De Vito Corso di Informatica Applicata Lezione 3 Università degli studi di Cassino Corso di.
Lezione 4: Costrutti Condizionali Prof. Raffaele Montella.
1 Generazione codice Daniela Briola Lorena Bellino.
Codifica di algoritmi linguaggio macchina vs programmazione strutturata Lab Programmazione - turno /2006.
memoria gestita staticamente:
FUNZIONI: IL MODELLO APPLICATIVO 1) Valutazione, nellenvironment corrente, del simbolo che denota il nome della funzione; 2) Valutazione, nellenvironment.
21 marzo 22 marzo 23 marzo 24 marzo. TCB TCB TCB marzo
Linguaggi di programmazione: funzioni Le funzioni richiedono un numero fisso o variabile di argomenti, ovvero valori che devono essere passati alla funzione.
File I record.
Introduzione al linguaggio assemby del microprocessore a parte
CODIFICA Da flow-chart a C++.
Architetture dei Calcolatori (Lettere j-z ) Il Processore
PROBLEMA ALGORITMO PROGRAMMA LINGUAGGI di PROGRAMMAZIONE
Architettura del calcolatore
Architettura degli Elaboratori II (canale P-Z) Istruzioni di controllo Dott. Franco Liberati.
Strutture di Controllo
Per valutare la complessità ammortizzata scomponiamo ogni Union: nelle due FindSet e nella Link che la costituiscono e valuteremo la complessità in funzione.
Programmazione di Calcolatori
Programmazione di Calcolatori
Laboratorio di Linguaggi lezione VII: variabili Globali e Locali Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali.
BIOINFO3 - Lezione 221 Listruzione IF-ELSE prevede un secondo blocco di istruzioni da eseguire in alternativa al primo nel caso la condizione sia falsa.
Informatica Lezione 4 Scienze e tecniche psicologiche dello sviluppo e dell'educazione Anno accademico:
Complessità di un algoritmo
ROCK A Robust Clustering Algorithm for Categorical Attributes Sudipto Guha, Rajeev Rastogi, Kyuseok Shim Sistemi Informativi per le Decisioni a.a. 2005/2006.
1 Università di Pavia - corso di Calcolatori Elettronici C code: L1:g = g + A[i]; i = i + j; if (i != h) goto L1; MIPS code: L1:add $t1, $s3, $s3# $t1.
Arch. Elab. - S. Orlando 1 Esercitazione su Instruction Level Parallelism Salvatore Orlando.
Architettura di una CPU
SISITEMI MONOPROGRAMMATI E MULTI PROGRAMMATI
Calcolatori Elettronici Introduzione al Pipelining
Calcolatori Elettronici Assemblatore, Linker e Loader
Calcolatori Elettronici Il Processore
Programmazione Assembly
Tecnologie Informatiche ed Elettroniche per le Produzioni Animali
Corso di Laurea in Informatica Architettura degli elaboratori a.a La macchina programmata Instruction Set Architecture (2) Istruzioni I-type Indirizzamento.
1 Il linguaggio C Precisazioni sull’esperienza in laboratorio.
Architettura di un calcolatore e linguaggio macchina.
FUNZIONI: IL MODELLO A RUN-TIME 1) creazione di una nuova attivazione (istanza) del servitore 2) allocazione di memoria per i parametri e per le variabili.
1 1. Introduzione alla gestione della memoria 2. Swapping 3. Memoria virtuale 4. Implementazione 5. Algoritmi di sostituzione Gestione della Memoria.
Corso di Laurea in Informatica Architettura degli elaboratori a.a La macchina programmata (3) Istruzioni J-type Istruzioni di salto Istruzioni.
 Ogni processo che deve essere eseguito da un sistema di elaborazione, deve essere caricato e risiedere almeno parzialmente nella memoria centrale 
13. Strutture dati dinamiche Ing. Simona Colucci Informatica - CDL in Ingegneria Industriale- A.A
Vari e semplici programmi.
Transcript della presentazione:

GENERAZIONE CODICE MACCHINA Daniela Briola Lorena Bellino

Funzione getreg Restituisce la locazione L destinata a ospitare il valore di x nelle istruzioni del tipo x := y op z Locazioni restituite dalla funzione: L è il registro che contiene y L è un registro vuoto L è un registro occupato L è la locazione di x

Esempio 1/2 d := (a - b) + (a - c) +(a - c) t := a – b u := a – c v := t + u d := v + u

Esempio 2/2 Statement Code generated Register descriptor Address t := a - b MOV a, R0 SUB b, R0 R0 contiene t t in R0 u := a - c MOV a, R1 SUB c, R1 R1 contiene u u in R1 v := t + u ADD R1, R0 R0 contiene v v in R0 d := v + u R0 contiene d d in R0 MOV R0, d d in R0 e in memoria

Indici statement i in register Ri i in memoria Mi i nello stack codice costo a := b[i] MOV b(Ri), R 2 MOV Mi, R MOV b(R), R 4 MOV Si(A), R a[i] := b MOV b, a(Ri) 3 MOV b, a(R) 5

Istruzioni condizionali Branch condition Condition code: che indicano se l’ultima quantità calcolata è positiva, negativa o zero Esempio: If x < y goto z -----> CMP x, y CJ< z x := y + z MOV y, R0 if x < 0 goto z ------> ADD z, R0 if x > 0 goto w MOV R0, x CJ> w

Allocazione e assegnazione registri Locale Assegnazione di specifici valori a determinati registri Più semplice da implementare ma meno efficiente Globale Registri mantengono i valori per la durata del blocco Registri riservati alle variabili più utilizzate Più efficiente ma più complesso da implementare

Allocazione e assegnazione registri Risparmi Utilizzo di x in loop L non preceduto da assegnazione  -1 per ogni blocco di L in cui x è vivo all’uscita e gli viene assegnato un valore nel blocco  -2 Allocazione di un registro ad una variabile x in un loop L: ∑B Î L use(x, B) + 2 * live(x, B) (*) Dove: Use(x, B): n° volte in cui x è usato in B prima di ogni definizione di x Live(x, B): 1 se x è viva all’uscita di B e gli viene assegnato un valore in B, 0 altrimenti

Esempio 1/2 ∑B Î L use(x, B) + 2 * live(x, B) R0, R1, R2

Esempio 2/2 Valutazione di (*) per x = a: ∑B Î L 2*live(a, B) = 2 ∑B Î L use(a, B) = 0 + 1 + 1 + 0 = 2 ∑B Î L use(a, B) + 2 * live(a, B) = 4 Per b, c, d, e, f i valori sono rispettivamente 6, 3, 6, 4, 4 È ragionevole pensare che R0, R1ed R2 mantengano i valori di a, b, d

Rappresentazione di BB tramite dags I dag sono utili strutture per rappresentare i BB Etichette sui nodi: Foglie etichettate da identificatori unici: nomi di variabili o costanti Nodi interni etichettati da operatori I nodi possono avere opzionalmente una sequenza di identificatori che rappresentano i corrispondenti valori calcolati

Esempio t1 := 4 * i t2 := a[t1] t3 := 4 * i t4 := b[t3] t5 := t2 * t4 t6 := prod + t5 prod := t6 t7 := i + 1 i := t7 if i <= 20 goto 1.

Costruzione dag – Algoritmo 1/3 Input: basic block (BB) Output: dag rappresentante il BB che contiene le seguenti informazioni: Un’etichetta per ogni nodo Ad ogni nodo si associa una lista di identificatori Metodo: Struttura dati per rappresentare dag Lista contenente tutti gli identificatori cui è associato un nodo Node(y): restituisce nodo con identificatore y Statement della forma x := y op z x := op z x := z

Costruzione dag – algoritmo 3/3 Se node(y) non è definito, creare una foglia etichettata y, e sia node(y) tale nodo Nel caso (i) determinare se esiste nodo etichettato op con figlio sinistro = node(y) e figlio destro = node(z). Se non esiste creare così un nuovo nodo. Nel caso (ii) determinare se esiste un nodo etichettato op il quale ha come figlio node(y), se non esiste creare così un nuovo nodo. In entrambi i casi, il nodo trovato o creato lo indichiamo con n. Nel caso (iii) n = node(y). Eliminare x dalla lista degli identificatori associati a node(x); appendere x alla lista degli identificatori associati al nodo n e settare node(x) a n.

Applicazioni dell’uso di DAG Individuazione di sottoespressioni comuni Stabilire quali identificatori hanno valori usati nel blocco Determinare gli statement che calcolano valori che possono essere usati al di fuori del blocco

Ristrutturazione dell’ordine di esecuzione (a + b) – (e – (c + d)) BB t1 := a + b t2 := c + d t3 := e – t2 t4 := t1 – t3 MOV a, R0 ADD b, R0 MOV c, R1 ADD d, R1 MOV R0, t1 MOV e, R0 SUB R1, R0 MOV t1, R1 SUB R0, R1 MOV R1, t4

Ristrutturazione dell’ordine di esecuzione Modificando l’ordine delle istruzioni nel BB t2 := c + d t3 := e – t2 t1 := a + b t4 := t1 – t3 vengono risparmiate due istruzioni MOV c, R0 ADD d, R0 MOV e, R1 SUB R0, R1 MOV a, R0 ADD b, R0 SUB R1, R0 MOV R0, t4

Generazione codice ottimale Algoritmo consiste di 2 parti Etichetta ogni nodo con un intero che denota il più piccolo numero di registri richiesti per valutare l’albero Visita dell’albero il cui ordine è dato dal valore delle etichette calcolato nel passo 1. Il codice di output viene generato durante la visita dell’albero.

Algoritmo di etichettatura Foglia sinistra = è un nodo foglia il quale è il discendente più a sinistra del proprio padre. Le altre foglie sono dette foglie destre L’etichettatura viene effettuata in una visita bottom-up

Algoritmo di etichettatura If n is leaf then if n is the leftmost child of its parent then label(n) := 1 else label(n) := 0 Else begin let l1, l2 be the children of n (6) label(n) = max(l1, l2) se l1 != l2 l1 + 1 l1 == l2 end Nel caso generico, (6) viene sostituita con: let n1, … nk be the children on n ordered by “label”, so label(n1) >= … >= label(nk) label(n) := max 1<=i<=k (label(ni) + i - 1)

Algoritmo di etichettatura Ordine: a, b, t1, e, c, d, t2, t3, t4

Generazione codice da albero etichettato Procedura gencode(n): produce codice macchina valutando i sottoalberi di T con radice n. rstack: stack utilizzato per allocare i registri tstack: stack utilizzato per allocare locazioni di memoria temporanea swap: procedura che scambia i primi 2 registri sul top di rstack

Generazione codice da albero etichettato Procedure gencode(n); Begin /* case 0 */ If n is a left leaf representing operand “name” and n is the leftmost child of its parent then print ‘MOV’ || name || top(rstack) else if n is an interior node with operator “op”, left child n1 and right child n2 then /* case 1*/ if label(n2) = 0 then begin let name be the operand represented by n2; gencode(n1); print op || name || ‘,’ || top(rstack) end /*case 2*/ else if 1<=label(n1) < label(n2) and label(n1) < r then swap(rstack); gencode(n2); R := pop(rstack); /* n2 was evaluated into register R */ print op || R || ‘,’ || top(rstack); push(rstack, R); swap(rstack);

Generazione codice da albero etichettato /* case 3*/ else if 1 <= label(n2) <= label(n1) and label(n2) < r then begin gencode(n1); R := pop(rstack); /*n1 was evaluated into register R*/ gencode(n2); print op || top(rstack) || ‘,’ || R; push(rstack, R); end /* case 4 both labels >= r the total number of register */ else T := pop(tstack); print ‘MOV’ || top(rstack) || ‘,’ || T; push(tstack, T); print op || T || ‘,’ || top(rstack);