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

Dimensione: px
Iniziare la visualizzazioe della pagina:

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

Transcript

1 esercizio linguaggio macchina esame 9 luglio 2015 prima parte traduzione in assembler Si deve tradurre in linguaggio macchina simbolico (linguaggio assemblatore) MIPS il frammento di programma C riportato sotto, costituito dalla sezione dichiarativa delle variabili globali che contiene la sola variabile vett, e dalla funzione ricorsiva f_ric. Non si tenti di accorpare od ottimizzare insieme istruzioni C indipendenti. La memoria ha indirizzi da 32 bit, è indirizzabile per byte e gli interi sono da 32 bit. Si facciano le ipotesi seguenti: il fame pointer non è in uso le variabili locali sono allocate nei registri se possibile Si chiede di svolgere i quattro punti seguenti: 1. Si descriva l area di attivazione della funzione f_ric, secondo il modello MIPS, nella tabella predisposta. 2. Si traduca in linguaggio macchina MIPS la sezione dichiarativa della variabile globale vett nella tabella predisposta, in cui è già stata inserita la direttiva.data che definisce l indirizzo di impianto delle variabili globali. 3. Si traduca in linguaggio macchina MIPS il codice della funzione f_ric, coerentemente con le specifiche e le risposte ai punti precedenti, usando la tabella predisposta. Se lo si ritiene utile, prima della traduzione si derivino gli alberi associati alle espressioni presenti nel codice. 4. Si risponda alla domanda sulla mappatura della memoria così come richiesto al punto 4. / sezione dichiarativa variabili globali / #define N 10 int vett [N]; / funzione f_ric / int f_ric (int p, int i) int j; / variabili locali / j = i; if (j == -1) return 0; else p = vett [i]; return f_ric (p, i - 1); / chiamata ricorsiva / / end if / / f_ric /

2 punto 1 (numero di righe non significativo) area di attivazione di f_ric contenuto simbolico spiazz. rispetto a stack pointer ra 4 indirizzi alti s0 (assegnato a varloc j) 0 sp a1 (assegnato a param i) salvato prima di chiamata max estensione del prologo chiamante indirizzi bassi Si noti che la funzione è ricorsiva, pertanto essa funziona sia come chiamante (caller) sia come chiamato (callee). Il chiamante salva il secondo parametro a1 (assegnato a i ) in pila per poterlo poi riavere inalterato. Tuttavia, si può notare che in effetti il chiamante non usa il secondo parametro dopo la chiamata; dunque si può evitare di salvare tale parametro in pila. Va anche bene salvare sempre, prudenzialmente, tutti i parametri passati (qui entrambi), a prescindere da che poi il chiamante ne abbia ancora bisogno con i loro valori originali. IL MODELLO DI CHIAMATA A FUNZIONE USUALE PREVEDE CHE IL CHIAMANTE SALVI I PARAMETRI IN PILA SOLO SE DOPO LA CHIAMATA A FUNZIONE ESSO NECESSITA DI RITROVARLI INALTERATI. QUI IL MODELLO NON VIENE RISPETTATO RIGOROSAMENTE SOLO PER MOSTRARE COME SALVARE UN PARAMETRO IN PILA. punto 2 codice MIPS della sezione dichiarativa globale (num. righe non signif.).data 0x // indirizzo di impianto dati VETT:.space 40 // dichiarazione variabile globale

3 punto 3 codice MIPS di f_ric (num. righe non signif.) F_RIC: addiu $sp, $sp, -8 // costruisci area.eqv RA, 4 // spiazzamento di ra salvato.eqv S0, 0 // spiazzamento di s0 salvato sw $ra, RA($sp) // salva ind rientro sw $s0, S0($sp) // salva reg s0 (varloc J) move $s0, $a1 // aggiorna varloc j IF: li $t0, -1 (o addi $t0, $0, -1) // carica cost -1 bne $s0, $t0, ELSE // se j!= -1 va a ELSE THEN: move $v0, $0 (o add $v0, $0, $0) // prepara valusc j ENDIF // va a ENDIF ELSE: la $t0, VETT // carica ind VETT move $t1, $a1 // copia arg i sll $t1, $t1, 2 // allinea indice addu $t0, $t0, $t1 // calcola ind elem ( ) lw $t1, ($t0) // carica elem v[i] sw $t1, ($a0) // aggiorna p addiu $sp, $sp, -4 // 1) decrementa reg sp ( ) sw $a1, ($sp) // 2) salva param i (push) addi $a1, $a1, -1 // calcola i 1 ( ) jal F_RIC // chiama f_ric lw $a1, ($sp) // 3) ripristina param i (pop) addiu $sp, $sp, 4 // 4) incrementa reg sp ENDIF: lw $s0, S0($sp) // ripristina reg s0 lw $ra, RA($sp) // ripristina ind rientro addiu $sp, $sp, 8 // elimina area jr $ra // rientra Le istruzioni (1-2) realizzano l operazione PUSH di a1 (param i ) sulla cima della pila; le istruzioni (3-4) realizzano l operazione POP di a1 (param i ) dalla cima della pila. Qui si usa una somma addu (oppure addiu ) di tipo senza segno (unsigned), poiché si tratta di un operazione per calcolare un indirizzo, ossia un numero naturale sempre positivo o nullo. Infatti, giacché il risultato di un operazione su indirizzi sarà sempre un numero naturale, va usata l aritmetica senza segno. Invece per un operazione su variabili di tipo intero relativo (positive, nulle o negative), come per varabili di tipo int nel calcolo di un espressione algebrica, va usata l aritmetica con segno.

4 Note varie: l istruzione li è sostituibile con l istruzione addi poiché la costante 1 da caricare è a solo 16 bit la pseudo-istruzione move è facilmente espandibile tramite un istruzione addi formalmente il registro s0 va salvato in pila a cura del chiamato, poiché è assegnato alla variabile locale j, ma giacché la funzione in realtà non lo modifica, ottimizzando molto si potrebbe evitare di salvarlo (così però deviando dal modello rigoroso di area di attivazione) il parametro i allocato nel registro a1 viene modificato dal chiamante per passarlo al chiamato ricorsivo, e se si prende il ramo ELSE è salvato in pila prima della modifica così causando un estensione della pila, e poi è ripristinato subito dopo il rientro da jal (il ramo THEN non ha effetto); in realtà si potrebbe evitare di salvarlo perché dopo il rientro non viene più usato; si veda il modello di chiamata a funzione illustrato a lezione invece il parametro p allocato nel registro a0 non viene modificato dalla funzione, pertanto senz altro non viene salvato (e dunque neppure ripristinato) AVVERTENZA: si badi bene che lo statement C di assegnamento *p = vett [i] USA il parametro puntatore p, ma non ne modifica il valore, ossia non cambia l indirizzo che costituisce il valore di p! ciò che viene modificato, assegnandogli il valore dell elemento con indice i del vettore, è l oggetto puntato da p (si riveda il punto precedente) i registri temporanei t0-t7 non vengono salvati (non vengono date indicazioni che la funzione si aspetti di poterli riavere inalterati dopo la chiamata ricorsiva) Potrebbero esserci altre piccole ottimizzazioni di codice.

5 punto 4 mappatura della memoria Si considerino le ipotesi seguenti relative all allocazione del programma in codice eseguibile in memoria: il programma è collocato in memoria secondo il modello standard di MIPS, e l ordine delle funzioni nel codice è prima main, poi f_ric la dimensione di main è di 1024 byte il valore del registro sp immediatamente prima che main effettui il passaggio di parametri alla prima invocazione di f_ric è pari a 0x 7FFF 0000 si ricorda che la memoria è indirizzabile a byte si chiedono: l indirizzo della prima istruzione di main: 0x (standard MIPS) l indirizzo della prima istruzione di f_ric: 0x (dec) 0x x x il valore di sp subito prima della seconda invocazione di f_ric: 0x 7FFF 0000 (8 4) dec 0x 7FFF x C 0x 7FFE FFF4 nota bene: subito prima della seconda invocazione di f_ric la pila ha la max estensione il valore di sp relativo all area di attivazione della seconda chiamata di f_ric: 0x 7FFE FFF4 8 dec 0x 7FFE FFF4 0x x 7FFE FFEC nota bene: l area di attivazione di f_ric (senza estensione per il prologo del chiamante) ha dimensione 8 byte

6 esercizio linguaggio macchina esame 9 luglio 2015 VARIANTE I prima parte traduzione in assembler Si deve tradurre in linguaggio macchina simbolico (linguaggio assemblatore) MIPS il frammento di programma C riportato sotto, costituito dalla sezione dichiarativa delle variabili globali che contiene la sola variabile vett, e dalla funzione ricorsiva f_ric. Non si tenti di accorpare od ottimizzare insieme istruzioni C indipendenti. La memoria ha indirizzi da 32 bit, è indirizzabile per byte e gli interi sono da 32 bit. Si facciano le ipotesi seguenti: il fame pointer è in uso le variabili locali sono allocate nei registri se possibile Si chiede di svolgere i quattro punti seguenti: 1. Si descriva l area di attivazione della funzione f_ric, secondo il modello MIPS, nella tabella predisposta. 2. Si traduca in linguaggio macchina MIPS la sezione dichiarativa della variabile globale vett nella tabella predisposta, in cui è già stata inserita la direttiva.data che definisce l indirizzo di impianto delle variabili globali. 3. Si traduca in linguaggio macchina MIPS il codice della funzione f_ric, coerentemente con le specifiche e le risposte ai punti precedenti, usando la tabella predisposta. Se lo si ritiene utile, prima della traduzione si derivino gli alberi associati alle espressioni presenti nel codice. 4. Si risponda alla domanda sulla mappatura della memoria così come richiesto al punto 4. / sezione dichiarativa variabili globali / #define N 10 int vett [N]; / funzione f_ric / int f_ric (int p, int i) int j; / variabili locali / j = i; if (j == -1) return 0; else p = vett [i]; return f_ric (p, i - 1); / chiamata ricorsiva / / end if / / f_ric /

7 punto 1 (numero di righe non significativo) contenuto simbolico spi. rispetto a stack pointer spi. rispetto a frame pointer fp 8 0 indirizzi alti fp ra 4 4 s0 (assegnato a varloc j) 0 8 sp a1 (assegnato a param i) salvato prima di chiamata max estensione del prologo chiamante indirizzi bassi punto 2 codice MIPS della sezione dichiarativa globale (num. righe non signif.).data 0x // indirizzo di impianto VETT:.space 40 // dichiarazione variabile globale

