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)