architettura degli elaboratori -...

14
IJVM Architettura degli Elaboratori Danilo Dessì [email protected]

Upload: hoangxuyen

Post on 18-Feb-2019

232 views

Category:

Documents


0 download

TRANSCRIPT

IJVMArchitettura degli Elaboratori

Danilo Dessì

[email protected]

Instruction set

Architettura degli elaboratori ijvm

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