8 punto 3 codice MIPS di f_ric (num. righe non signif.) F_RIC: addiu $sp, $sp, -12 // costruisci area sw $fp, 8($sp) // salva fp chiamante addiu $fp, $sp, -8 // sposta fp // da qui si usa $fp come reg base per accedere all area di att..eqv RA, -4 // spi ra salvato (risp. a fp).eqv S0, -8 // spi s0 salvato (risp. a fp) sw $ra, RA($fp) // salva ind rientro sw $s0, S0($fp) // salva reg s0 (varloc J) move $s0, $a1 // aggiorna varloc j IF: li $t0, -1 (o addi $t0, $0, -1) // carica cost -1 bne $s0, $t0, ELSE // se j!= -1 va a ELSE THEN: move $v0, $0 (o add $v0, $0, $0) // prepara valusc j ENDIF // va a ENDIF ELSE: la $t0, VETT // carica ind VETT move $t1, $a1 // copia arg i sll $t1, $t1, 2 // allinea indice addu $t0, $t0, $t1 // calcola ind elem lw $t1, ($t0) // carica elem v[i] sw $t1, ($a0) // aggiorna p addiu $sp, $sp, -4 // 1) decrementa reg sp sw $a1, ($sp) // 2) salva param i (push) addi $a1, $a1, -1 // calcola i 1 jal F_RIC // chiama f_ric lw $a1, ($sp) // 3) ripristina param i (pop) addiu $sp, $sp, 4 // 4) incrementa reg sp ENDIF: lw $s0, S0(fp) // ripristina reg s0 lw $ra, RA($fp) // ripristina ind rientro // fine dell uso di $fp per accedere all area di attivazione lw $fp, 8($sp) // ripristina fp chiamante addiu $sp, $sp, 12 // elimina area jr $ra // rientra

9 Nota bene: l istruzione lw $fp, 8($sp) di ripristino del registro fp potrebbe essere anche scritta semplicemente come lw $fp, ($fp), con base ancora fp; nella prima forma però essa è chiaramente l inverso dell istruzione sw $fp, 8($sp) di salvataggio iniziale. Insomma: come nell esercizio (registro base sp) sw $fp, 8($sp) // salva fp lw $fp, 8($sp) // ripristina fp in alternativa sw $fp, 8($sp) // salva fp (base sp) lw $fp, ($fp) // ripristina fp (base fp) Note varie: il registro fp viene salvato e aggiornato nel prologo del chiamato (e dunque ripristinato nell epilogo del chiamato), come prima operazione (ultima operazione), pertanto nel corpo della funzione i riferimenti al contenuto dell area sono fatti con spiazzamento rispetto a fp (non rispetto a sp) l istruzione li è sostituibile con l istruzione addi poiché la costante 1 da caricare è a solo 16 bit la pseudo-istruzione move è facilmente espandibile tramite un istruzione addi formalmente il registro s0 va salvato in pila a cura del chiamato, poiché è assegnato alla variabile locale j, ma giacché la funzione in realtà non lo modifica, ottimizzando molto si potrebbe evitare di salvarlo (così però deviando dal modello rigoroso di area di attivazione) per il parametro i si vedano le considerazioni fatte nella prima soluzione idem per il parametro p AVVERTENZA: si badi bene che lo statement C di assegnamento *p = vett [i] USA il parametro puntatore p, ma non ne modifica il valore, ossia non cambia l indirizzo che costituisce il valore di p! ciò che viene modificato, assegnandogli il valore dell elemento con indice i del vettore, è l oggetto puntato da p (si riveda il punto precedente) i registri temporanei t0-t7 non vengono salvati (non vengono date indicazioni che la funzione si aspetti di poterli riavere inalterati dopo la chiamata ricorsiva) Potrebbero esserci altre piccole ottimizzazioni di codice.

10 punto 4 mappatura della memoria Si considerino le ipotesi seguenti relative all allocazione del programma in codice eseguibile in memoria: il programma è collocato in memoria secondo il modello standard di MIPS, e l ordine delle funzioni nel codice è prima main, poi f_ric la dimensione di main è di 1024 byte il valore del registro sp immediatamente prima che main effettui il passaggio di parametri alla prima invocazione di f_ric è pari a 0x 7FFF 0000 si ricorda che la memoria è indirizzabile a byte si chiedono: l indirizzo della prima istruzione di main: 0x (standard MIPS) l indirizzo della prima istruzione di f_ric: 0x (dec) 0x x x il valore di sp subito prima della seconda invocazione di f_ric: 0x 7FFF 0000 (12 4) dec 0x 7FFF x x 7FFE FFF0 nota bene: subito prima della seconda invocazione di f_ric la pila ha la max estensione il valore di sp relativo all area di attivazione della seconda chiamata di f_ric: 0x 7FFE FFF0 12 dec 0x 7FFE FFF0 0x C 0x 7FFE FFE4 nota bene: l area di attivazione di f_ric (senza estensione per il prologo del chiamante) ha dimensione 12 byte

11 esercizio linguaggio macchina esame 9 luglio 2015 VARIANTE II prima parte traduzione in assembler Si deve tradurre in linguaggio macchina simbolico (linguaggio assemblatore) MIPS il frammento di programma C riportato sotto, costituito dalla sezione dichiarativa delle variabili globali che contiene la sola variabile vett, e dalla funzione ricorsiva f_ric. Non si tenti di accorpare od ottimizzare insieme istruzioni C indipendenti. La memoria ha indirizzi da 32 bit, è indirizzabile per byte e gli interi sono da 32 bit. Si facciano le ipotesi seguenti: il fame pointer non è in uso le variabili locali sono allocate in memoria Si chiede di svolgere i quattro punti seguenti: 1. Si descriva l area di attivazione della funzione f_ric, secondo il modello MIPS, nella tabella predisposta. 2. Si traduca in linguaggio macchina MIPS la sezione dichiarativa della variabile globale vett nella tabella predisposta, in cui è già stata inserita la direttiva.data che definisce l indirizzo di impianto delle variabili globali. 3. Si traduca in linguaggio macchina MIPS il codice della funzione f_ric, coerentemente con le specifiche e le risposte ai punti precedenti, usando la tabella predisposta. Se lo si ritiene utile, prima della traduzione si derivino gli alberi associati alle espressioni presenti nel codice. 4. Si risponda alla domanda sulla mappatura della memoria così come richiesto al punto 4. / sezione dichiarativa variabili globali / #define N 10 int vett [N]; / funzione f_ric / int f_ric (int p, int i) int j; / variabili locali / j = i; if (j == -1) return 0; else p = vett [i]; return f_ric (p, i - 1); / chiamata ricorsiva / / end if / / f_ric /

12 punto 1 (numero di righe non significativo) area di attivazione di f_ric contenuto simbolico spiazz. rispetto a stack pointer ra 4 indirizzi alti varloc j 0 sp a1 (assegnato a param i) salvato prima di chiamata max estensione del prologo chiamante indirizzi bassi punto 2 codice MIPS della sezione dichiarativa globale (num. righe non signif.).data 0x // indirizzo di impianto VETT:.space 40 // dichiarazione variabile globale

13 punto 3 codice MIPS di f_ric (num. righe non signif.) F_RIC: addiu $sp, $sp, -8 // costruisci area.eqv RA, 4 // spiazzamento di ra salvato.eqv J, 0 // spiazzamento di varloc J sw $ra, RA($sp) // salva ind rientro sw $a1, J($sp) // aggiorna varloc j IF: lw $t0, J($sp) // carica varloc j li $t1, -1 (o addi $t1, $0, -1) // carica cost -1 bne $t0, $t1, ELSE // se j!= -1 va a ELSE THEN: move $v0, $0 (o add $v0, $0, $0) // prepara valusc j ENDIF // va a ENDIF ELSE: la $t0, VETT // carica ind VETT move $t1, $a1 // copia arg i sll $t1, $t1, 2 // allinea indice addu $t0, $t0, $t1 // calcola ind elem lw $t1, ($t0) // carica elem v[i] sw $t1, ($a0) // aggiorna p addiu $sp, $sp, -4 // 1) decrementa reg sp sw $a1, ($sp) // 2) salva param i (push) addi $a1, $a1, -1 // calcola i 1 jal F_RIC // chiama f_ric lw $a1, ($sp) // 3) ripristina param i (pop) addiu $sp, $sp, 4 // 4) incrementa reg sp ENDIF: lw $ra, RA($sp) // ripristina ind rientro addiu $sp, $sp, 8 // elimina area jr $ra // rientra

14 Note varie: la variabile locale j viene sempre caricata e memorizzata per ogni statement C, naturalmente in certi casi si potrebbe ottimizzare tenendola in un registro temporaneo l istruzione li è sostituibile con l istruzione addi poiché la costante 1 da caricare è a solo 16 bit la pseudo-istruzione move è facilmente espandibile tramite un istruzione addi per il parametro i si vedano le considerazioni fatte nella prima soluzione idem per il parametro p AVVERTENZA: si badi bene che lo statement C di assegnamento *p = vett [i] USA il parametro puntatore p, ma non ne modifica il valore, ossia non cambia l indirizzo che costituisce il valore di p! ciò che viene modificato, assegnandogli il valore dell elemento con indice i del vettore, è l oggetto puntato da p (si riveda il punto precedente) i registri temporanei t0-t7 non vengono salvati (non vengono date indicazioni che la funzione si aspetti di poterli riavere inalterati dopo la chiamata ricorsiva) Potrebbero esserci altre piccole ottimizzazioni di codice.

15 punto 4 mappatura della memoria Si considerino le ipotesi seguenti relative all allocazione del programma in codice eseguibile in memoria: il programma è collocato in memoria secondo il modello standard di MIPS, e l ordine delle funzioni nel codice è prima main, poi f_ric la dimensione di main è di 1024 byte il valore del registro sp immediatamente prima che main effettui il passaggio di parametri alla prima invocazione di f_ric è pari a 0x 7FFF 0000 si ricorda che la memoria è indirizzabile a byte si chiedono: l indirizzo della prima istruzione di main: 0x (standard MIPS) l indirizzo della prima istruzione di f_ric: 0x (dec) 0x x x il valore di sp subito prima della seconda invocazione di f_ric: 0x 7FFF 0000 (8 4) dec 0x 7FFF x C 0x 7FFE FFF4 nota bene: subito prima della seconda invocazione di f_ric la pila ha la max estensione il valore di sp relativo all area di attivazione della seconda chiamata di f_ric: 0x 7FFE FFF4 8 dec 0x 7FFE FFF4 0x x 7FFE FFEC nota bene: l area di attivazione di f_ric (senza estensione per il prologo del chiamante) ha dimensione 8 byte

16 esercizio linguaggio macchina esame 9 luglio 2015 VARIANTE III prima parte traduzione in assembler Si deve tradurre in linguaggio macchina simbolico (linguaggio assemblatore) MIPS il frammento di programma C riportato sotto, costituito dalla sezione dichiarativa delle variabili globali che contiene la sola variabile vett, e dalla funzione ricorsiva f_ric. Non si tenti di accorpare od ottimizzare insieme istruzioni C indipendenti. La memoria ha indirizzi da 32 bit, è indirizzabile per byte e gli interi sono da 32 bit. Si facciano le ipotesi seguenti: il fame pointer è in uso le variabili locali sono sempre allocate in memoria Si chiede di svolgere i quattro punti seguenti: 1. Si descriva l area di attivazione della funzione f_ric, secondo il modello MIPS, nella tabella predisposta. 2. Si traduca in linguaggio macchina MIPS la sezione dichiarativa della variabile globale vett nella tabella predisposta, in cui è già stata inserita la direttiva.data che definisce l indirizzo di impianto delle variabili globali. 3. Si traduca in linguaggio macchina MIPS il codice della funzione f_ric, coerentemente con le specifiche e le risposte ai punti precedenti, usando la tabella predisposta. Se lo si ritiene utile, prima della traduzione si derivino gli alberi associati alle espressioni presenti nel codice. 4. Si risponda alla domanda sulla mappatura della memoria così come richiesto al punto 4. / sezione dichiarativa variabili globali / #define N 10 int vett [N]; / funzione f_ric / int f_ric (int p, int i) int j; / variabili locali / j = i; if (j == -1) return 0; else p = vett [i]; return f_ric (p, i - 1); / chiamata ricorsiva / / end if / / f_ric /

