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:
|
|
|
|
1° |
2° se 3<0!! |
2° |
3° |
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!
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.