Architettura degli Elaboratori -...
-
Upload
hoangxuyen -
Category
Documents
-
view
235 -
download
0
Transcript of Architettura degli Elaboratori -...
Istruzioni di salto
Architettura degli elaboratori
BRANCH
Istruzione Significato
GOTO labelSalta in modo incondizionato all’istruzione etichettatada label
IFEQ labelPop della parola in cima allo stack; se la parola vale 0 salta all’istruzione etichettata da label
IFLT labelPop della parola in cima allo stack; se la parola ha un valore negativo salta all’istruzione etichettata da label
IF_ICMPEQ labelPop di due parole dalla cima dello stack; se le parole sono uguali salta all’istruzione etichettata da label
Salto incondizionato: quando si forza il programma a continuare la sua esecuzione da un’istruzione in una posizione specifica
Salto condizionato: quando al verificarsi di una condizione si forza il programma a continuare la sua esecuzione da un’istruzione specifica
ijvm
Instruction Set
Architettura degli elaboratori
METODI
Istruzione Significato
INVOKEVIRTUAL m Chiama il metodo m
IRETURNTermina l’esecuzione del metodo corrente e restituisce il controllo al metodo chiamante
ALTRE
Istruzione Significato
HALT Blocca l’esecuzione del programma nel simulatore
IINC v n Modifica la variabile v sommandoci n
ERR Scrive un messaggio di errore e blocca il simulatore
IN Legge un carattere dal buffer della testiera e lo salva in cima allo stack; se il buffer è vuoto salva 0
OUT Pop della parola in cima allo stack e la stampa in out
NOP Istruzione vuota: non fa nulla
WIDE Indica che la prossima istruzione sarà a 16 bit
ijvm
Costrutto if-else
Architettura degli elaboratori
Il costrutto if in un linguaggio ad alto livello ha la forma
if (condizione) istruzione/i
if (condizione) istruzione/i else istruzione/i
Nei linguaggi più basso livello non abbiamo il costrutto if
In IJVM si utilizzano le istruzioni di branch che controllano il valore (o i valori) in cima allo stack e in base al risultato della verifica saltano a un’istruzione specifica tramite un etichetta
ijvm
Esempio costrutto if
Architettura degli elaboratori
a = 5b = 7c = 6
If ( a <= 8 )a = b – c
.main
.varabc.end-var
BIPUSH 0x5ISTORE aBIPUSH 0x7ISTORE bBIPUSH 0x6ISTORE c
ILOAD aBIPUSH 0x8IF_ICMPEQ veroILOAD aBIPUSH 0x8ISUBIFLT veroHALT
Inizializzazione variabili
a = 8
a < 8
Istruzioni blocco if
vero:ILOAD bILOAD cISUBISTORE a HALT
.end-main
ijvm
Esempio costrutto if-else
Architettura degli elaboratori
a = 5b = 7c = 6
If ( a <= 8 )a = b – c
elsea = b + c
.main
.varabc.end-var
BIPUSH 0x5ISTORE aBIPUSH 0x7ISTORE bBIPUSH 0x6ISTORE c
ILOAD aBIPUSH 0x8IF_ICMPEQ veroILOAD aBIPUSH 0x8ISUBIFLT vero
ILOAD bILOAD cIADDISTORE aHALT
Inizializzazione variabili
a = 8
a < 8
Istruzioni blocco if
vero:ILOAD bILOAD cISUBISTORE a HALT
.end-main
Istruzioni blocco else
ijvm
Costrutti iterativi
Architettura degli elaboratori
Costrutti iterativi
while (condizione) istruzione/i
for (i=0, i < limite; i = i + 1) istruzione/i
In IJVM si utilizzano le stesse istruzioni di branch utilizzate per la selezione
Si utilizza anche il salto incondizionato: dopo che eseguo il blocco di istruzioni salto alle istruzioni che verificano la condizione
Attenzione ai cicli infiniti!
ijvm
Esempio costrutto while
Architettura degli elaboratori
while ( a < b ) {a = a * 3b = b * 2
}
.main
……ciclo:
ILOAD aILOAD bISUBIFLT bloccoGOTO continuo
blocco:ILOAD aDUPDUPIADDIADD ISTORE aILOAD bDUPIADDISTORE bGOTO ciclo
continuo:
……
.end-main
.main
……ciclo:
ILOAD bILOAD aISUBDUPIFEQ continuoIFLT continuo
ILOAD aDUPDUPIADDIADD ISTORE aILOAD bDUPIADDISTORE bGOTO ciclo
continuo:
……
.end-main
ijvm
Esempio costrutto for
Architettura degli elaboratori
for( i = 0; i <= 10; i = i + 1 )a = a * 3
.main
……BIPUSH 0x0 ISTORE i
ciclo:BIPUSH 0xaILOAD iISUBIFLT continuo
blocco:ILOAD aDUPDUPIADDIADD ISTORE aIINC i 1GOTO ciclo
continuo:
……
.end-main
ijvm
• Ogni volta che si richiama un metodo è necessario inserire il riferimentoal metodo e i parametri sullo stack (se sono presenti nella firma), cheformano il blocco del metodo
• Per ogni invocazione il metodo può accedere alle sole variabili nel proprioblocco. Il blocco riservato per ogni metodo che si esegue è detto recorddi attivazione (lo vedrete in dettaglio in altri corsi…)
• Per noi nel record ci sono il riferimento (semplicemente una costante chechiamiamo OBJREF), i parametri del metodo e le variabili
• Se la funzione è ricorsiva ogni chiamata porterà alla creazione di un nuovoblocco in cima allo stack
• Il blocco che sta in cima determina quale è il metodo che si sta eseguendoin quel momento, i blocchi inferiori appartengono ai metodi che sonosospesi in attesa del risultato della funzione chiamata
• Al termine dell’esecuzione della funzione con l’istruzione IRETURN il bloccoviene deallocato, in cima allo stack viene posto il valore di ritorno e siriprende l’esecuzione dalla funzione chiamante
Architettura degli elaboratori
Stack & Metodi
ijvm
.method mul( i, j )
.varr.end-var
BIPUSH 0x0ISTORE rILOAD iIFEQ fine
ciclo:ILOAD jIFEQ fineILOAD iILOAD rIADDISTORE rIINC j -1GOTO ciclo
Moltiplicazione
Architettura degli elaboratori
.constantOBJREF 0x40.end-constant
.main.varijr.end-var
BIPUSH 0x5ISTORE iBIPUSH 0x3ISTORE jLDC_W OBJREFILOAD iILOAD jINVOKEVIRTUAL mulISTORE rHALT
.end-main
fine:ILOAD rIRETURN
.end-method
ijvm
• Scrivere il codice IJVM per i metodi che calcolano la divisione intera (siaquoziente sia resto)
20 minArchitettura degli elaboratori
Esercizio
ijvm
.method div (a,b)
.varq.end-var
BIPUSH 0x0ISTORE q
loop:ILOAD aIFEQ end_loopILOAD aILOAD bISUBIFLT end_loopIINC q 0x1ILOAD aILOAD bISUBISTORE aGOTO loop
end_loop:ILOAD qIRETURN
.end-method
.method mod (a,b)
loop:ILOAD aIFEQ end_loopILOAD aILOAD bISUBIFLT end_loopILOAD aILOAD bISUBISTORE aGOTO loop
end_loop:ILOAD aIRETURN
.end-method
Architettura degli elaboratori
Soluzione
ijvm