17 punto 1 (numero di righe non significativo) contenuto simbolico spi. rispetto a stack pointer spi. rispetto a frame pointer fp 8 0 indirizzi alti fp ra 4 4 varloc j 0 8 sp a1 (assegnato a param i) salvato prima di chiamata max estensione del prologo chiamante indirizzi bassi punto 2 codice MIPS della sezione dichiarativa globale (num. righe non signif.).data 0x // indirizzo di impianto VETT:.space 40 // dichiarazione variabile globale

18 punto 3 codice MIPS di f_ric (num. righe non signif.) F_RIC: addiu $sp, $sp, -12 // costruisci area sw $fp, 8($sp) // salva fp chiamante addiu $fp, $sp, -8 // sposta fp // da qui si usa fp come reg base per accedere all area di att..eqv RA, -4 // spi ra salvato (risp. a fp).eqv J, -8 // spi varloc j (risp. a fp) sw $ra, RA($fp) // salva ind rientro sw $a1, J($fp) // aggiorna varloc j IF: lw $t0, J($fp) // carica varloc j li $t1, -1 (o addi $t1, $0, -1) // carica cost -1 bne $t0, $t1, ELSE // se j!= -1 va a ELSE THEN: move $v0, $0 (o add $v0, $0, $0) // prepara valusc j ENDIF // va a ENDIF ELSE: la $t0, VETT // carica ind VETT move $t1, $a1 // copia arg i sll $t1, $t1, 2 // allinea indice addu $t0, $t0, $t1 // calcola ind elem lw $t1, ($t0) // carica elem v[i] sw $t1, ($a0) // aggiorna p addiu $sp, $sp, -4 // 1) decrementa reg sp sw $a1, ($sp) // 2) salva param i (push) addi $a1, $a1, -1 // calcola i 1 jal F_RIC // chiama f_ric lw $a1, ($sp) // 3) ripristina param i (pop) addiu $sp, $sp 4 // 4) incrementa reg sp ENDIF: lw $ra, RA($fp) // ripristina ind rientro // fine dell uso di fp per accedere all area di attivazione lw $fp, 8($sp) // ripristina fp chiamante addiu $sp, $sp, 12 // elimina area jr $ra // rientra

19 Note varie: il registro fp viene salvato e aggiornato nel prologo del chiamato (e dunque ripristinato nell epilogo del chiamato), come prima operazione (ultima operazione), pertanto nel corpo della funzione i riferimenti al contenuto dell area sono fatti con spiazzamento rispetto a fp (non rispetto a sp) l istruzione li è sostituibile con l istruzione addi poiché la costante 1 da caricare è a solo 16 bit la pseudo-istruzione move è facilmente espandibile tramite un istruzione addi per il parametro i si vedano le considerazioni fatte nella prima soluzione idem per il parametro p AVVERTENZA: si badi bene che lo statement C di assegnamento *p = vett [i] USA il parametro puntatore p, ma non ne modifica il valore, ossia non cambia l indirizzo che costituisce il valore di p! ciò che viene modificato, assegnandogli il valore dell elemento con indice i del vettore, è l oggetto puntato da p (si riveda il punto precedente) i registri temporanei t0-t7 non vengono salvati (non vengono date indicazioni che la funzione si aspetti di poterli riavere inalterati dopo la chiamata ricorsiva) Potrebbero esserci altre piccole ottimizzazioni di codice.

20 punto 4 mappatura della memoria Si considerino le ipotesi seguenti relative all allocazione del programma in codice eseguibile in memoria: il programma è collocato in memoria secondo il modello standard di MIPS, e l ordine delle funzioni nel codice è prima main, poi f_ric la dimensione di main è di 1024 byte il valore del registro sp immediatamente prima che main effettui il passaggio di parametri alla prima invocazione di f_ric è pari a 0x 7FFF 0000 si ricorda che la memoria è indirizzabile a byte si chiedono: l indirizzo della prima istruzione di main: 0x (standard MIPS) l indirizzo della prima istruzione di f_ric: 0x (dec) 0x x x il valore di sp subito prima della seconda invocazione di f_ric: 0x 7FFF 0000 (12 4) dec 0x 7FFF x x 7FFE FFF0 nota bene: subito prima della seconda invocazione di f_ric la pila ha la max estensione il valore di sp relativo all area di attivazione della seconda chiamata di f_ric: 0x 7FFE FFF0 12 dec 0x 7FFE FFF0 0x C 0x 7FFE FFE4 nota bene: l area di attivazione di f_ric (senza estensione per il prologo del chiamante) ha dimensione 12 byte

21 esercizio linguaggio macchina prova 13 febbraio 2015 prima parte traduzione da C a linguaggio assemblatore MIPS Si deve tradurre in linguaggio macchina simbolico (linguaggio assemblatore) MIPS il programma C riportato sotto, costituito da programma principale main e dalle funzioni calcola_sqm e calcola_media. Non si tenti di accorpare od ottimizzare insieme istruzioni C indipendenti. La memoria ha indirizzi da 32 bit, è indirizzabile per byte e gli interi sono da 32 bit. Si facciano le ipotesi seguenti: il fame pointer non è in uso le variabili locali sono allocate nei registri se possibile Si chiede di svolgere i tre punti seguenti: 1. Si descriva l area di attivazione della funzione calcola_media e quella della funzione (procedura) calcola_sqm, secondo il modello MIPS, nelle due tabelle predisposte. 2. Si traduca in linguaggio macchina MIPS il codice di calcola_sqm e quello di main, coerentemente con le specifiche e le risposte ai punti precedenti, usando le due tabelle predisposte. 3. Si immagini di simulare il funzionamento del programma, con l ipotesi che il contenuto dell array dati[5] sia {1, 2, 3, 4, 5}, fino a quando la funzione calcola_media ha appena messo il valore di uscita nel registro v0. Si indichi lo stato della pila, e precisamente il contenuto delle aree di attivazione delle funzioni calcola_sqm e calcola_media riferite a tale punto di esecuzione, riportando sia il contenuto simbolico delle celle della pila sia quello numerico (se precisabile), nella tabella. Il codice è compilato concatenando prima main, poi calcola_sqm e infine calcola_media. #define N 5 / costante / int dati [N]; / variabili globali / int sqm; int calcola_media ( ) / funzione / int i, somma, media; / variabili locali / somma = 0; for (i = 0; i < N; i++) somma = somma + dati[i]; / for / media = somma / N; return media; / calcola_media / void calcola_sqm (int scarto) / funzione / int i, somma, media; / variabili locali / somma = 0; media = calcola_media ( ); for (i = 0; i < N; i++) somma = somma + (dati[i]-media) (dati[i]-media); / for / scarto = somma / N; return; / calcola_sqm / void main ( ) / progr. principale / if (N!= 0) calcola_sqm (&sqm); else sqm = -1; / main /

22 domanda 1 (numero di righe non significativo) area di attivazione di calcola_media contenuto simbolico spiazz. rispetto a stack pointer indirizzi alti s0 (assegnato a i) 8 s1 (assegnato a somma) 4 s2 (assegnato a media) 0 sp La funzione calcola_media è di tipo foglia, dunque non salva il registro ra. indirizzi bassi area di attivazione di calcola_sqm contenuto simbolico spiazz. rispetto a stack pointer indirizzi alti ra 12 s0 (assegnato a i) 8 s1 (assegnato a somma) 4 s2 (assegnato a media) 0 sp indirizzi bassi La funzione calcola_sqm NON è di tipo foglia, dunque salva il registro ra. Si noti che la funzione calcola_sqm non modifica il suo parametro scarto, ma solo l oggetto puntato da scarto. Non c è alcun bisogno che main salvi il registro a0 in pila, poiché non lo usa più dopo la chiamata a calcola_sqm ; qui il salvataggio viene fatto semplicemente per mostrare come procedere se serve.

23 domanda 3 (numero di righe non significativo) indirizzi alti 3060 ultima cella area di main contenuto (numerico) della pila al punto di esecuzione specificato dalla domanda 3 max pila main 3056 a0 param scarto salvato area di attivazione di calcola_sqm 3052 ra ind istr lw in main 3048 s0 (val di main salvato)?? 3044 s1 (val di main salvato)?? 3040 s2 (val di main salvato)?? area di 3036 s0 (i di calcola_sqm salvato)?? attivazione di 3032 s1 (somma di calcola_sqm salvata) 0 (iniz. a 0) calcola_media 3028 s2 (media di calcola_sqm salvata)??... indirizzi bassi

24 costanti e variabili globali (domanda 2 num. righe non signif.).data // segmento dati.eqv N, 5 // costante numerica DATI:.space 20 // varglob dati SQM:.space 4 // varglob sqm (non inizializz.).text codice MIPS di main (domanda 2 num. righe non signif.) // segmento testo MAIN: li $t0, N (o addi $t0, $zero, N) // carica cost N beq $t0, $zero, ELSE // se N == 0 va a ELSE THEN: la $a0, SQM // carica ind varglob sqm addiu $sp, $sp, -4 // decrementa sp sw $a0, ($sp) // salva a0 (push) jal CALCOLA_SQM // chiama calcola_sqm lw $a0, ($sp) // ripristina a0 (pop) addiu $sp, $sp, 4 // incrementa sp j ENDIF // va a ENDIF ELSE: li $t0, -1 (o addi $t0, $zero, -1) // carica cost -1 ENDIF: syscall sw $t0, SQM (o sw $t0, SQM($gp) // memorizza varglob sqm // syscall per exit Si noti che l istruzione sw finale qui è usata come pseudo-istruzione, indicando solo il riferimento simbolico SQM alla variabile globale sqm ; l assemblatore poi provvede ad espandere tale pseudoistruzione con il registro base gp, come indicato a lato tra parentesi. Di solito la pseudo-istruzione li serve per caricare una costante a 32 bit (e in tale caso l assemblatore la espande in due istruzioni native che caricano la costante in due parti da 16 bit); qui però la costante N e la costante 1 hanno modulo piccolo e dunque sono entrambe codificabili con solo 16 bit; pertanto si possono sostituire le due li con due istruzioni native addi con argomento immediato N e 1, rispettivamente. L istruzione syscall è messa in fondo a titolo puramente indicativo, per ricordare che il programma principale termina sempre con una chiamata di sistema exit.

