A Jasmin programozási nyelv
Utasítások
Az utasításokról
Jasmin a JVM utasításkészletét használja.
Itt megmutatjuk, hogy milyen szintaxissal és paraméterekkel működnek az utasítások, valamint milyen kategóriákba sorolhatóak.
Lokális változókra vonatkozó utasítások
aload
aload < varnum >
vagy
wide
aload < varnum >
Az első sor egy előjel nélküli egész számot határoz meg 0-tól 0xFF-ig. A második bővebb forma,
itt < varnum > egy előjel nélküli 0-tól 0xFFFF.
Leírás:
Objektum referenciáját olvassa ki helyi változóból. Helyi változó referenciáját kapja értékül, és ezt beleteszi az operandusok vermébe.
Az
aload egyetlen paramétere azt jelzi, melyik helyi változót kell megkapni. Így
aload paraméterének valid
lokális változó-referenciát kell megadni.
astore
astore < varnum >
vagy
wide
astore < varnum >
Az első sor egy előjel nélküli egész számot határoz meg 0-tól 0xFF-ig. A második bővebb forma,
itt < varnum > egy előjel nélküli 0-tól 0xFFFF.
Leírás:
Objektum referenciáját tárolja helyi változóban. Helyi változó referenciáját veszi ki a veremből, és ezt beleteszi a
varnum által
meghatározott lokális változóba. Az
astore egyetlen paramétere azt jelzi, melyik helyi változónak kell az értéket
megkapnia. Így
astore paraméterének valid lokális változó-referenciát kell megadni.
Hasonló elven működő utasítások
fstore - mint az
astore, csak egyszeres lebegőpontos számot tárol objektum referencia helyett.
fload - mint az
aload, csak egyszeres lebegőpontos számmal.
dstore - mint az
fstore, csak duplapontos számmal.
dload - mint az
fload, csak duplapontos számmal.
istore - mint az
fstore, csak egész számmal.
iload - mint az
fload, csak egész számmal.
ret
ret < varnum >
vagy
wide
ret < varnum >
Az első sor egy előjel nélküli egész számot határoz meg 0-tól 0xFF-ig. A második bővebb forma,
itt < varnum > egy előjel nélküli 0-tól 0xFFFF.
Leírás:
Visszatér a szubrutinból, amit
jsr vagy
jsr_w utasításokkal hívtunk meg. Helyi változóból olvassa ki a
visszatérési címet. Visszatérés után a végrehajtás folytatódik, a helyi változóban mutatja a címet, hogy hol.
A bipush, sipush és iinc utasítások
bipush
bipush < n <
Egy bájtnyi adat kiterjesztése.
Leírás:
Egyetlen paramétert vár, egy 8-bites egész számot, ezt terjeszti ki 32-bites egésszé. Az eredményt az operandus verembe helyezi.
sipush
sipush < n <
Két bájtnyi adat kiterjesztése.
Leírás:
Egyetlen paramétert vár, egy 16-bites egész számot, ezt terjeszti ki 32-bites egésszé. Az eredményt az operandus verembe helyezi.
iinc
iinc < varnum > < n >
vagy
wide
iinc < varnum > < n >
Egész szám növelése lokális változóban.
Leírás:
Két paramétert vár,
varnum egy előjel nélküli szám 0-tól 0xFF-ig,
n pedig előjeles egész -128-tól 127-ig.
A
wide formában
varnum 0-tól 0xFFFF-ig előjel nélküli, míg
n -32768 és 32767 közötti előjeles egész.
Példa:
iinc 1 10 ; increment local variable 1 by 10.
iinc 1 -1 ; decrement local variable 1 by 1.
Ugró utasítások
goto
goto < label <
Ugrás megadott címre.
Leírás:
Egyetlen paramétert vár, egy címkét, amit a Jasmin offszetbájtként értelmez. A címkéből kiszámítja a fordító az offszetet, és ugrik
< aktuális cím > + < offszet > bájtot.
goto_w
goto_w < label <
Ugrás(hosszabb) megadott címre
Leírás:
Mint a
goto, csak az offszet 32-bites.
if_acmpeq
if_acmpeq < label >
Ugrás, ha két objektum referenciája azonos.
Leírás:
A verem tetejéről kiveszi a felső két objektum-referenciát. Ha ezek egyenlőek, akkor 16 bitnek megfeleltethető hellyel ugrik.
Ha nem egyenlőek, a végrehajtás megy tovább a parancs hívásától.
Példa:
aload_1 ; push the object reference in local variable 1 onto stack
aload_2 ; push the object reference in local variable 2 onto stack
if_acmpeq Label ; if the two references on the stack are identical, jump to Label
return ; return if not equal
Label:
; execution continues here if local variables 1 and 2 refer to the same object
Hasonló utasítások
if_acmpne - mint az
if_acmpeq, nemegyenlőséggel.
if_icmpeq - mint az
if_acmpeq, egészek egyenlősége esetén.
if_icmpge - mint az
if_icmpeq, ha az egyik egész nagyobb egyenlő, mint a másik.
if_icmpgt - mint az
if_icmpge, egyenlőség nélkül.
if_icmple - mint az
if_icmpge, fordított relációval.
if_icmpne - mint az
if_icmpeq, nemegyenlőség esetén.
ifeq
ifeg < label >
Ugrás, ha nulla van.
Leírás:
A verem tetejéről kiveszi a legfelső egészet. Ha ez nulla, akkor 16 bitnek megfeleltethető hellyel ugrik.
Ha nem nulla, a végrehajtás megy tovább a parancs hívásától.
Példa:
iload_1 ; push the int value in local variable 1 onto the stack
ifeq Label ; if the value of local variable 1 is zero, jump to Label
return ; return if local variable 1 is nonzero
Label:
; execution continues here if local variable 1 equals zero...
Hasonló utasítások(komment nélkül)
ifge
ifgt
ifle
iflt
ifne
ifnonnull
ifnonnull < label >
Ugrás, ha non-null érték van.
Leírás:
A verem tetejéről kiveszi a legfelső objektum-referenciát. Ha ez nem a null érték, akkor 16 bitnek megfeleltethető hellyel ugrik.
Ha nullérték, akkor a végrehajtás megy tovább a parancs hívásától.
Hasonló utasítások(komment nélkül)
ifnull
jsr
jsr < label >
Ugrás szubrutinra.
Leírás:
A metódus belsejében definiált szubrutint hívja meg. A Java
finally részének implementálásához használják.
A
jsr először a
pc+3 (
pc az aktuális utasítás címe, azaz a jsr-é) címen található adatot teszi a verembe,
mely az első utasítás a jsr után. Ehhez tér majd vissza a szubrutin hívása után. Ezután
pc+
offszet címhez ugrik,
ahol az offszetet a
label címke határozza meg.
Példa:
; This example method uses a PrintMe subroutine to invoke the System.out.println() method.
.method usingSubroutine()V
ldc "Message 1"
jsr PrintMe ; print "Message 1"
ldc "Message 2"
jsr PrintMe ; print "Message 2"
ldc "Message 3"
jsr PrintMe ; print "Message 3"
return ; now return from usingSubroutine
; define the PrintMe subroutine ...
PrintMe:
astore_1 ; store return-address in local variable 1
; call System.out.println()
getstatic java/lang/System/out Ljava/io/PrintStream;
invokevirtual java/io/PrintStream/println(Ljava/lang/String;)V
ret 1 ; return to the return-address in local variable 1
.end method
Hasonló utasítások
jsr_w - mint a jsr, csak hosszú címet használ.
Osztály és objektum műveletek
anewarray
anewarray < type <
Tömböt allokál objektumoknak.
Leírás:
Objektum-referenciákat tároló tömböt allokál. A verem tetejéról kivesz egy egészet, ennyi eleme lesz a tömbnek. Az elemek típusát
type határozza meg.
type lehet osztálynév, interfésznév vagy tömb-típus leíró.
Példa:
; Allocate a 10-element array of for holding references to
; Threads. This is like the Java code:
; Thread x[] = new Thread[10];
bipush 10
anewarray java/lang/Thread
astore_1 ; store the new array in local variable 1
; Allocate a multi-dimensional array like:
; new String[2][5]
; using anewarray. First, allocate new 2-element array for holding
; arrays of strings and store it in local variable 1.
iconst_2
anewarray [Ljava/lang/String; ; type descriptor for array-of-String
astore_1
; next, allocate first array of String[5] and store it in index 0
aload_1
iconst_0
bipush 5
anewarray java/lang/String
aastore
; finally, allocate second array of String[5] and store it in index 1
aload_1
iconst_1
bipush 5
anewarray java/lang/String
aastore
checkcast
checkcast < type >
Objektumnak vagy tömbnek a típusát ellenőrzi.
Leírás:
A verem tetejéről kiveszi a legfelső elemet, és megnézi, hogy lehetséges a castolás a megadott típussal.
Példa:
; push object in local variable 1 onto stack
aload_1
; check if it is an instance of Throwable or one of its subclasses.
checkcast java/lang/Throwable
; if execution reaches here, the object in local variable 1
; is still on the stack, and is either null or a Throwable object.
; ---
; Note that checkcast can also be used to check that an array belongs to a given type,
; e.g. to check that local variable 1 contains an array of Strings, use:
aload_1
checkcast [Ljava/lang/String;
; if execution reaches here, the object on the stack is an array of Strings, or it is null.
instanceof
instanceof < type >
Ellenőrzi az osztályok objektumait.
Leírás:
Először futásidőben kiértékeli a
type-ot, majd a verem tetejéről kiveszi a legfelső objektum-referenciát.
Ha a kapott referencia megfelel
type-nak, akkor int 1 megy vissza a verembe, különben int 0. ha a referencia
null,
akkor automatikusan int 0 kerül a verembe. Interfészekkel és interfész típusokkal ugyanígy működik az utasítás.
new
new < class >
Objektum létrehozása.
Leírás:
A paraméterül kapott osztály Java osztálynak felel meg. A
new utasítás meghatározza a példány méretét, adattagjait pedig
0-ra állítja(logikai és szám esetén, különben null lesz).
Példa:
; This example creates a new StringBuffer object. This is like the Java code:
;
; StringBuffer x = new StringBuffer();
; 1. use new to create a new object reference
new java/lang/StringBuffer
; 2. dup the object reference and call its constructor
dup
invokespecial java/lang/StringBuffer/()V
; 3. assign object reference on the stack to a local variable
astore_1
; local variable 1 now contains a StringBuffer object,
; ready for use
; the following example shows how to call a non-default
; constructor. It is like the Java code:
;
; StringBuffer x = new StringBuffer(100);
new java/lang/StringBuffer
dup
bipush 100
invokespecial java/lang/StringBuffer/(I)V
astore_1