Esercizio n.24 Programmazionone in IJVM

 


Qual e' la rappresentazione in esadecimale dei byte nella Method Area corrispondenti al seguente codice in assembler IJVM?

.method zumpappero(a,i,j,k)
.var
bambi 
tippete
fiorellino
.end-var                              Soluzione:
                                      0x00    0x05    
                                      0x00    0x03
1          ILOAD i                     0x15    0x02
2       L: ISTORE tippete              0x36    0x06    
3          IINC tippete 4              0x84    0x06    0x04
3          BIPUSH 3                    0x10    0x03
4          DUP                         0x59
5          IF_LT L                     0x9B    0xFF    0xF8    
6          IRETURN                     0xAC
 
.end-method

 

N.B.

L’etichetta “L” si trova esattamente 8 locazioni prima (o 7 locazioni prima?) verifichiamolo:

 

scriviamo le istruzioni così come verranno salvate nella method area:

 

 

 

 

 

2° se 3<0!! 

18

0xAC

 

IRETURN

 

 

 

<- PC

17

0x008

 

BYTE - significativo di IF_LT

 

 

<- PC microistruzione “F”

 

16

0x00

 

BYTE + significativo di IF_LT

<- PC

 

 

 

15

0x9B

 

IF_LT

 

 

 

 

14

0x59

 

DUP

 

 

 

 

13

0x03

 

Valore di BIPUSH

 

 

 

 

12

0x10

 

BIPUSH

 

 

 

 

11

0x04

 

Valore di tippete

 

 

 

 

10

0x06

 

Variabile tippete

 

 

 

 

9

0x84

 

IINC

 

 

 

 

8

0x06

 

Var tippete

 

 

 

 

7

0x36

L:

ISTORE

 

<- PC

 

 

6

0x02

 

Parametro i

 

 

 

 

5

0x15

 

ILOAD

 

 

 

 

4

0x03

 

 

 

 

 

 

3

0x00

 

 

 

 

 

 

2

0x05

 

 

 

 

 

 

1

0x00

 

 

 

 

 

 

 

Al rigo 12 corrisponde la fine dell’istruzione iflt4..si salta..basta infatti conoscere il primo byte per conoscere il valore di N, viene quindi eseguita l’istruzione T con la quale si salva il valore precedente di PC (15) nell’apposito registro (OPC) e si salta a goto2.

Da qui per tornare al rigo 7 dovremo sommare –8 al valore salvato di PC ovvero 0xFF 0xF8

 

Come calcolare un valore negativo in esadecimale (a gentile richiesta di un collega!):

1° metodo.       

Con la calcolatrice!!

2° metodo.

Scrivere in binario il numero positivo, calcolarne il complemento a due e trasformarlo in esadecimale!

Esempio:

per calcolare -8:

   8 = 0000 1000 = 0x08

0                   8

 

        -8 = 1111 1000 = 0xF8

                                     F           8

 

Nota 2: ma in particolar modo questo programma mi pare che non possa mai eseguire un secondo ciclo poiché  prima di eseguire l’istruzione IFLT viene posto sulla stack il valore 3 e poi viene duplicato e su questo verrà quindi fatto il controllo per il salto ma 3 > 0 sempre! Ma tanto era solo un’esercitazione!

           

[Maurizio Morgano]
Altra Soluzione
0x00 0x05 0x00 0x03
0x15 0x03
0x36 0x07
0x84 0x07 0x04
0x10 0x03
0x59
0x9B 0xFF 0xFF 0xFF 0x08
0xAC
[Giorgio Stampa] In questa soluzione c'e' almeno un errore, poiche' i byte per rappresentare un offset nelle istruzioni di salto IJVM devono essere 2 e non 4.