25 codice di calcola_sqm (domanda 2 num. righe non signif.) C_SQM: addiu $sp, $sp, -16.eqv RA, 12.eqv S0, 8.eqv S1, 4.eqv S2, 0 // crea area // spi di registro ra salvato // spi di registro s0 salvato // spi di registro s1 salvato // spi di registro s2 salvato sw $ra, RA($sp) // salva ind rientro sw $s0, S0($sp) // salva reg s0 di main sw $s1, S1($sp) // salva reg s1 di main sw $s2, S2($sp) // salva reg s2 di main li $s1, 0 (o add $s1, $zero, $zero) // aggiorna varloc somma jal CALCOLA_MEDIA // chiama calcola_media move $s2, $v0 (o add $s2, $v0, $zero) // aggiorna varloc media FOR: li $s0, 0 (o add $s0, $zero, $zero) // inizializza varloc i LOOP: li $t0, N (o addi $t0, $zero, N) // carica cost N bge $s0, $t0, ENDFOR // se i >= N va a ENDFOR la $t1, DATI // carica ind base vettore DATI move $t2, $s0 // copia reg s0 sll $t2, $t2, 2 // allinea indice i addu $t1, $t1, $t2 // calcola ind elem dati[i] lw $t3, ($t1) // carica elem dati[i] sub $t3, $t3, $s2 // calcola dati[i] - media mult $t3, $t3 mflo $t3 // calcola (dati[i] media)^2 // recupera prodotto add $t3, $s1, $t3 // calcola somma +... move $s1, $t3 addi $s0, $s0, 1 // aggiorna varloc somma // calcola i++ j LOOP // va a LOOP ENDFOR: li $t0, N (o addi $t0, $zero, N) // carica cost N div $s1, $t0 // calcola somma / N mflo $t3 // recupera quoziente sw $t3, ($a0) // aggiorna scarto lw $s2, S2($sp) // ripristina reg s2 di main lw $s1, S1($sp) // ripristina reg s1 di main lw $s0, S0($sp) // ripristina reg s0 di main lw $ra, RA($sp) // ripristina ind rientro addiu $sp, $sp, 16 // elimina area jr $ra // rientra La pseudo-istruzione bge $s0, $t0, ENDFOR" potrebbe essere espansa così: slt $at, $s0, $t0 seguita da beq $at, $zero, ENDFOR ; dove il registro at è riservato come registro di servizio per l espansione delle pseudo-istruzioni da parte dell assemblatore, e non viene mai utilizzato direttamente dal programmatore.

26 seconda parte assemblaggio e collegamento Si supponga che la memoria abbia parole da 32 bit e sia indirizzata per byte. Si svolgano i punti seguenti: 1. Nella tabella sotto, si riportino gli indirizzi dove collocare dati e istruzioni. Non ci sono pseudoistruzioni. # parole memoria # byte indirizzo (esadecimale).data 0x eqv N, 20 VET:.space N x NUM:.word x x text 0x START: addi $t0, $t0, N 1 4 0x sub $t0, $t0, $t x LOOP: slti $t0, $t1, N 1 4 0x bne $t0, $s0, END 1 4 0x C lw $t3, NUM 1 4 0x lw $t2, 4($t3) 1 4 0x sw $t2, 8($gp) 1 4 0x beq $0, $0, LOOP 1 4 0x C END: syscall 0x Si dica quanto vale in decimale lo spiazzamento codificato nell istruzione bne: spiazzamento in bne 0x x x (decimale) 3. Si dica qual è la dimensione in byte del programma assemblato e l indirizzo dell ultimo byte occupato: dimensione programma 0x ind. ultimo byte 0x F 4. Si illustri il formato dell istruzione bne: opcode (6 bit) $t0 (5 bit) $s0 (5 bit) 0x 0010 (16 bit)

27 esercizio linguaggio macchina Si deve tradurre in linguaggio macchina simbolico (linguaggio assemblatore) MIPS il programma (main e funzione funz) riportato qui sotto. Nel tradurre non si tenti di accorpare od ottimizzare insieme istruzioni C indipendenti. La memoria ha parole da 32 bit, indirizzi da 32 bit ed è indirizzabile per byte. Le variabili intere sono da 32 bit. Ulteriori specifiche al problema e le convenzioni da adottare nella traduzione sono le seguenti: il fame pointer non è in uso le variabili locali sono allocate nei registri se possibile Si chiede di svolgere i tre punti seguenti: 1. Si descriva la struttura della memoria delle variabili globali e l area di attivazione della funzione funz, secondo il modello MIPS, nelle tabelle predisposte. 2. Si dichiarino in linguaggio macchina MIPS le variabili globali e si scriva il codice macchina della funzione main, coerentemente con le specifiche e le risposte precedenti, usando le tabelle predisposte. 3. Si scriva in linguaggio macchina MIPS il codice macchina della funzione funz, coerentemente con le specifiche e le risposte ai punti precedenti, usando le tabelle predisposte. programma in linguaggio C / costanti / #define N 6 / variabili globali / int x = N; int y; int p; / funzione funz / int funz (int a, int q) int b; if (q == a) p = &b; return a; else a = a 1; b = funz (a, q); return b; / fine if / / fine funz / / programma main / void main ( ) p = &x; y = funz (N, p); / main /

28 domanda 1 (numero di righe non significativo) variabili globali indirizzi alti 0x gp 0x x p y 0x x indirizzi bassi area di attivazione di funz contenuto simbolico spiazz. rispetto a stack pointer indirizzi alti ra 4 varloc b 0 sp a0 (assegnato a param a) salvato prima di chiamata max estensione pila di funz indirizzi bassi Si noti che la variabile locale b viene riferita per indirizzo, poiché l operatore di indirizzo & è applicato a b, pertanto essa non può essere allocata in un registro, ma deve stare in memoria (ovviamente in pila essendo locale) dato che deve avere un indirizzo.

29 dichiarazione delle variabili globali (domanda 2 num. righe non signif.).data // segmento dati 0x eqv N, 6 // dichiara costante simbolica X:.word N // spazio per varglob x iniz. a N Y:.space 4 // spazio per varglob y (non iniz.) P:.space 4 // spazio per varglob p (non iniz.) codice MIPS di main (domanda 2 num. righe non signif.) (notazione esplicita gcc per il collegamento).text // segmento testo MAIN: la $t0, X (lui, addi con %hi, %lo)) // carica ind varglob x sw $t0, P (sw $t0, %gp_rel(p)($gp) // aggiorna varglob p li $a0, N // cost N in param lw $a1, P (lw $a1, %gp_rel(p)($gp) // varglob p in param jal funz // chiama funz sw $v0, Y (sw $v0, %gp_rel(y)($gp) // mem. valusc in y syscall // syscall per exit Nota: la pseudo-istruzione la verrà espansa come (con notazione gcc): lui $t0, %hi(x) // X andrà rilocato addiu (o ori) $t0, $t0, %lo(x) // X andrà rilocato In alternativa: move $t0, $gp addi $t0, $t0, %rel_gp(x) // X andrà rilocato risp. a gp

30 codice MIPS di funz (domanda 3) FUNZ: addiu $sp, $sp, -8 // crea area.eqv RA, 4.eqv B, 0 // spiazzamento param a // spiazzamento param q sw $ra, RA($sp) // salva ind rientro IF: lw $t0, ($a1) // carica q bne $t0, $a1, ELSE // se q!= a va a ELSE THEN: addiu $t1, $sp, B // calcola &b sw $t1, P // aggiorna varglob p move $v0, $a1 // prepara valusc j ENDIF // va a ENDIF ELSE: addiu $sp, $sp, -4 // pila cresce sw $a0, ($sp) // salva param a addi $a0, $a0, -1 // a = a - 1 jal FUNZ // chiama funz (ricorsione) lw $a0, ($sp) // ripristina param a addiu $sp, $sp, 4 // pila decresce sw $v0, B($sp) // aggiorna varloc b ENDIF: lw $ra, RA($sp) // ripristina ind rientro addiu $sp, $sp, 8 // elimina area jr $ra // rientra Qui il parametro a viene salvato in pila; in realtà la funzione chiamante non ha bisogno di farlo, dato che dopo il rientro dalla chiamata ricorsiva non ne fa più alcun uso, e infatti il modello usuale di chiamata a funzione prevederebbe di non salvarlo; qui il salvataggio viene fatto solo per mostrare come procedere se serve. Potrebbero esserci altre ottimizzazioni.

31 esercizio linguaggio macchina Si deve tradurre in linguaggio macchina simbolico (linguaggio assemblatore) MIPS il programma C riportato sotto, costituito da programma principale main e dalle funzioni funz e rec. Non si tenti di accorpare od ottimizzare insieme istruzioni C indipendenti. La memoria ha indirizzi da 32 bit, è indirizzabile per byte e gli interi sono da 32 bit. Si facciano le ipotesi seguenti: il fame pointer non è in uso le variabili locali sono allocate nei registri se possibile Si chiede di svolgere i tre punti seguenti: 1. Si descriva l area di attivazione della funzione rec e quella della funzione funz, secondo il modello MIPS, nelle due tabelle predisposte. 2. Si traduca in linguaggio macchina MIPS il codice di main, dichiarando anche le variabili globali, il codice di rec e il codice di funz, coerentemente con le specifiche e le risposte ai punti precedenti, usando le tabelle predisposte. 3. Si immagini di simulare il funzionamento del programma, con l ipotesi MAX 1, fino a quando la funzione funz ha appena messo il valore di uscita nel registro v0. Si indichi lo stato della pila, e precisamente il contenuto delle aree di attivazione delle funzioni rec e funz, e il contenuto dei registri, rispetto a tale punto di esecuzione, riportando sia il contenuto simbolico delle celle della pila e dei registri, sia quello numerico (se precisabile), nella tabella predisposta. #define MAX = 3 / variabili globali / int a = 5; int b = 10; int h; / funzioni / int funz (int p, int q) int k; / variabile locale / k = p q; return k - q; / funz / int rec (int n, int x, int y) if (n == 0) return x + y; else / chiamata ricorsiva / return funz (x - y, rec (n 1, x, y)); / if / / rec / / programma principale / void main ( ) h = rec (MAX, a, b); / main /

32 domanda 1 (numero di righe non significativo) area di attivazione di rec contenuto simbolico spiazz. rispetto a stack pointer indirizzi alti ra 0 sp Nota: la funzione rec non ha variabili locali. indirizzi bassi area di attivazione di funz contenuto simbolico spiazz. rispetto a stack pointer indirizzi alti s0 (assegnato a varloc k) 0 sp Nota: la funzione funz è foglia, dunque NON salva il registro ra. indirizzi bassi

33 domanda 3 (numero di righe non significativo) contenuto (numerico) della pila al punto di esecuzione specificato dalla domanda 3 indirizzi alti 3060 ultima cella area di attivazione di main 3056 a0 = 3 param formale n 3052 a1 = 5 param formale x 3048 a2 = 10 param formale y max pila main 3044 ra ind rientro da rec a main 3040 a0 = 5 10 = 5 param formale p 3036 a1= rec (0, 5, 10) = 15 param formale q max pila rec sp 3032 s0 reg salvato max pila funz indirizzi bassi Nota: sia rec sia funz salvano in pila tutti i parametri passati ai rispettivi chiamati. contenuto (numerico) dei registri (se usati) al punto di esecuzione specificato dalla domanda 3 a0 param formale p = attuale x y = 5 a1 param formale q = attuale rec (0, 5, 10) = 15 a2 param formale y = attuale y = attuale b = 10 a3 non usato v0 valusc k q = = 90 v1 non usato s0 varloc k = p q = 5 15 = 75 s1 s2 s3 non usato non usato non usato

