ILOAD 1
ILOAD 2
ISUB
IFLT L1 // if arg1 >= arg2 goto L1
ILOAD 1
IFEQ L2
ILOAD 1
end:IRETURN
L1: ILOAD 2
IFEQ L3
ILOAD 2
GOTO end
L2: ILOAD 2
GOTO end
L3: ILOAD 1
GOTO end
Questo codice ha due argomenti (ovviamente passati sullo Stack)
e non ha variabili locali. Questo significa che i 4 byte che precedono
questo codice quando inserito nella Method Area sono 0x00 0x02 0x00 0x00
Una possibile chiamata e' la seguente
BIPUSH OBJREF (*)
BIPUSH 5
BIPUSH 7
INVOKEVIRTUAL m1 (**)
(*) In IJVM si suppone per semplicita' che ci sia un unico
oggetto. Quindi OBJREF sarebbe ridondante come informazione
da porre sullo Stack. Per uniformita' con JVM si pone lo stesso.
Il Tanenbaum pero' non chiarisce cosa sia di preciso OBJREF.
(**) dove m1 e' la posizione relativa al CPP contenente l'indirizzo
del nostro metodo nella method area.
----------------------------
La soluzione precedente mi sembra alquanto confusa e per niente
ottimizzata.
Questa dovrebbe essere un po' migliore.
.method confronta (j,k)
ILOAD J
DUP
IFEQ L1
ILOAD K
DUP
IFEQ L2
ISUB
IFLT L2
L1: ILOAD K
GOTO End
L2: ILOAD J
End:IRETURN
.end-method
I quattro byte che precedono il codice nella Method Area devono essere:
0x00 0x03 0x00 0x00
in quanto i parametri in ingresso sono 2(J,K)+OBJREF, che é considerato
anch'esso un parametro.
OBJREF si carica sulla stack con l'opcode LDC_W, non con BIPUSH, in
quanto si tratta di un valore nella Constant Pool, mentre BIPUSH serve a caricare
un valore tramite indirizzamento immediato.
[Giorgio Stampa]
________________________________________________________________________________
UN'ALTRO ESERCIZIO È QUELLO N'21 DI IJVM
I LOAD K
I LOAD J
I SUB
IFLT LI
I LOAD K
BIPUSH 0
IFICMPEQ L3
I LOAD K
I STORE K
LI
I LOAD J
BIPUSH 0
IFICMPEQ L2
ILOAD J
I STORE
GOTO FINE
L2
ILOAD K
I STORE
L3
ILOAD J
I STORE
FINE