Esercizi di Programmazione in IJVM
Esercizio 1
Fare gli esercizi 7 e 8 del Capitolo 4 del Tanenbaum.
Soluzione (By Roberto Ferraro).
Esercizio 2
Considerate un metodo Java che prenda in input due parametri formali
k e j (numeri interi) e che restituisca k+4 se 2*(j+k) e' maggiore di 15 e j-1
altrimenti.
Scrivere il codice IJVM che traduca tale metodo ed il segmento di codice
che traduca la chiamata di tale metodo con parametri attuali 5 e 7.
(La traduzione del metodo, che verra' inserita nella Method Area, deve
ovviamente contenere, nei primi 4 byte le informazioni relative
al numero di argomenti di variabili locali del metodo).
Fornire anche la rappresentazione in esadecimale del codice prodotto.
Soluzione (By M. Firrincieli).
Esercizio 3
Qual'e' il valore che si trova in cima allo stack dei dati
dopo l'esecuzione delle seguenti istruzioni IJVM?
BIPUSH 2
BIPUSH 3
IADD
BIPUSH 4
IADD
BIPUSH 4
BIPUSH 2
ISUB
BIPUSH 1
IADD
ISUB
Soluzione. (By Ferraro and Fede)
Esercizio 4
Qual'e' il valore che si trova in cima allo stack dei dati
dopo l'esecuzione delle seguenti istruzioni IJVM?
BIPUSH 3
BIPUSH 3
IADD
BIPUSH 3
IADD
IADD
BIPUSH 3
IADD
Soluzione.
Esercizio 4.8.11 dal libro
Quanto tempo ci vuole perché un Mic-1 di 200Mhz esegua l'istruzione Java
i=j+k? Dare la risposta in nanosec.
Soluzione (By M. Morgano)
Esercizio 5
Scrivere un segmento di codice IJVM che realizzi un metodo che prende
un numero in input e restituisce il numero la cui rappresentazione
e' il NOT logico bit a bit della rappresentazione del numero in input.
Esempio:
Rappresentazione dell'argomento del metodo: 0100110100111110
Rappresentazione del risultato : 1011001011000001
Aiutino: i numeri sono rappresentati in complemento a due. Inoltre
sommare un numero rappresentato in binario a se stesso equivale
ad uno spostamento a sinistra dei suoi bit.
Soluzione.
Esercizio 6
Fare l'esercizio 6 del capitolo 4 del Tanenbaum.
Soluzione. (By Firrincieli and Di Odoardo and D. Mancuso )
Esercizio 7
Fare l'esercizio 16 del capitolo 4 del Tanenbaum.
Esercizio 8
Supponete che tra le variabili locali di un certo metodo Java ci siano
due array di dieci numeri interi, chiamiamoli A e B.
Supponete che in questo metodo, ad un certo punto, volete copiare l'array
B nell'array A. Supponiamo che gli array siano realizzati come parole
consecutive nel Local Variable Frame e che il primo elemento di A
sia distante 13 da LV, mentre il primo elemento di B sia distante 23 da LV.
Scrivere un segmento di codice IJVM che traduca l'operazione di copiare
l'array B nell'array A.
Soluzione. (By Max Salfi)
Esercizio 9
In IJVM non abbiamo l'istruzione di Moltiplicazione ne' quella di
Divisione Intera. Scrivere del codice IJVM che realizzi queste funzioni
matematiche.
Soluzioni (By Daniele Mancuso; and Ferraro and Fede; and Mongelli; Giorgio Stampa).
Esercizio 10
Utilizzando l'esercizio 7, scrivere il codice di un metodo che
riceva a, b e c come parametri formali e restuisca il valore
dell'espressione ((a*b)+7) div c.
Soluzione (By Ferraro and Fede).
Esercizio 11
Supponete di avere un metodo Java che calcola il fattoriale
di un numero in modo ricorsivo. Scrivere il codice IJVM che traduce
tale metodo (cioe' tutta la parte che va inserita nella Method Area).
Scrivere inoltre il codice che realizza la chiamata del metodo con
parametro attuale 3.
Possibili soluzioni (By Ferraro and Fede; Giorgio Stampa).
Esercizio 12
Mostrare l'evoluzione dello Stack durante l'intera valutazione del fattoriale
di 3, calcolato con il codice dell'esercizio precedente.
Soluzione (By Ferraro and Fede).
Nella soluzione c'e' qualcosa che non mi convince, ma forse mi sbaglio...
Esercizio 13
Supponete di avere un metodo Java che calcola l'ennesimo elemento
della sequenza di Fibonacci (ovviamente in modo ricorsivo).
Scrivere il codice IJVM che traduce
tale metodo (cioe' tutta la parte che va inserita nella Method Area).
Scrivere inoltre il codice che realizza la chiamata del metodo con
parametro attuale 4.
Possibili soluzioni (By Roberto Ferraro and Marco Cristaldi; Giorgio Stampa).
Esercizio 14
Mostrare l'evoluzione dello Stack durante l'intera valutazione del quarto
elemento della sequenza di Fibonacci, calcolato con il codice dell'esercizio precedente.
Soluzione (By Chillemi Marco and Luca Andrea).
Esercizio 15
Controllare se la soluzione dell'esercizio 5 sia giusta.
Inoltre i commenti al codice della soluzione dell'esercizio 5 potrebbero
esser resi piu' chiari. Commentare in modo chiaro il codice.
Esercizio 16
Nella soluzione dell'esercizio 5 indicare il valore numerico che va sostituito
a Loop, E1 ed End nelle istrizioni IFEQ End, IFLT E1, GOTO Loop.
Soluzione (By R. Ferraro).
Esercizio 17
Modificare la soluzione dell'esercizio 5 in modo che il risultato parziale
sia contenuto in una variabile locale e non nello Stack dei dati e messo
sullo Stack dei dati solo prima di IRETURN.
Qual'e' il valore dei 4 byte che precedono il codice quando inserito
nella Method Area?
Soluzione (By R. Ferraro).
C'e' almeno un errore nella soluzione. Riguarda i primi 4 Bytes
che precedono il codice vero e proprio. Qual'e'?
Soluzione (By Ciccio Pata)
Esercizio 18
(a)
Considerate un metodo Java che prenda in input due parametri formali
k e j (numeri interi) e che restituisca (2*k)+4 se j e' uguale a zero
e j-1 altrimenti.
Scrivere il codice IJVM che traduca tale metodo ed il segmento di codice
che traduca la chiamata di tale metodo con parametri attuali 5 e 7.
(La traduzione del metodo, che verra' inserita nella Method Area, deve
ovviamente contenere, nei primi 4 byte le informazioni relative
al numero di argomenti e di variabili locali del metodo).
(b)
Disegnare lo Stack prima, durante e dopo l'esecuzione del codice IJVM che
traduce il metodo del punto (a).
Soluzione
Esercizio 19
(a) Perche' durante la sua esecuzione l'istruzione INVOKEVIRTUAL di IJVM
si va a recuperare nella Method Area il numero degli argomenti del metodo?
A cosa gli serve tale informazione?
(b)
L'istruzione INVOKEVIRTUAL di JVM (non di IJVM!) invece ha esplicitamente
tra i suoi argomenti
anche il numero di parametri del metodo che stiamo invocando. Perche' deve avere
tale informazione? Perche' non puo' andarsela a prendere, come fa
l'INVOKEVIRTUAL di IJVM, nei primi byte del codice nella Method Area?
Soluzione
Esercizio 20
(a)
Scrivere alcune istruzioni IJVM
che, memorizzate a partire dal byte 33, siano tali che dopo l'esecuzione della terza il PC
valga 41. Nel codice non devono esser presenti etichette simboliche. Gli eventuali
argomenti delle istruzioni devono essere tutti valori numerici espliciti.
(b)
Scrivere un segmento di codice IJVM che inserisca sullo stack i numeri
da 0 a 35.
Ovviamente tale codice deve essere composto da molto meno di 35 istruzioni.
Possibile soluzione
Esercizio 21
Scrivere il codice IJVM corrispondente ad un metodo Java che abbia
due numeri naturali come parametri e che restituisca
il piu' grande dei parametri se il piu' piccolo e' uguale a 0, altrimenti
restituisca il piu' piccolo dei parametri
(Se il valore dei parametri e' uguale restituisce tale valore).
Qual'e' il valore dei 4 byte che precedono il codice quando inserito nella Method Area?
Fare un esempio di chiamata di tale metodo.
Possibili soluzioni (...; by Giorgio Stampa; ...)
Esercizio 22
(a)
Considerate un metodo JAVA che abbia 4 parametri, b3, b2, b1 e b0,
che possono avere come valore 0 o 1.
Il metodo restituisce il numero la cui rappresentazione in binario e' b3 b2 b1 b0.
Scrivere il codice IJVM che traduca tale metodo ed il segmento di codice che traduca
la chiamata di tale metodo con parametri attuali 1,1,0,1.
Specificare quali saranno i 4 byte che verranno inseriti nella method area prima del codice
IJVM che traduce il metodo.
(b)
Dire se c'e' qualcosa che non va nella seguente sequenza di byte (rappresentati in esadecimale)
che si suppone essere inserita nella Method Area come traduzione di un metodo java.
0x00 0x02 0x00 0x02 0x10 0x05 0x15 0x07 0x60 0xAC
Possibili soluzioni
Esercizio 23
Nella soluzione dell'esercizio 22(a) si propone l'implementazione in IJVM di
un algoritmo di conversione da binario (codice posizionale binario per
numeri naturali) a decimale.
Modificare il programma fornito in modo che implementi un algoritmo
di conversione dalla rappresentazione di interi in complemento a due a decimale.
Esercizio 24
Qual e' la rappresentazione in esadecimale dei byte che vengono inseriti
nella Method Area a seguito della
traduzione del seguente codice in assembler IJVM?
.method zumpappero(a,i,j,k)
.var
bambi
tippete
fiorellino
.end-var
ILOAD i
L: ISTORE tippete
IINC tippete 4
BIPUSH 3
DUP
IF_LT L
IRETURN
.end-method
Possibili soluzioni
Esercizio 25
Quali errori ci sono nel seguente codice assembler IJVM?
.method zumpappero(a,i,j,k)
.var
bambi
tippete
fiorellino
.end-var
BIPUSH 734
ILOAD 9
IADD
IADD
GOTO 5
.end-method
Soluzione (by Maurizio Morgano)
Esercizio 26
Supponete di non avere in IJVM l'istruzione IADD e che
per fare una somma abbiate pero' a disposizione un metodo add.
Con queste assunzioni, scrivere del codice in assembler IJVM che traduca
il metodo Java che calcola la moltiplicazione in modo ricorsivo
utilizzando la somma nel seguente modo:
x*0 = 0
x*y = x + x*(y-1) se y e' diverso da 0
Possibile soluzione (by Giorgio Stampa)
Esercizio 27
E' possibile che quello che segue
(ovviamente per facilita' di lettura non abbiamo scritto
tutto in esadecimale) e' quello che viene
posto nella method area dopo aver tradotto un metodo Java?
Ci sono errori o incongruenze, quali, perche'?
0x00 0x02 0x00 0x02
BIPUSH 734
ILOAD 6
IADD
IADD
GOTO 5
Soluzione
Esercizio 28
Il cugino del noto matematico Fibonacci, tal Birbonacci, e' famoso
per le sue sequenze di Birbonacci (esiste una sequenza di Birbonacci
per ogni numero naturale). Gli elementi della n-esima sequenza di Birbonacci
sono definiti ricorsivamente nel seguente modo :
Birb(n,0) = n
Birb(n,1) = n2
Birb(n,m) = n + ( Birb(n,m-1) * Birb(n,m-1) )
Scrivere un metodo IJVM che prenda in input due valori a e b e
calcoli il b-esimo numero della a-esima sequenza di Birbonacci,
in altre parole, che calcoli Birb(a,b).
Supponete di avere a disposizione un metodo per il calcolo del prodotto
di due naturali.
Soluzione
Esercizio 29
Il fratello del salumiere del matematico Birbonacci, tal Birichinacci, si accorse che
le sequenze di Birbonacci non erano molto interessanti e potevano andar bene
solo per fare degli esercizi di esame. Cosi' invento' quelle che son chiamate
le sequenze di Birichinacci su cui scrisse anche un libro che gli permise
di fare carriera accademica.
Gli elementi della n-esima sequenza di Birichinacci
sono definiti ricorsivamente nel seguente modo :
Biric(n,0) = n
Biric(n,1) = n2
Biric(n,m) = n + ( Birb(n,m-1) * Birb(n,m-2) )
Scrivere un metodo IJVM che prenda in input due valori a e b e
calcoli il b-esimo numero della a-esima sequenza di Birichinacci,
in altre parole, che calcoli Biric(a,b).
Supponete di avere a disposizione un metodo per il calcolo del prodotto
di due naturali.
Possibile soluzione (by Giorgio Stampa)
Esercizio 30
Scrivere la sequenza di byte (in esadecimale) da inserire nella method area e che
che si ottiene dalla traduzione del seguente codice asssembly IJVM.
.method (a,b,c)
.var
i
j
.end-var
ILOAD a
ISTORE i
BIPUSH 3
ILOAD b
ISUB
IFEQ label
ILOAD j
IFEQ label
IINC j 1
label: IRETURN
.end-method
Soluzione
Esercizio 31
Supponiate di avere la seguente funzione in un certo linguaggio di programmazione:
function uhuh (a,b : int)
localvar n,x : int
begin
x <- 3;
for n from 1 to a
do
if x == 73
then x = ohoh(x+1, b)
else x = x-b
enddo
return x
end
dove "==" indica il predicato di uguaglianza tra interi e "=" e' l'assegnamento.
Traducete la funzione uhuh in assembler IJVM. (ohoh e' un altra funzione che si suppone
aver gia' scritto)
Fornire poi la traduzione della stessa funzione in IJVM, ma
non utilizzando alcuna pseudoistruzione
dell'assembler IJVM e supponendo che nella method area il primo
byte della traduzione della funzione ohoh verra'
memorizzato all'indirizzo 200 e che tale indirizzo verra' memorizzato
nel constant pool a distanza 4 dalla base del constant pool.
Soluzione
Esercizio 32
Descrivere il comportamento delle istruzioni IJVM INVOKEVIRTUAL e IRETURN, mostrando
anche graficamente lo stato in cui deve trovarsi lo Stack prima della loro
esecuzione. Mostrare anche quale sara' lo stato dello Stack dopo la loro
esecuzione.
Lo Stack fisico in realta' realizza vari Stack logici relativi alla
macchina astratta IJVM, quali?
Soluzione
Esercizio 33
(a)
Dire cosa fa il seguente metodo IJVM.
.method xx(m,n)
BIPUSH 0
lab: ILOAD m
ILOAD n
ISUB
DUP
ISTORE m
IFLT eti
BIPUSH 1
IADD
GOTO lab
eti: IRETURN
.end-method
Riscrivere il metodo senza utilizzare tutte le potenzialita' dell'assembler IJVM,
cioe' rappresentando m ed n e le etichette direttamente come valori numerici.
(b)
Fare una bella domanda intelligente le cui risposta sia
"nel terzo e quarto byte".
Soluzione
Esercizio 34
Scrivere un metodo IJVM che conti il numero di bit uguali ad 1
contenuti nella parola (di 32 bit) che viene passata come argomento al metodo.
Possibili soluzioni (By DJGecchi et al.)
Esercizio 35
Considerate un metodo Java che prenda in input due parametri formali k e j (numeri interi) e che restituisca (2*k)+4 se j e' uguale a zero e j-1 altrimenti.
Scrivere il codice IJVM puro (non assembly IJVM) che traduca tale metodo ed il segmento di codice che traduca la chiamata di tale metodo con parametri attuali 5 e 7.
Possibile soluzione
Esercizio 36
Si consideri il seguente metodo IJVM.
.method boh(n)
ILOAD n
IFEQ et
BIPUSH 1
ILOAD n
IF_ICMPEQ et
LDC_W objref
ILOAD n
BIPUSH 2
ISUB
INVOKEVIRTUAL boh
IRETURN
et: ILOAD n
IRETURN
.end-method
Dire cosa calcola.
Ricopiare il codice commentandolo in modo sintetico
Scrivere del codice IJVM che corrisponda ad una chiamata del metodo boh
che non ne faccia terminare l'esecuzione.
Soluzione
Esercizio 37
Scrivere un metodo in assembly IJVM che corrisponda alla traduzione
della seguente funzione scritta nel fantastico linguaggio
di programmazione ITALIAN.
Funzion Pippo(arg1, arg2, arg3)
Se arg1 Piugrandougual arg2
Allor Restituisc Pippo(2Perarg2, arg3Menoarg2, arg3)
Altriment Restituisc arg1Piu'arg2Piu'arg3
Findellafunzion
Soluzione
Esercizio 38
(proposto By D. Mancuso)
Prima di eseguire la IRETURN, sulla testa dello Stack degli operandi
ci deve essere il valore restituito dal metodo. Deve essere l'unico
valore contenuto nello Stack degli operandi o non importa se sotto
ce ne sono altri?
Esercizio 39
La seguente sequenza di byte (abbiamo lasciato per leggibilita'
i nomi dei codici operativi)
0x00 0x04 0x03 0x00
BIPUSH 0xAA
ILOAD 0x09
IADD
GOTO 0x00 0x05
dovrebbe essere il risultato della traduzione di un metodo assembly
IJVM
.method zumpappero(a,i,j,k)
.var
bambi
tippete
fiorellino
.end-var
> ISTRUZIONI DI ZUMPAPPERO <
.end-method
In realta' la sequenza di byte fornita non puo' essere il risultato della
traduzione del metodo zumpappero, per tanti motivi. Elencarli e discuterli
molto brevemente.
Soluzione
Esercizio 40
Considerate un metodo Java che prenda in input due parametri formali k e j (numeri interi)
e che restituisca (3*k)+4 se j e' uguale a zero e j-1 altrimenti.
Scrivere il codice assembly IJVM che traduca tale metodo ed il segmento di codice che traduca la chiamata di tale metodo con parametri attuali 5 e 7.
Soluzione
Esercizio 41
Scrivere un metodo in assembly IJVM che, preso un argomento, restituisca
il numero di bit ad 1 della sua rappresentazione binaria. Commentare il codice
per renderne chiaro il comportamento.
(Per chi volesse utilizzarlo: si ricorda che lo shift a sinistra di una
posizione della rappresentazione binaria di un numero si puo' ottenere sommando
il numero a se stesso).
Possibili Soluzion1 (by G.Rizza)
Esercizio 42
(a) Scrivere un metodo height-operand-stack in assembly IJVM
che calcoli l'altezza che ha l'Operand Stack del metodo che invoca height-operand-stack
al momento in cui questo viene invocato.
(b)
Scrivere il metodo assembly IJVM che calcoli la funzione ricorsiva H come nella
seguente definizione.
H(x) = if (x=0) then 0 else 1+H(H(x-1)-1)+H(x-1)
Soluzione
Esercizio 43
Scrivere in assembly IJVM il codice di un
metodo che prenda in input tre argomenti, a, b, c e che restuisca
il valore dell'espressione (a+b+7)* c. Supporre di avere a disposizione un
metodo assembly IJVM chiamato Multiply
che calcoli la moltiplicazione (indicata con * nell'espressione).
Soluzione
Esercizio 44
È possibile che quello che segue (ovviamente per facilità di lettura
non abbiamo scritto tutto in esadecimale) è quello
che viene posto nella method area dopo aver tradotto
un metodo Java? Ci sono errori o incongruenze, quali, perchè?
Soluzione
Esercizio 45
Scrivere il metodo assembly IJVM che calcoli la funzione H utilizzando
l'algoritmo descritto dalla seguente definizione ricorsiva di H.
H(x) = if (x=0) then 2 else 1+H(x-1)
Soluzione
Esercizio 46
Supponiate che un programma in assembler IJVM, tradotto e caricato
nella Method Area sia formato dal codice
corrispondente ad un .main e dal codice di due metodi A e B.
Supponiate inoltre che il codice dei due
metodi sia formato dallo stesso numero di byte n.
Se volessimo sostituire al posto di A e B altri due metodi, C e D,
anch'essi formati da n byte,
quali istruzioni dovremmo modificare?
Cosa occorrerebbe modificare
nella Constant Pool?
Cosa occorrerebbe modificare nello Stack?
E se invece volessimo "invertire" di posto nella Method Area
i codici di A e di B, quali istruzioni dovremmo modificare?
Cosa occorrerebbe modificare
nella Constant Pool?
Cosa occorrerebbe modificare nello Stack?
Motivare le risposte.
Soluzione
Esercizio 47
Un tale che (vallo a capire) si fa chiamare gioppc ha un cugino, che si chiama
Bernardone e che ha fatto un affarone al mercatino delle pulci:
ha comprato un "livellatore automatico di numeri naturali" straordinario:
è un apparecchietto picojava con una PROM su cui scrivere una volta per tutte il programma in assembly IJVM che calcola la funzione livella(x,y) utilizzando il seguente algoritmo:
se x=y restituisci 0)
se x>y restituisci 1+livella(x-1, y)
altrimenti restituisci 1+livella(x,y-1)
Scrivere il codice assembly IJVM per il calcolo di livella(x,y).
Gioppc sostiene che livella(x,y)
calcola la differenza, in valore assoluto, tra i due numeri inseriti.
(By Gioppc)
Soluzione (By DJGecchi)
Esercizio 48
Tradurre in Java (o in qualsiasi altro linguaggio ad alto livello, anche
in modo non sintatticamente preciso) il seguente metodo IJVM.
.method paraponzi (a,b,c)
ILOAD b
ILOAD a
IF_ICMPEQ L
ILOAD b
ILOAD a
ISUB
IFLT L
ILOAD c
ILOAD a
IADD
IRETURN
L LDC_W objref
ILOAD b
DUP
IADD
ILOAD c
ILOAD b
ISUB
ILOAD c
INVOKEVIRTUAL paraponzi
IRETURN
.end-method
Possibile soluzione
Esercizio 49
Descrivere il comportamento delle istruzioni IJVM INVOKEVIRTUAL e IRETURN
e il loro effetto sullo Stack.
Esercizio 50 (By Carlo Russo)
Tradurre in Java (o in qualsiasi altro linguaggio ad alto livello, anche
in modo non sintatticamente preciso) il seguente metodo IJVM.
.method paraponzi (a,b,c)
ILOAD b
ILOAD a
IF_ICMPEQ L
ILOAD b
ILOAD a
ISUB
IFLT L
ILOAD c
ILOAD a
IADD
IRETURN
L LDC_W objref
ILOAD b
DUP
ILOAD c
ILOAD b
ISUB
ILOAD c
INVOKEVIRTUAL paraponzi
IRETURN
.end-method
Possibile soluzione (By Carlo Russo)
Esercizio 51
Tradurre in Java (o in qualsiasi altro linguaggio ad alto livello, anche
in modo non sintatticamente preciso) il seguente metodo assembly IJVM, supponendo che
esista un metodo IJVM di nome "mult" che esegue la moltiplicazione tra due
numeri.
.method cuccuruccuccu (J,K)
ILOAD K
IFEQ End
LDC_W OBJREF
ILOAD J
LDC_W OBJREF
ILOAD J
ILOAD K
BIPUSH 1
ISUB
INVOKEVIRTUAL cuccuruccuccu
INVOKEVIRTUAL mult
IRETURN
End: BIPUSH 1
IRETURN
.end-method
Tradurre poi il metodo assembly IJVM cuccuruccucu in IJVM puro (per quel che si puo';
per quel che non si puo' dare comunque indicazioni).
Cosa calcola cuccuruccuccu?
Possibile soluzione
Esercizio 52
Scrivere un metodo assembly IJVM che calcoli la seguente funzione f sui numeri
naturali:
f(x) = if x ≤ 3 then 2 else (f(x-1) + f(x-3))
Possibile soluzione
Esercizio 53
Supponiate di avere a disposizione in IJVM un'istruzione GETCH che pone sullo Stack
il primo elemento del buffer circolare relativo alla realizzazione di I/O con interruzioni
come descritto nelle note del corso "Esempio (con simulatore) di realizzazione di
Input/Outpur con interruzioni".
Scrivere un metodo IJVM che, preso un numero n non negativo, calcoli quanti sono
gli elementi uguali 0 tra i primi n del buffer circolare (tali n elementi vengono
ovviamente eliminati dal buffer tramite la GETCH).
Possibile soluzione
Esercizio 54
Supponiate di avere a disposizione in IJVM un'istruzione GETCH che pone sullo Stack
il primo elemento del buffer circolare relativo alla realizzazione di I/O con interruzioni
come descritto nelle note del corso "Esempio (con simulatore) di realizzazione di
Input/Outpur con interruzioni".
Scrivere un metodo in assembly IJVM che restituisca il valore 3n, dove n e'
il primo elemento nel buffer circolare (che si assume rappresenti un numero naturale).
Si puo' assumere di avere a disposizione un metodo mult che esegue il prodotto.
Commentare il codice
Possibile soluzione
Esercizio 55
Si consideri il seguente metodo java per il calcolo della dvisione intera di
due numeri naturali (supponendo che il secondo sia diverso da zero)
int div (int n, int m)
{
int count = 0;
while(n >= m)
{
n = n - m;
count++;
}
return count;
}
Si traduca tale metodo in assembly IJVM.
Possibile soluzione
Esercizio 56
Si modifichi il metodo java dell'esercizio 55 in modo da trattare due numeri
interi qualsiasi (con il secondo diverso da zero) e lo si traduca poi in
assembly IJVM.
Possibile soluzione (By DJGecchi)
Esercizio 57
Tradurre in assembly IJVM il seguente metodo:
public int owl(int x, int y)
{
int counter = 0;
while(counter < 12)
{ x = counter + x + y;
counter = counter + 1;
}
return castle(x);
}
Supporre di avere gia' un metodo IJVM di nome "castle".
Tradurre il metodo cosi' com'e', senza fare ottimizzazioni.
Commentare il codice.
Possibile soluzione
Esercizio 58
Fornire un metodo Java la cui possibile traduzione in assembly IJVM sia il seguente
codice.
.method Quetal(a,b)
.var
n
x
.end-var
BIPUSH 3
ISTORE x
BIPUSH 1
ISTORE n
loop: ILOAD x
BIPUSH 73
IF_ICMPEQ then
ILOAD x
ILOAD b
ISUB
ISTORE x
GOTO check
then: LDCW OBJREF
ILOAD x
BIPUSH 1
IADD
INVOKEVIRTUAL Quetal
ISTORE x
check:ILOAD n
ILOAD a
IF_ICMPEQ end
IINC n 1
GOTO loop
end: ILOAD x
IRETURN
.end-method
Possibile soluzione
Esercizio 59
Fornire un metodo Java la cui possibile traduzione in assembly IJVM sia il seguente
codice.
.method Quetal(a,b)
.var
n
x
.end-var
BIPUSH 3
ISTORE x
BIPUSH 1
ISTORE n
loop: ILOAD x
BIPUSH 73
IF_ICMPEQ then
ILOAD x
ILOAD b
ISUB
ISTORE x
GOTO check
then: LDCW OBJREF
ILOAD x
BIPUSH 1
IADD
ILOAD b
INVOKEVIRTUAL Quetal
ISTORE x
check:ILOAD n
ILOAD a
IF_ICMPEQ end
IINC n 1
GOTO loop
end: ILOAD x
IRETURN
.end-method
Possibile soluzione
Esercizio 60
Supponiamo di avere il linguaggio Mic-1 privo delle operazioni
di rd, wr e fetch e di avere un traduttore che traduce frammenti
di codice Mic-1 in metodi IJVM che restituiscono sempre il valore
dell'ultimo registro modificato.
La traduzione del seguente frammento Mic-1
MBR=PC=1
H=MBRU<<8
H=MBRU OR H
OPC=PC+1
sara' quindi un codice del tipo
.method trad()
.var
mar
mdr
pc
mbr
sp
lv
cpp
tos
opc
h
.end-var
CODICE-IJVM
.end-method.
Sostituire CODICE-IJVM con il risultato della traduzione del frammento
Mic-1 di cui sopra.
N.B. il codice deve risultare dalla traduzione in sequenza
delle singole istruzioni Mic-1.
Possibile soluzione (corretta by M.Consiglio)
Esercizio 61
In un esercizio tra quelli presenti sul sito si chiede
di aggiungere l'istruzione IRADIX ad IJVM.
Tale istruzione prende il valore in cima allo Stack e lo sostituisce
con l'approssimazione intera della sua radice quadrata.
L'esercizio in questione non chiede di implementare completamente tale istruzione in Mic-1, pero' si
vuole che l'istruzione IRADIX abbia quanto detto come effetto,
supponendo di avere a disposizione un metodo IJVM, radint,
che calcola appunto
l'approssimazione intera della radice quadrata.
L'esercizio consiste nello scrivere un programma Mic-1.
Tale programma (che potete trovare nella soluzione dell'esercizio in questione)
non deve far altro che preparare lo Stack per l'invocazione del
metodo radint e fare cio' che farebbe INVOKEVIRTUAL (conoscendo gia' il
numero di variabili locali ed argomenti del metodo radint).
Quello che invece si chiede ora e' la cosa seguente:
per risolvere correttamente l'esercizio occorre anche implementare
in Mic-1 il ritorno dal metodo radint, oppure la normale
istruzione IRETURN sarebbe sufficiente? Giustificare adeguatamente la risposta.
Esercizio 62
Si supponga che sia presente nella Constant Pool una costante "Ticks-number"
(e anche che tale costante sia modificabile dal sistema operativo).
Si supponga inoltre di avere un metodo assembly IJVM "Ding", con zero argomenti,
il cui effetto, quando invocato, e' quello di far suonare brevemente una campanella.
(si puo´supporre che Ding, dovendo comunque restituire un valore, come fanno
tutti i metodi, restituisca 0).
Scrivere un metodo assemlby IJVM con un argomento n, che faccia suonare la campanella
n*Ticks-number volte, e che restituisca 0 o 1 a seconda che la campanella sia stata suonata
un numero pari o dispari di volte.
Si puo' supporre, se si vuole, di avere a disposizione un metodo Mult
che esegue la moltiplicazione.
Possibile soluzione
Esercizio 63
Scrivere un metodo assembly IJVM che calcoli il Coefficiente Binomiale,
Binomial(n,k), utilizzando l'usuale definizione ricorsiva:
Binomial(n,k) = 1 se k=0
Binomial(n,k) = 1 se n=k
Binomial(n,k) = Binomial(n-1,k) + Binomial(n-1,k-1) altrimenti
(ovviamente esistono modi piu' efficienti per calcolare il
coefficiente binomiale)
Esercizio 64
Perche' l'istruzione IJVM puro GOTO 2, non puo' mai appartenere a codice prodotto da
un corretto processo di traduzione di codice assembly IJVM?
Soluzione
Esercizio 65
Scrivere un metodo assembly IJVM che calcoli il Coefficiente Binomiale,
Binomial(n,k), utilizzando l'usuale definizione ricorsiva:
Binomial(n,k) = 1 se k=0
Binomial(n,k) = 1 se n=k
Binomial(n,k) = Binomial(n-1,k) + Binomial(n-1,k-1) altrimenti
Possibile soluzione
Esercizio 66
Scrivere il codice piu' corto possibile in IJVM puro che esegua un loop infinito
che non fa' nulla. Giustificare la risposta.
Soluzione
Esercizio 67
Scrivere un metodo assembly IJVM tale che
la rappresentazione in esadecimale dei byte che vengono inseriti nella Method Area
a seguito della sua traduzione sia:
0x00 0x05 0x00 0x03 0x15 0x02 0x59 0x36 0x06 0x84 0x06
0x04 0x10 0x03 0x59 0x9B 0x00 0x05 0x15 0x07 0x60 0xAC
(Si ricordi il significato dei primi 4 byte di un metodo
presente nella Method Area.)
In seguito si programmi in assembly IJVM una chiamata a
tale metodo (utilizzando sempre 0 per gli argomenti) e si
forniscano i byte della sua traduzione (rappresentati in esadicimale).
Possibile soluzione
Esercizio 68
Tradurre in JAVA o in qualsiasi linguaggio ad alto livello, il seguente metodo assembly IJVM.
.method Boh(x)
ILOAD x
IFEQ zero
BIPUSH 1
LDCW objref
LDCW objref
ILOAD x
BIPUSH 1
ISUB
INVOKEVIRTUAL Boh
BIPUSH 1
ISUB
INVOKEVIRTUAL Boh
LDCW objref
ILOAD x
BIPUSH 1
ISUB
INVOKEVIRTUAL Boh
IADD
IADD
GOTO fine
base: BIPUSH 0
fine: IRETURN
.end-method
Possibile soluzione
Esercizio 69
Descrivere nel modo piu' dettagliato possibile il meccanismo attraverso il quale,
nella macchina IJVM, e' realizzato il passaggio di parametri ad un metodo IJVM.
Esercizio 70
Quale valore viene restituito dal seguente metodo assembly IJVM?
Giustificare.
.method X (n)
.var
c
.end_var
BIPUSH 0
ISTORE c
ILOAD n
BIPUSH 1
IF_ICMPEQ end
LDC_W objref
ILOAD n
BIPUSH 1
ISUB
INVOKEVIRTUAL X
end IINC c 2
ILOAD c
IRETURN
.end_method
Possibile soluzione
Esercizio 71
Descrivere il comportamento dell'istruzione WIDE di IJVM e discutere della sua implementazione.
in Mic-1.
Esercizio 72
Quanto tempo ci vuole affinche' un Mic-1 a 400Mhz esegua l'istruzione Java
i=j+k? Fornire la risposta in nanosec.
(Si suppone che tutti i livelli superiori a quello IJVM siano realizzati per traduzione)
Soluzione
Esercizio 73
Scrivere il codice assembly IJVM corrispondente ad un metodo Java che abbia
tre numeri naturali come parametri e che restituisca
il piu' grande dei parametri se il piu' piccolo e' uguale a 0, altrimenti
restituisca il piu' piccolo dei parametri .
Qual e' il valore dei 4 byte che precedono il codice una volta tradotto ed inserito nella Method Area?
Soluzione
Esercizio 74
Scrivere un metodo assembly IJVM che calcoli il numero massimo di 1 consecutivi
contenuti nella parola (di 32 bit) che viene passata come argomento al metodo.
Possibile soluzione
Esercizio 75
Scrivere un metodo assembly IJVM che calcoli il numero di 1 consecutivi
contenuti nella parola (di 32 bit) che viene passata come argomento al metodo.
Esercizio 76
Scrivere un metodo assembly IJVM che controlli se i 4 byte che formano
la parola che viene passata come argomento al metodo hanno un 1
nel bit 3 (hanno cioe' la forma ****1***).
Il metodo deve restituire 1 se il controllo da'
esito positivo, 0 altrimenti.
Si supponga di avere a disposizione il metodo div che esegue la divisione
intera.
Possibile soluzione
Esercizio 77
Supponiamo di avere una funzione binaria h(i,j), e che questa sia
implementata da un metodo H in assembly IJVM.
Scrivere un metodo assembly IJVM che, preso n, calcoli l'n esimo elemento della sequenza di gigionacci, definito ricorsivamente come segue:
gig(0) = 1
gig(1) = 1
gig(n)= h(gig(n-1),gig(n-2))
Possibile soluzione
Esercizio 78
Supponamo di aver esteso la macchina IJVM con una
nuova istruzione SET-CPOOL. Tale istruzione prende la parola
in cima allo Stack (eliminandola dallo Stack stesso) e la
inserisce nell'elemento 26 della Constant Pool.
E' possibile realizzare tale estensione di IJVM su Mic-1? E su Mic-2?
Supponiamo ora di poter collegare l'elemento 25 della Costant Pool
alle linee di Request di 3 possibili Master di un bus
(tali linee Request sono connesse ai bit da 0 a 2 dell'elemento 25).
L'elemento 26 della Constant Pool, invece,
viene collegato alle linee di Grant dei 3 possibili Master
(tali linee Grant sono connesse ai bit da 0 a 2 dell'elemento 26).
Realizzare un metodo assembly IJVM (che ovviamente non termina mai)
che implementi un arbitro per un
arbitraggio centralizzato a stella (simile a quello del PCI bus per
intenderci).
Possibile soluzione
Esercizio 79
Implementare un decodificatore a 32 uscite come
metodo assembly IJVM.
Tale metodo prendera' in input un numero n compreso tra
0 a 31 e restituira' la stringa di 32 bit che sarebbe
prodotta da un circuito decodificatore (decoder)
con 5 input e 32 output.
Possibile soluzione
Esercizio 80
Descrivere dettagliatamente il comportamento dell'istruzione INVOKEVIRTUAL.
E' possibile avere, in un programma assembly IJVM ottenuto dalla
traduzione di un programma Java, due istruzioni INVOKEVIRTUAL consecutive?
In caso affermativo, fornire un esempio (sia frammento di codice Java che corrispondente traduzione assembly IJVM). In caso negativo, descrivere
in modo sufficientemente dettagliato il motivo (sia per quanto riguarda il linguaggioJava, che per quanto riguarda il linguaggio assembly IJVM).
Esercizio 81
Quello che segue e' il codice della realizzazione dell'istruzione
INVOKEVIRTUAL in Mic-2.
Ricopiare e commentare sinteticamente tale codice, indicando l'effetto e la finalita'
delle varie microistruzioni.
invokevirtual1 MAR = CPP + MBR2U; rd
invokevirtual2 OPC = PC
invokevirtual3 PC = MDR
invokevirtual4 TOS = SP - MBR2U
invokevirtual5 TOS = MAR = H = TOS + 1
invokevirtual6 MDR = SP + MBR2U + 1; wr
invokevirtual7 MAR = SP = MDR
invokevirtual8 MDR = OPC; wr
invokevirtual9 MAR = SP = SP + 1
invokevirtual10 MDR = LV; wr
invokevirtual11 LV = TOS; goto(MBR1)