34 .data codice MIPS di main (domanda 2 num. righe non signif.) // segmento dati.eqv MAX, 3 // costante simbolica MAX A:.word 5 // varglob a iniz a 5 B:.word 10 // varglob b iniz a 10 H:.word // varglob h (non iniz).text // segmento testo MAIN: li $a0, MAX // carica param n di rec lw $a1, A (lw $a1, A($gp)) // carica param x di rec lw $a2, B (lw $a2, B($gp)) // carica param y di rec addiu $sp, $sp, -4 sw $a0, ($sp) // push di a0 addiu $sp, $sp, -4 sw $a1, ($sp) // push di a1 addiu $sp, $sp, -4 sw $a2, ($sp) // push di a2 // prepara push di una parola // prepara push di una parola // prepara push di una parola jal REC // chiama funz rec lw $a2, ($sp) // pop di a2 addiu $sp, $sp, 4 lw $a1, ($sp) // pop di a1 addiu $sp, $sp, 4 lw $a0, ($sp) // pop di a0 addiu $sp, $sp, 4 // prepara pop di una parola // prepara pop di una parola // riposiziona su cima pila sw $v0, H (sw $v0, H($gp)) // aggiorna varglob h syscall // chiama SO per exit Le tre operazioni push per salvare i tre parametri sarebbero eliminabili se non interessasse salvarli (in effetti il main in seguito non ne fa alcun uso e il modello usuale di chiamata a funzione prevederebbe di non salvarli in pila), oppure sono compattabili così: addiu $sp, $sp, -12 sw $a0, 8($sp) // salva a0 sw $a1, 4($sp) // salva a1 sw $a2, ($sp) // salva a2 // spazio in pila per tre param facendo spazio sulla pila con una sola operazione per i tre parametri; e similmente per le tre pop.

35 codice MIPS di rec (domanda 2 num. righe non signif.) REC: addiu $sp, $sp, -4 // crea area.eqv RA, 0 // spi ind rientro salvato sw $ra, RA($sp) // salva ind rientro IF: bne $a0, $0, ELSE // se n!= 0 va a ELSE THEN: add $v0, $a1, $a2 // valusc x + y j ENDIF // va a ENDIF ELSE: sub $t0, $a1, $a2 // calcola x - y addi $a0, $a0, -1 // param n - 1 addiu $sp, $sp, -12 sw $a0, 8($sp) // salva a0 sw $a1, 4($sp) // salva a1 sw $a2, 0($sp) // salva a2 // spazio in pila per tre param jal REC // chiama funz rec (ricorsiva) lw $a2, 0($sp) // ripristina a2 lw $a1, 4($sp) // ripristina a1 lw $a0, 8($sp) // ripristina a0 addiu $sp, $sp, 12 move $a1, $t0 move $a1, $v0 addiu $sp, $sp, -8 // togli spazio pila sw $a0, 4($sp) // salva a0 sw $a1, 0($sp) // salva a1 // param n 1 di funz // param rec (...) di funz // spazio in pila per due param jal FUNZ // chiama funz funz lw $a1, 0($sp) // ripristina a1 lw $a0, 4($sp) // ripristina a0 addiu $sp, $sp, 8 // togli spazio pila ENDIF: lw $ra, RA($sp) // ripristina ind rientro addiu $sp, $sp, 4 // elimina area jr $ra // rientra Nota: prima rec chiama ricorsivamente se stessa per calcolare il secondo parametro attuale di funz, e poi chiama funz ; nel chiamare se stessa ricorsivamente, rec salva tre parametri (e poi li ripristina), e nel chiamare funz ne salva due (e poi li ripristina).

36 codice MIPS di funz (domanda 2 num. righe non signif.) FUNZ: addiu $sp, $sp, -4 // crea area.eqv S0, 0 // spi reg s0 salvato sw $s0, S0($sp) // salva reg s0 mul $s0, $a0, $a1 // calcola k = p q sub $v0, $s0, $a1 // valusc k - q lw $s0, S0($sp) // ripristina reg s0 addiu $sp, $sp, 4 // elimina area jr $ra // rientra Nota: mul è una pseudo-istruzione, espandibile in due istr. native mult $a0, $a1 // moltiplica e risultato in hi, lo mflo $s0 // copia lo (32 bit meno sign.) in reg s0

37 esercizio in linguaggio macchina Si deve tradurre in linguaggio macchina simbolico (linguaggio assemblatore) MIPS il programma (main e funzione funz) riportato qui sotto. Nel tradurre non si tenti di accorpare od ottimizzare insieme istruzioni C indipendenti. La memoria ha indirizzi da 32 bit, è indirizzabile per byte e gli interi sono da 32 bit. Si facciano le ipotesi seguenti: il fame pointer non è in uso le variabili locali sono allocate nei registri se possibile Si chiede di svolgere i tre punti seguenti: 1. Si descriva la struttura della memoria delle variabili globali e l area di attivazione della funzione funz, secondo il modello MIPS, nelle tabelle predisposte. 2. Si dichiarino in linguaggio macchina MIPS le variabili globali e si scriva il codice macchina della funzione main, coerentemente con le specifiche e le risposte precedenti, usando le tabelle predisposte. 3. Si scriva in linguaggio macchina MIPS il codice macchina della funzione funz, coerentemente con le specifiche e le risposte ai punti precedenti, usando le tabelle predisposte. #define N 5 / variabili globali / int dati [N]; int i; int r = 0; / programma main / programma in linguaggio C void main ( ) i = N - 1; do if (dati [i] < i) r = 2 r + funz (dati [i - 1], i); / fine if / i--; while (i >= 1); / fine do / / fine main / / funzione funz / int funz (int a, int b) return (a + r) b; / funz /

38 domanda 1 (numero di righe non significativo) area di attivazione di funz contenuto simbolico spiazz. rispetto a stack pointer indirizzi alti indirizzi bassi Area vuota: la funzione non ha variabili locali, non deve salvare registri s0-s7 ed è foglia, dunque non deve salvare neppure il registro ra. memoria variabili globali contenuto simbolico indirizzo indirizzi alti r 0x i 0x dati [4] 0x dati [1] 0x dati [0] 0x indirizzi bassi dichiarazione delle variabili globali (domanda 2).data // segmento dati.eqv N, 5 // dichiara costante N DATI:.space 4 N // 20 byte di spazio per il vettore (4 N = 20) I:.space 4 // spazio per variabile scalare i (non iniz.) R:.word 0 // spazio per variabile scalare r iniz. a 0

39 .text codice MIPS di main (domanda 2) UN PO OTTIMIZZATO // segmento testo MAIN: li $t0, N - 1 // carica cost 4 (N 1 = 4) DO: sw $t0, I // memorizza varglob i // ciclo do (etichetta DO puramente formale coincide con IF) IF: la $t0, DATI // carica ind. base vettore lw $t1, I // carica varglob i (indice vettore) sll $t1, $t1, 2 // allinea indice (moltiplicalo per 4) addu $t0, $t0, $t1 // calcola ind. elem. Dati [i] lw $t1, ($t0) // carica elem. Dati [i] ( ) lw $t2, I // (ri)carica varglob i bge $t1, $t2, ENDIF // se dati [i] >= i va a ENDIF THEN: lw $t0, R // carica varglob r add $t0, $t0, $t0 // calcola 2 r (somma a se stesso) la $t1, DATI // (ri)carica ind. base vettore lw $t2, I // (ri)carica varglob i (indice vettore) subi $t2, $t2, 1 (o addi $t2, $t2, -1) // calcola i - 1 sll $t2, $t2, 2 // allinea indice (moltiplicalo per 4) addu $t1, $t1, $t2 // calcola ind. elem. Dati [i] lw $a0, ($t1) // carica primo param funz FUNZ lw $a1, I // carica secondo param funz FUNZ addiu $sp, $sp, -4 sw $t0, ($sp) // push di t0 (usato dopo chiamata) jal FUNZ // chiama funzione FUNZ lw $t0, ($sp) // pop di t0 (per continuare il calcolo) addiu $sp, $sp, 4 add $t0, $t0, $v0 // calcola 2 r + funz (...) sw $t0, R // memorizza varglob r ENDIF: lw $t0, I // (ri)carica varglob i addi $t0, $t0, -1 // calcola i-- sw $t0, I // memorizza varglob i WHILE: lw $t0, I // (ri)carica varglob i ENDDO: syscall li $t1, 1 (o addi $t1, $zero, 1) // carica cost 1 bge $t0, $t1, DO // se i >= 1 va a DO // chiamata di sistema exit Nota: le etichette marcano chiaramente le varie sezioni del codice tradotto e la corrispondenza con gli statement C; sono messe per chiarezza, sebbene non tutte siano poi usate effettivamente.

40 Nota: la traduzione considera ciascuno statement C separatamente, senza tentare di accorpare statement C separati, e l uso dei registri t0-t7 è conforme alle regole di calcolo delle espressioni; potrebbe esserci qualche ottimizzazione evitando di ricaricare più volte le stesse variabili. Qui si potrebbe scrivere «lw $t0, ($t0)» riusando il registro t0 per caricare il valore dell elemento «dati [i]», poiché l indirizzo di «dati [i]» non serve più; però si è preferito usare un altro registro, semplicemente per chiarezza; similmente poi per «dati [i 1]». In generale un registro puntatore contenente un indirizzo può essere riusato per caricare in esso il valore indirizzato, se l indirizzo non serve più (o anche se serve, ma in un frammento di codice assemblatore derivante dalla traduzione di uno statement C differente, e che dunque verrà ricalcolato a tempo debito). codice MIPS di funz (domanda 3) FUNZ: lw $t0, R // carica varglob r add $t0, $a0, $t0 // calcola a + r mult $t0, $a1 mflo $v0 // moltiplica (32 bit meno signif. in lo) // copia lo in v0 jr $ra // rientra a chiamante Nota: invece della coppia di istruzioni native mult e mflo, si potrebbe usare la pseudo-istruzione mul $v0, $t0, $a1, che viene espansa in mult e mflo ; la funzione è foglia e dunque non salva il registro ra.

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

Architettura dei calcolatori e sistemi operativi. Sottoprogrammi e MIPS. Espressioni algebriche. Capitolo 2 P&H Architettura dei calcolatori e sistemi operativi Sottoprogrammi e MIPS Espressioni algebriche Capitolo 2 P&H Sottoprogrammi Modello di chiamata Area di attivazione Calcolare un espressione algebrica 2

Dettagli

Istruzioni di trasferimento dati

Istruzioni di trasferimento dati Istruzioni di trasferimento dati Leggere dalla memoria su registro: lw (load word) Scrivere da registro alla memoria: sw (store word) Esempio: Codice C: A[8] += h A è un array di numeri interi Codice Assembler:

Dettagli

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

Le procedure. L insieme delle istruzioni (4) Prima della chiamata di una procedura. Le procedure (2) Architetture dei Calcolatori (lettere A-I) Le procedure L insieme delle istruzioni (4) Architetture dei Calcolatori (lettere A-I) In ogni linguaggio di programmazione si struttura il proprio codice usando procedure (funzioni, metodi, ) L utilizzo

Dettagli

Assembly (3): le procedure

Assembly (3): le procedure Architettura degli Elaboratori e delle Reti Lezione 13 Assembly (3): le procedure Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano L 13 1/23 Chiamata

Dettagli

Architetture dei Calcolatori

