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