Architetture dei Calcolatori Architetture dei Calcolatori Lezione 11 -- 10/12/2011 Procedure Emiliano Casalicchio emiliano.casalicchio@uniroma2.it Fattoriale: risparmiamo sull uso dei registri q Rispetto alla soluzione precedente

Dettagli

Calcolatori Elettronici

Calcolatori Elettronici 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

Dettagli

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

Il set istruzioni di MIPS Modalità di indirizzamento. Proff. A. Borghese, F. Pedersini Architettura degli Elaboratori e delle Reti Il set istruzioni di MIPS Modalità di indirizzamento Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano

Dettagli

Istruzioni assembler Istruzione N Registri

Istruzioni assembler Istruzione N Registri Istruzioni assembler Istruzione N Registri Aritmetica add a, b, c a = b+c addi a, b, num a = b + sub a, b, c a = b - c mul a, b, c a = b*c div a, b, c a = b/c utilizzati Descrizione 3 Somma. Somma b e

Dettagli

come tradurre da C a MIPS un modello per generare codice macchina

come tradurre da C a MIPS un modello per generare codice macchina AXO Architettura dei Calcolatori e Sistemi Operativi come tradurre da C a MIPS un modello per generare codice macchina (tratto da Patterson & Hennessy 4a ed. italiana) catena di traduzione (breve riassunto)

Dettagli

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

Esercitazione di Calcolatori Elettronici Ing. Battista Biggio. Corso di Laurea in Ingegneria Elettronica. Capitolo 5 Linguaggio Assembly Esercitazione di Calcolatori Elettronici Ing. Battista Biggio Corso di Laurea in Ingegneria Elettronica Capitolo 5 Linguaggio Assembly Richiami: v[i] e &v[i] v[i] è il valore dell elemento i nel vettore

Dettagli

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

Richiami: v[i] e &v[i] Organizzazione della memoria. Organizzazione della memoria. Esercitazione di Calcolatori Elettronici Ing. Gian Luca Marcialis Esercitazione di Ing. Gian Luca Corso di Laurea in Ingegneria Elettronica Capitolo 5 Linguaggio Assembly Richiami: v[i] e &v[i] v[i] è il valore dell elemento i nel vettore v; &v[i] è il suo indirizzo.

Dettagli

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

Lezione 20. Assembly MIPS: Il set istruzioni, strutture di controllo in Assembly Architettura degli Elaboratori Lezione 20 Assembly MIPS: Il set istruzioni, strutture di controllo in Assembly Prof. F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano

Dettagli

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

Richiami: v[i] e &v[i] Organizzazione della memoria. Esercizio 1. Esercitazione di Calcolatori Elettronici Prof. Gian Luca Marcialis Esercitazione di Calcolatori Elettronici Prof. Gian Luca Marcialis Corso di Laurea in Ingegneria Biomedica Corso di Laurea in Ingegneria Elettrica, Elettronica ed Informatica Capitolo 5 Linguaggio Assembly

Dettagli

#define N = 5. / funzione funz / int funz (int a, int b) { return (a + r) b; } / fine funzione / programma in linguaggio C

#define N = 5. / funzione funz / int funz (int a, int b) { return (a + r) b; } / fine funzione / programma in linguaggio C esercizio n. 5 linguaggio macchina prima parte codifica in linguaggio macchina Si deve tradurre in linguaggio macchina simbolico (linguaggio assemblatore) 68000 il programma (main e funzione funz) riportato

Dettagli

System Calls, Register Spilling

System Calls, Register Spilling System Calls, Register Spilling Ultimo aggiornamento: 8/4/2016 UNIVERSITÀ DEGLI STUDI DI MILANO nicola.basilico@unimi.it http://basilico.di.unimi.it/ Esercizio 3.1 Eseguire il seguente codice assembly

Dettagli

Convenzioni di chiamata a procedure

Convenzioni di chiamata a procedure 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

Dettagli

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

5 April LABORATORIO 03 CONTROLLO DEL FLUSSO DI UN PROGRAMMA JUMP ADDRESS TABLE. I. Frosio 5 April 2012 04 LABORATORIO 03 CONTROLLO DEL FLUSSO DI UN PROGRAMMA JUMP ADDRESS TABLE I. Frosio 1 SOMMARIO If... Then... If... Then... Else... For... Break... While... Do Do... While Switch (jump address

Dettagli

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

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 Un altro tipo di indirizzamento L insieme delle istruzioni (3) Architetture dei Calcolatori (lettere A-I) Tipi di indirizzamento visti finora Indirizzamento di un registro Indirizzamento con registro base

Dettagli

Calcolatori Elettronici Lezione A4 Programmazione a Moduli

Calcolatori Elettronici Lezione A4 Programmazione a Moduli Calcolatori Elettronici Lezione A4 Programmazione a Moduli Ing. Gestionale e delle Telecomunicazioni A.A. 2007/08 Gabriele Cecchetti Sommario Programmazione a moduli Programmi con linguaggi misti Tempo

Dettagli

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

ESERCIZIO 1 Si consideri la seguente funzione f (A, B, C, D) non completamente specificata definita attraverso il suo ON-SET e DC-SET: Università degli Studi di Milano Corso Architettura degli elaboratori e delle reti Prof. Cristina Silvano A.A. 2004/2005 Esame scritto del 15 luglio 2005 Cognome: Matricola: Nome: Istruzioni Scrivere solo

Dettagli

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

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri. Sottoprogrammi: richiami Corso di Calcolatori Elettronici I Subroutine in linguaggio macchina: collegamento e passaggio dei parametri Prof. Roberto Canonico Università degli Studi di Napoli Federico II Facoltà di Ingegneria Corso

Dettagli

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri

Subroutine in linguaggio macchina: collegamento e passaggio dei parametri Corso di Calcolatori Elettronici I Subroutine in linguaggio macchina: collegamento e passaggio dei parametri Prof. Roberto Canonico Università degli Studi di Napoli Federico II Facoltà di Ingegneria Corso

Dettagli

Linguaggio macchina: utilizzo di costanti, metodi di indirizzamento

Linguaggio macchina: utilizzo di costanti, metodi di indirizzamento Architetture degli Elaboratori e delle Reti Lezione 17 Linguaggio macchina: utilizzo di costanti, metodi di indirizzamento Proff. A. Borghese, F. Pedeini Dipaimento di Scienze dell Informazione Univeità

Dettagli

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

Dal sorgente all eseguibile I programmi Assembly. Prof. Alberto Borghese Dipartimento di Scienze dell Informazione Dal sorgente all eseguibile I programmi Assembly Prof. Alberto Borghese Dipartimento di Scienze dell Informazione alberto.borghese@unimi.it Riferimenti sul Patterson: Cap. 2.10 + Appendice B, tranne B.7

Dettagli

ARM: stack e subroutine

ARM: stack e subroutine ARM: stack e subroutine 05.d Le istruzioni di accesso allo stack L istruzione di chiamata a subroutine Gestione degli stack frame Istruzione di store multiplo (STM Le istruzioni LDR e STR operano su parole

Dettagli

Linguaggio Assembly e linguaggio macchina

Linguaggio Assembly e linguaggio macchina Architettura degli Elaboratori e delle Reti Lezione 11 Linguaggio Assembly e linguaggio macchina Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano

Dettagli

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly

Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly Il linguaggio del calcolatore: linguaggio macchina e linguaggio assembly Percorso di Preparazione agli Studi di Ingegneria Università degli Studi di Brescia Docente: Massimiliano Giacomin Richiamo sull

Dettagli

Il linguaggio Assembly

Il linguaggio Assembly Il linguaggio Assembly Linguaggio macchina Linguaggio definito da un insieme di istruzioni, codificate come stringhe di bit, che il processore può interpretare ed eseguire direttamente Linguaggio Assembly

Dettagli

Linguaggio Assembly e linguaggio macchina

Linguaggio Assembly e linguaggio macchina Architettura degli Elaboratori e delle Reti Lezione 11 Linguaggio Assembly e linguaggio macchina Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano

Dettagli

MIPS! !

MIPS! ! MIPS! Sono descritte solamente le istruzioni di MIPS32, le pseudo-istruzioni, System Calls e direttive del linguaggio assembly che sono maggiormente usate.! MIPS è big-endian, cioè, lʼindirizzo di una

Dettagli

Università degli Studi di Cassino

Università degli Studi di Cassino Corso di Istruzioni di confronto Istruzioni di controllo Formato delle istruzioni in L.M. Anno Accademico 2007/2008 Francesco Tortorella Istruzioni di confronto Istruzione Significato slt $t1,$t2,$t3 if

Dettagli

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

Esercizio riassuntivo di traduzione e assemblaggio da linguaggio C ad assembly Motorola Esercizio riassuntivo di traduzione e assemblaggio da linguaggio C ad assembly Motorola 68000. Ultima modifica: 10 Maggio 2005. Autore: Daniele Paolo Scarpazza. Per segnalare eventuali difficoltà o problemi,

Dettagli

Il linguaggio macchina

Il linguaggio macchina Il linguaggio macchina Istruzioni macchina (PH 2.4) Indirizzamento (PH 2.9) Costanti a 32-bit (PH 2.9) 1 Linguaggio macchina Le istruzioni in linguaggio assembly devono essere tradotte in linguaggio macchina

Dettagli

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

Lezione 20. Assembly MIPS: Il set istruzioni, strutture di controllo in Assembly Architettura degli Elaboratori Lezione 20 Assembly MIPS: Il set istruzioni, strutture di controllo in Assembly Prof. F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano

Dettagli

Università degli Studi di Roma La Sapienza

Università degli Studi di Roma La Sapienza Università degli Studi di Roma La Sapienza Architettura degli elaboratori II Introduzione ai concetti ed al simulatore SPIM Indice degli argomenti Introduzione Assembler, compilatore, linker, programma

Dettagli

Linguaggio Assembly e linguaggio macchina

Linguaggio Assembly e linguaggio macchina Architettura degli Elaboratori e delle Reti Lezione 11 Linguaggio Assembly e linguaggio macchina Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano

Dettagli

Architettura dei calcolatori e sistemi operativi. Assemblatore e Collegatore (Linker) Capitolo 2 P&H Appendice 2 P&H

Architettura dei calcolatori e sistemi operativi. Assemblatore e Collegatore (Linker) Capitolo 2 P&H Appendice 2 P&H Architettura dei calcolatori e sistemi operativi Assemblatore e Collegatore (Linker) Capitolo 2 P&H Appendice 2 P&H Sommario Il processo di assemblaggio Il collegatore (linker) 2 Assemblatore: traduzione

Dettagli

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

Linguaggio macchina. Architettura degli Elaboratori e delle Reti. Il linguaggio macchina. Lezione 16. Proff. A. Borghese, F. Architettura degli Elaboratori e delle Reti Lezione 16 Il linguaggio macchina Proff. A. Borghese, F. Pedeini Dipaimento di Scienze dell Informazione Univeità degli Studi di Milano L 16 1/32 Linguaggio

Dettagli

MIPS Instruction Set 2

MIPS Instruction Set 2 Laboratorio di Architettura 15 aprile 2011 1 Architettura Mips 2 Chiamata a Funzione 3 Esercitazione Registri MIPS reference card: http://refcards.com/docs/waetzigj/mips/mipsref.pdf 32 registri general

Dettagli

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

Corso di Calcolatori Elettronici MIPS: Istruzioni di confronto Istruzioni di controllo Formato delle istruzioni in L.M. di Cassino e del Lazio Meridionale Corso di MIPS: Istruzioni di confronto Istruzioni di controllo Formato delle istruzioni in L.M. Anno Accademico 201/201 Francesco Tortorella Istruzioni di confronto Istruzione

Dettagli

Lecture 2: Prime Istruzioni

Lecture 2: Prime Istruzioni [http://www.di.univaq.it/muccini/labarch] Modulo di Laboratorio di Architettura degli Elaboratori Corso di Architettura degli Elaboratori con Laboratorio Docente: H. Muccini Lecture 2: Prime Istruzioni

Dettagli

Perché il linguaggio C?

Perché il linguaggio C? Il linguaggio C 7 Perché il linguaggio C? Larga diffusione nel software applicativo Standard di fatto per lo sviluppo di software di sistema Visione a basso livello della memoria Capacità di manipolare

Dettagli

Esempio di procedura annidata. L insieme delle istruzioni (5) Esempio di procedura annidata (2) set_array: Esempio di procedura annidata (3)

Esempio di procedura annidata. L insieme delle istruzioni (5) Esempio di procedura annidata (2) set_array: Esempio di procedura annidata (3) L insieme delle istruzioni (5) Architetture dei Calcolatori (lettere A-I) Esempio di procedura annidata Codice C Assumiamo che set_array sia la prima procedura chiamata Assumiamo che la variabile i corrisponde

Dettagli

Il linguaggio macchina

Il linguaggio macchina Architettura degli Elaboratori e delle Reti Lezione 16 Il linguaggio macchina Proff. A. Borghese, F. Pedeini Dipaimento di Scienze dell Informazione Univeità degli Studi di Milano L 16 1/33 Linguaggio

Dettagli

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

Invocazione di funzioni. Passaggio parametri Creazione record di attivazione (anche chiamato stack frame o area di attivazione) Invocazione di funzioni Passaggio parametri Creazione record di attivazione (anche chiamato stack frame o area di attivazione) Passaggio parametri F(a,b,c) { } Z = g(x, y, z) Record di attivazione o registri

Dettagli

L ambiente di simulazione SPIM

L ambiente di simulazione SPIM Architettura degli Elaboratori e delle Reti Lezione 14 L ambiente di simulazione SPIM Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano L 14 1/28

Dettagli

Esercizi. Assembly. Alessandro A. Nacci alessandro.nacci@polimi.it ACSO 2014/2014

Esercizi. Assembly. Alessandro A. Nacci alessandro.nacci@polimi.it ACSO 2014/2014 Esercizi Assembly Alessandro A. Nacci alessandro.nacci@polimi.it ACSO 2014/2014 1 RIPASSO Architettura dei registri del 68K Di (0 i 7): registri di dato a 8, 16, 32 bit Ai (0 i 7): resgistri di a 16, 32

Dettagli

Linguaggio Assembler MIPS

Linguaggio Assembler MIPS Linguaggio Assembler MIPS Corso di Calcolatori Elettronici Corso di Calcolatori Elettronici A A.A. 2000/2001 Dr. Daniela Fogli Notazione Operazioni aritmetiche: Somma add a, b, c fa la somma di b e c e

Dettagli

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

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

Dettagli

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

Le etichette nei programmi. Istruzioni di branch: beq. Istruzioni di branch: bne. Istruzioni di jump: j L insieme delle istruzioni (2) Architetture dei Calcolatori (lettere A-I) Istruzioni per operazioni logiche: shift Shift (traslazione) dei bit di una parola a destra o sinistra sll (shift left logical):

Dettagli

ISA e linguaggio macchina

ISA e linguaggio macchina ISA e linguaggio macchina Prof. Alberto Borghese Dipartimento di Scienze dell Informazione borghese@di.unimi.it Università degli Studi di Milano Riferimento sul Patterson: capitolo 4.2, 4.4, D1, D2. 1/55

Dettagli

Laboratorio di Architetture degli Elaboratori II (A.A )

Laboratorio di Architetture degli Elaboratori II (A.A ) Laboratorio di Architetture degli Elaboratori II (A.A. 2015-2016) Matteo Re, matteo.re@unimi.it [cognomi G-Z] (Nicola Basilico, [cognomi A-D]) Ufficio S210, Dipartimento di Informatica, Via Comelico 39/41-20135

Dettagli

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

Sommario Introduzione al linguaggio Assembly. Calcolatori Elettronici Prof. Gian Luca Marcialis. Le operazioni fondamentali Prof. Gian Luca Marcialis Corso di Laurea di Ingegneria Elettronica Capitolo 5 Linguaggio Assembly Fonti principali: Patterson, A.D., Hennessy, J., "Struttura, organizzazione e progetto dei calcolatori

Dettagli

Riassunto. Riassunto. Ciclo fetch&execute. Concetto di programma memorizzato. Istruzioni aritmetiche add, sub, mult, div

Riassunto. Riassunto. Ciclo fetch&execute. Concetto di programma memorizzato. Istruzioni aritmetiche add, sub, mult, div MIPS load/store word, con indirizzamento al byte aritmetica solo su registri Istruzioni Significato add $t1, $t2, $t3 $t1 = $t2 + $t3 sub $t1, $t2, $t3 $t1 = $t2 - $t3 mult $t1, $t2 Hi,Lo = $t1*$t2 div

Dettagli

1. Schema generale di traduzione di un programma. Lo schema generale di un programma puo' essere cosi schematizzato:

1. Schema generale di traduzione di un programma. Lo schema generale di un programma puo' essere cosi schematizzato: 1. Schema generale di traduzione di un programma Lo schema generale di un programma puo' essere cosi schematizzato: Inizializzazione delle variabili Input dei dati Elaborazione Output dei risultati Chiusura

Dettagli

Architettura degli Elaboratori

Architettura degli Elaboratori Architettura degli Elaboratori Linguaggio macchina e assembler (caso di studio: processore MIPS) slide a cura di Salvatore Orlando, Marta Simeoni, Andrea Torsello Architettura degli Elaboratori 1 1 Istruzioni

Dettagli

Laboratorio di Architettura degli Elaboratori

Laboratorio di Architettura degli Elaboratori Laboratorio di Architettura degli Elaboratori Dott. Massimo Tivoli Set di istruzioni del MIPS32: istruzioni aritmetiche e di trasferimento Istruzioni (Alcune) Categorie di istruzioni in MIPS Istruzioni

Dettagli

Architettura dei calcolatori e sistemi operativi. Set istruzioni e struttura del programma Direttive all Assemblatore.

Architettura dei calcolatori e sistemi operativi. Set istruzioni e struttura del programma Direttive all Assemblatore. Architettura dei calcolatori e sistemi operativi Set istruzioni e struttura del programma Direttive all Assemblatore Capitolo 2 P&H 23. 11. 2015 Istruzioni: sottoinsieme del linguaggio assembler MIPS Formati

Dettagli

Il linguaggio assembly

Il linguaggio assembly Il linguaggio assembly PH 2.3 (continua) 1 Argomenti Organizzazione della memoria Istruzioni di trasferimento dei dati Array Istruzioni logiche 2 1 La memoria del MIPS I contenuti delle locazioni di memoria

Dettagli

SOLUZIONI DELLA PROVA SCRITTA DEL CORSO DI. NUOVO E VECCHIO ORDINAMENTO DIDATTICO 28 Settembre 2006

SOLUZIONI DELLA PROVA SCRITTA DEL CORSO DI. NUOVO E VECCHIO ORDINAMENTO DIDATTICO 28 Settembre 2006 SOLUZIONI DELLA PROVA SCRITTA DEL CORSO DI NUOVO E VECCHIO ORDINAMENTO DIDATTICO 28 Settembre 26 MOTIVARE IN MANIERA CHIARA LE SOLUZIONI PROPOSTE A CIASCUNO DEGLI ESERCIZI SVOLTI ESERCIZIO 1 (8 punti)

Dettagli

L ambiente di simulazione SPIM

L ambiente di simulazione SPIM Architettura degli Elaboratori e delle Reti Lezione 14 L ambiente di simulazione SPIM Proff. A. Borghese, F. Pedersini Dipartimento di Scienze dell Informazione Università degli Studi di Milano L 14 1/20

Dettagli

Linguaggi e moduli. Dott. Franco Liberati

Linguaggi e moduli. Dott. Franco Liberati (canale A-D) A Linguaggi e moduli Dott. Franco Liberati Linguaggi di programmazione Compilatore Assemblatore Linker (collegatore) LINKER COMPILATORE ASSEMBLATORE LINGUAGGI DI PROGRAMMAZIONE Linguaggio

Dettagli

ISA (Instruction Set Architecture) della CPU MIPS

ISA (Instruction Set Architecture) della CPU MIPS Architettura degli Elaboratori Lezione 20 ISA (Instruction Set Architecture) della CPU MIPS Prof. Federico Pedersini Dipartimento di Informatica Uniersità degli Studi di Milano L16-20 1 Linguaggio macchina

Dettagli

Architettura degli Elaboratori II Laboratorio

Architettura degli Elaboratori II Laboratorio Università degli Studi di Milano Corso di Laurea in Informatica, A.A. 2016-2017 Architettura degli Elaboratori II Laboratorio 2016-2017 Nicola Basilico Dipartimento di Informatica Via Comelico 39/41-20135

Dettagli

Programmazione Assembly per 8088: Esercizi svolti

Programmazione Assembly per 8088: Esercizi svolti Programmazione Assembly per 8088: Esercizi svolti Marco Di Felice 13 dicembre 2006 1 Esercizio 1 (esercizio 1 del Tanenbaum, Appendice C) TESTO. Dopo l esecuzione dell istruzione MOV AX, 702 qual è il

Dettagli

Traduzione da C a Catena di compilazione

Traduzione da C a Catena di compilazione Traduzione da C a 68000 Vittorio Zaccaria Dicembre 2009 Catena di compilazione utilizzo di linguaggi intermedi di(ir) Analisi sintattica e trattamento degli errori Generazione del codice macchina linguaggio

Dettagli

MIPS Instruction Set 1

MIPS Instruction Set 1 Architettura degli Elaboratori e Laboratorio 20 marzo 2012 Istruzioni Comuni 1/3 Istruzioni Aritmetiche: Instruction Example Meaning Comments add add $1,$2,$3 $1=$2+$3 Always 3 operands subtract sub $1,$2,$3

Dettagli

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Fondamenti di Informatica 6. Algoritmi e pseudocodifica Vettori e matrici #1 Fondamenti di Informatica 6. Algoritmi e pseudocodifica Corso di Laurea in Ingegneria Civile A.A. 2010-2011 1 Semestre Prof. Giovanni Pascoschi Le variabili definite come coppie

Dettagli

Università degli Studi di Cassino

Università degli Studi di Cassino Corso di Assemblatori, Linker Loader Anno Accademico 2007/2008 Francesco Tortorella Dal produttore all esecutore Prima di essere eseguito, un programma attraversa le seguenti fasi: Traduzione Compilazione

Dettagli

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

Accesso a memoria. Accesso a memoria. Accesso a memoria. Modalità di indirizzamento. Lezione 5 e 6. Architettura degli Elaboratori A. < < } } Lezione 5 e 6 Accesso a memoria A questo livello di astrazione, la memoria viene vista come un array di byte Per ogni richiesta di un dato ad un certo indirizzo, la CPU ottiene un numero di byte

Dettagli

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

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 Esercizio 1 Compilare la seguete fuctio it esempio(it A[],it ) { it i; it somma; it j; i = 0; somma = 0; while i!= { somma = somma + A[i]; if somma < j = 0; else j = f2(a[i],somma); i = i + 1; $v0 retur

Dettagli

Fondamenti di Informatica

Fondamenti di Informatica Fondamenti di Informatica Prima prova intermedia - 11 Novembre 2009 Si risolvano i seguenti esercizi. Il compitino prevede un punteggio massimo di 15/14-esimi, cui andranno sommati i punti ottenuti nel

Dettagli

Sottoprogrammi in linguaggio assembly del Motorola 68000

Sottoprogrammi in linguaggio assembly del Motorola 68000 Sottoprogrammi in linguaggio assembly del Motorola 68000 Daniele Paolo Scarpazza daniele.scarpazza@elet.polimi.it Politecnico di Milano Ultimo aggiornamento: 10 Maggio 2005 Bibliografia Sezioni 4.9, 5.6

Dettagli

Università degli Studi di Cassino e del Lazio Meridionale Corso di Calcolatori Elettronici Assemblatori, Linker Loader

Università degli Studi di Cassino e del Lazio Meridionale Corso di Calcolatori Elettronici Assemblatori, Linker Loader di Cassino e del Lazio Meridionale Corso di Assemblatori, Linker Loader Anno Accademico Francesco Tortorella Dal produttore all esecutore Prima di essere eseguito, un programma attraversa le seguenti fasi:

Dettagli

Il Linguaggio Assembly: Gestione della memoria e controllo

Il Linguaggio Assembly: Gestione della memoria e controllo Il Linguaggio Assembly: Gestione della memoria e controllo Prof. Alberto Borghese Dipartimento di Scienze dell Informazione borghese@dsi.unimi.it Università degli Studi di Milano 1/42 Sommario L organizzazione

Dettagli

1. Si effettui la divisione di 7/5 utilizzando un efficiente algoritmo e illustrando la corrispondente architettura hardware.

1. Si effettui la divisione di 7/5 utilizzando un efficiente algoritmo e illustrando la corrispondente architettura hardware. 1. Si effettui la divisione di 7/5 utilizzando un efficiente algoritmo e illustrando la corrispondente architettura hardware. 2. Spiegare i diversi tipi di indirizzamento usati dalle istruzioni del set

Dettagli

Spazio di indirizzamento virtuale

Spazio di indirizzamento virtuale Programmazione M-Z Ingegneria e Scienze Informatiche - Cesena A.A. 016-01 Spazio di indirizzamento virtuale Pietro Di Lena - pietro.dilena@unibo.it // The function name says it all int stack_overflow (){

Dettagli

Passaggio di Parametri per Valore o Indirizzo

Passaggio di Parametri per Valore o Indirizzo Passaggio di Parametri per Valore o Indirizzo Come in C, l assembler permette di passare un dato per valore (copia) o per indirizzo, nel secondo caso rendendo modificabile il dato stesso da dentro una

Dettagli

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo.

Unità Didattica 4 Linguaggio C. Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. Unità Didattica 4 Linguaggio C Vettori. Puntatori. Funzioni: passaggio di parametri per indirizzo. 1 Vettori Struttura astratta: Insieme di elementi dello stesso tipo, ciascuno individuato da un indice;

Dettagli

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

Programmazione II. Lezione 7. Daniele Sgandurra 9/11/2010. Programmazione II Lezione 7 Daniele Sgandurra daniele.sgandurra@iit.cnr.it 9/11/2010 1/24 Programmazione II Lezione 7 9/11/2010 Sommario 1 Gestione della Memoria 2/24 Programmazione II Lezione 7 9/11/2010

Dettagli

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3)

Funzioni in C. Funzioni. Strategie di programmazione. Funzioni in C. Come riusare il codice? (2/3) Come riusare il codice? (1/3) Funzioni Il concetto di funzione Parametri formali e attuali Il valore di ritorno Definizione e chiamata di funzioni Passaggio dei parametri Corpo della funzione 2 Strategie di programmazione Riuso di

Dettagli

MIPS Instruction Set 1

MIPS Instruction Set 1 Laboratorio di Architettura 8 aprile 2011 1 SPIM 2 Architettura Mips 3 Esercitazione SPIM emulatore software architettura MIPS R2000/R3000 debugger + servizi base di sistema operativo realizzazione/verifica

Dettagli

Strategie di programmazione

Strategie di programmazione Funzioni Funzioni in C Il concetto di funzione Parametri formali e attuali Il valore di ritorno Definizione e chiamata di funzioni Passaggio dei parametri Corpo della funzione 2 Funzioni in C Strategie

Dettagli

Le costanti Le modalità di indirizzamento L assembly del MIPS

Le costanti Le modalità di indirizzamento L assembly del MIPS Le costanti Le modalità di indirizzamento L assembly del MIPS Prof. Alberto Borghese Dipartimento di Scienze dell Informazione borghese@dsi.unimi.it Università degli Studi di Milano 1/45 Sommario Le costanti

Dettagli

Calcolatori Elettronici A a.a. 2008/2009

Calcolatori Elettronici A a.a. 2008/2009 Calcolatori Elettronici A a.a. 2008/2009 ISA e LINGUAGGIO ASSEMBLY MIPS ESERCIZI Massimiliano Giacomin ESERCIZIO Utilizzando la green card, tradurre in linguaggio macchina le due istruzioni in assembly

Dettagli

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

Architettura degli Elaboratori. Classe 3 Prof.ssa Anselmo. Appello del 18 Febbraio Attenzione: Cognome.. Nome.... Architettura degli Elaboratori Classe 3 Prof.ssa Anselmo Appello del 18 Febbraio 2015 Attenzione: Inserire i propri dati nell apposito spazio sottostante e in testa a questa pagina.

Dettagli

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

Linguaggio assembler e linguaggio macchina (caso di studio: processore MIPS) Linguaggio assembler e linguaggio macchina (caso di studio: processore MIPS) Salvatore Orlando Arch. Elab. - S. Orlando 1 Livelli di astrazione Scendendo di livello, diventiamo più concreti e scopriamo

Dettagli

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili

Argomenti Avanzati.! I puntatori! Stack! Visibilità delle Variabili Linguaggio C Argomenti Avanzati! I puntatori! Stack! Visibilità delle Variabili 2 ! Il C consente di associare ai tipi di dati nomi definiti dal programmatore, mediante la parola chiave typedef! Dal punto

Dettagli

Calcolatori Elettronici A a.a. 2008/2009

Calcolatori Elettronici A a.a. 2008/2009 Calcolatori Elettronici A a.a. 2008/2009 ISA e LINGUAGGIO ASSEMBLY MIPS Massimiliano Giacomin 1 Architettura MIPS Architettura RISC e load-store sviluppata da John Hennessy nel 1981 Usata da NEC, Nintendo,

Dettagli

Assembly. Linguaggio di programmazione corrispondente al linguaggio macchina P.H. Cap. 2.1, 2.2 e App. A. Linguaggio assembly (App.

Assembly. Linguaggio di programmazione corrispondente al linguaggio macchina P.H. Cap. 2.1, 2.2 e App. A. Linguaggio assembly (App. Assembly Linguaggio di programmazione corrispondente al linguaggio macchina P.H. Cap. 2.1, 2.2 e App. A 1 Linguaggio assembly (App. A) Rappresentazione simbolica del linguaggio macchina Più comprensibile

Dettagli

Richiami sull architettura del processore MIPS a 32 bit

Richiami sull architettura del processore MIPS a 32 bit Caratteristiche principali dell architettura del processore MIPS Richiami sull architettura del processore MIPS a 32 bit Architetture Avanzate dei Calcolatori Valeria Cardellini E un architettura RISC

Dettagli

Ottenere una modifica del parametro attuale

Ottenere una modifica del parametro attuale Ottenere una modifica del parametro attuale Le variabili passate come parametri a una funzione, se alterate durante l esecuzione, non cambiano valore all uscita dalla funzione (parametri passati per valore)

Dettagli

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011

Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011 Laboratorio di Informatica Ingegneria Clinica Lezione 14-16/11/2011 Raffaele Nicolussi FUB - Fondazione Ugo Bordoni Via del Policlinico, 147 00161 Roma I puntatori Variabili e parametri Parametri formali

Dettagli

Introduzione. Indice. Linguaggio macchina. Linguaggio assembler

Introduzione. Indice. Linguaggio macchina. Linguaggio assembler Indice Linguaggio ad alto livello, linguagio assembler e linguaggio macchina Il linguaggio assembler MIPS: istruzioni aritmetiche, di trasferimento dati e di salto Conversione linguaggio assembler in linguaggio

Dettagli

Il linguaggio C. Puntatori e dintorni

Il linguaggio C. Puntatori e dintorni Il linguaggio C Puntatori e dintorni 1 Puntatori : idea di base In C è possibile conoscere e denotare l indirizzo della cella di memoria in cui è memorizzata una variabile (il puntatore) es : int a = 50;

Dettagli

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

21 March : ESERCITAZIONE 01 GESTIONE DELLA MEMORIA VETTORI CONTROLLOO O DI FLUSSO DI UN PROGRAMMA. I. Frosio 02: ESERCITAZIONE 01 21 March 2011 GESTIONE DELLA MEMORIA VETTORI CONTROLLOO O DI FLUSSO DI UN PROGRAMMA I. Frosio 1 SOMMARIO Organizzazione della memoria Istruzioni di accesso alla memoria Vettori Istruzioni

Dettagli

Il linguaggio assembly

Il linguaggio assembly Il linguaggio assembly Introduzione al linguaggio macchina Indice Che cos è l assembly Elementi del linguaggio Memoria di programma Registri interni e di I/O Registri particolari Rappresentazione dell

Dettagli

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

Architettura degli Elaboratori. Classe 3 Prof.ssa Anselmo. Appello del 19 Febbraio Attenzione: Cognome.. Nome.... Architettura degli Elaboratori Classe 3 Prof.ssa Anselmo Appello del 19 Febbraio 2016 Attenzione: Inserire i propri dati nell apposito spazio sottostante e in testa a questa pagina.

Dettagli

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

Scope delle variabili e passaggio parametri. Danilo Ardagna Politecnico di Milano Scope delle variabili e passaggio parametri Danilo Ardagna Politecnico di Milano 1-4-2014 Introduzione! Con le funzioni è stato introdotto un meccanismo per definire dei piccoli programmi all interno di

Dettagli

Esercizi da esame di Programmazione Assembler MIPS

Esercizi da esame di Programmazione Assembler MIPS Esercizi da esame di Programmazione Assembler MIPS Versione 1.04 (16 Gennaio 2004) Corso di Architettura Corso di Laurea in Informatica Università di Salerno Vittorio Scarano Premessa: questa è una raccolta

Dettagli