(A), aaload , aastore , aconst_null , aload , aload_0 , aload_1 , aload_2 , aload_3 , anewarray , areturn , arraylength , astore , astore_0 , astore_1 , astore_2 , astore_3 , athrow , (B), baload , bastore , bipush , (C), caload , castore , checkcast , (D), d2f , d2i , d2l , dadd , daload , dastore , dcmpg , dcmpl , dconst_0 , dconst_1 , ddiv , dload , dload_0 , dload_1 , dload_2 , dload_3 , dmul , dneg , drem , dreturn , dstore , dstore_0 , dstore_1 , dstore_2 , dstore_3 , dsub , dup , dup_x1 , dup_x2 , dup2 , dup2_x1 , dup2_x2 , (F), f2d , f2i , f2l , fadd , faload , fastore , fcmpg , fcmpl , fconst_0 , fconst_1 , fconst_2 , fdiv , fload , fload_0 , fload_1 , fload_2 , fload_3 , fmul , fneg , frem , freturn , fstore , fstore_0 , fstore_1 , fstore_2 , fstore_3 , fsub , (G), getfield , getstatic , goto , goto_w , (I), i2b , i2c , i2d , i2f , i2l , i2s , iadd , iaload , iand , iastore , iconst_m1 , iconst_0 , iconst_1 , iconst_2 , iconst_3 , iconst_4 , iconst_5 , idiv , if_acmpeq , if_acmpne , if_icmpeq , if_icmpge , if_icmpgt , if_icmple , if_icmplt , if_icmpne , ifeq , ifge , ifgt , ifle , iflt , ifne , ifnonnull , ifnull , iinc , iload , iload_0 , iload_1 , iload_2 , iload_3 , imul , ineg , instanceof , invokeinterface , invokespecial , invokestatic , invokevirtual , ior , irem , ireturn , ishl , ishr , istore , istore_0 , istore_1 , istore_2 , istore_3 , isub , iushr , ixor , (J), jsr , jsr_w , (L), l2d , l2f , l2i , ladd , ladd , laload , land , lastore , lcmp , lconst_0 , lconst_1 , ldc , ldc_w , ldc2_w , ldiv , lload , lload_0 , lload_1 , lload_2 , lload_3 , lmul , lneg , lookupswitch , lor , lrem , lreturn , lshl , lshr , lstore , lstore_0 , lstore_1 , lstore_2 , lstore_3 , lsub , lushr , lxor , (M), monitorenter , monitorexit , multianewarray , (N), new , newarray , nop , (P), pop , pop2 , putfield , putstatic , (R), ret , return , (S), saload , sastore , sipush , swap , (T), tableswitch , (W), wide
Jasmin-Instruktionen können zwischen den Direktiven .method
und .end method eingefügt werden. Die Syntax der Jasmin-Instruktionen
orientiert sich dabei am Befehlssatz der virtuellen Java-Maschine (siehe
Übersicht). Eine JVM-Instruktion setzt sich aus einem
Operationscode (Opcode) und folgenden Operandenbytes zusammen, wobei die Anzahl
der Operandenbytes auch null sein kann. Innerhalb einer Klassendatei (code-Array)
könnten z.B. die JVM-Instruktionen bb 00 01 zum Erzeugen eines
neuen Objekts einer Klasse und b7 00 02 zum Aufruf eines Konstruktors
stehen. Das erste Byte der JVM-Instruktionen ist der Opcode, dem ein mnemonisches
Kürzel zugeordnet ist. Die beiden Operandenbytes der JVM-Instruktionen adressieren
Byteabschnitte (Konstanten) im Konstantenpool der Klassendatei. Die Position der
Konstanten im Pool ist im Allgemeinen nicht fest vorgeschrieben und hängt vom
Generator (Assembler, Compiler) der Klassendatei ab. Im Beispiel wird auf die
erste und die zweite Konstante verwiesen, die wiederum auf weitere Konstanten im
Pool verweisen. Die beiden durch 00 01 und 00 02
adressierten Konstanten können zu Zeichenketten aufgelöst werden. Die folgende
Übersicht zeigt den Zusammenhang zwischen JVM-Instruktionen und
Jasmin-Instruktionen:
bb 00 01 JVM-Instruktion
new 00 01
new java/lang/String Jasmin-Instruktion
b7 00 02 JVM-Instruktion
invokespecial 00 02
invokespecial java/lang/String/<init>()V Jasmin-Instruktion Die Operationscodes bb und b7 können direkt
durch die mnemonischen Kürzel new und invokespecial
ersetzt werden. Die Operandenbytes 00 01 und 00 02
führen nach deren Auflösung zu den Zeichenketten java/lang/String
und java/lang/String/<init>()V . Die Zeichenketten sind
im Kostantenpool codiert enthalten (bis auf den dritten Schrägstrich innerhalb
der zweiten Zeichenkette). So steht z.B. die Byteabfolge
6a 61 76 61 2f 6c 61 6e 67 2f 53 74 72 69 6e 67 in einer zugehörigen
Klassendatei, die die erste Zeichenkette codiert. Zwischen einer JVM-Instruktion
und einer Jasmin-Instruktion besteht also der folgende Zusammenhang: Eine
Jasmin-Instruktion kann aus einer JVM-Instruktion abgeleitet werden, indem
zunächst der Operationcode durch dessen mnemonisches Kürzel ersetzt wird und
anschließend vorhandene Operandenbytes ausgewertet werden. Sind keine
Operandenbytes vorhanden, besteht die JVM-Instruktion aus einem einzigen Byte
(Operationscode) bzw. einem dazugehörigen mnemonischen Kürzel. Die JVM-Instruktion
ist in diesem Fall identisch mit der Jasmin-Instruktion. Beispiel: Der
Operantionscode bzw. die JVM-Instruktion b1 hat die Mnemonik
return , welches auch eine Jasmin-Instruktion ist.
Beispiel: Erzeugung eines Objekts
Als Beispiel soll ein kurzes Jasmin-Listing angegeben werden, das ein neues
Objekt der Klasse String erzeugt. Dazu wird die Jasmin-Anweisung
new <classname> verwendet. Da die alleinige Verwendung von
new keine vollständige Erzeugung eines Objekts darstellt, müsste
zusätzlich noch ein entsprechender Konstruktor (Instanzinitialisierungsmethode)
mit invokespecial aufgerufen werden, um die Objekterzeugung
abzuschließen. Das folgende Listing enthält innerhalb der main -Methode
einen Abschnitt zur Generierung eines Objekts der Klasse String :
Listing 5.9. NewExample.j . Erzeugung eines Objekts der Klasse String
mit new und invokespecial .
.bytecode 50.0
.class public NewExample
.super java/lang/Object
.method public <init>()V
.limit stack 1
.limit locals 1
aload_0
invokespecial java/lang/Object/<init>()V
return
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 2
.limit locals 2
new java/lang/String
dup
invokespecial java/lang/String/<init>()V
astore_1
return
.end method
Dem Assemblerquelltext NewExample.j entspricht der folgende
Java-Quelltext:
/* NewExample.java */
public class NewExample {
public static void main(String[] args) {
String s = new String();
}
}
Beispiel: Die Instruktionen tableswitch
und lookupswitch
Innerhalb von Java-Quelltexten kann die switch -Anweisung
verwendet werden. Der Java-Compiler javac übersetzt diese
Mehrfachverzweigung auf Bytecodeebene, indem die JVM-Instruktionen
tableswitch oder lookupswitch verwendet bzw. in die
entsprechende Klassendatei geschrieben werden. Die Entscheidung des Compilers,
welche dieser beiden Anweisungen genutzt wird, hängt von den konkret
verwendeten case -Konstanten ab. Innerhalb eines Jasmin-Quelltextes
können tableswitch
und lookupswitch
ebenfalls mit entsprechender Syntax verwendet werden, um Merhfachverzweigungen
nachzubilden. Um dies zu verdeutlichen, soll für den folgenden Java-Quelltext
ein Äquivalent auf Assemblerebene gefunden werden.
/* LookupTableSwitchExample.java */
public class LookupTableSwitchExample {
public static void main(String[] args) {
int a = 4;
int b = 0;
switch (a) {
case 3: b++;
break;
case 4: b += 2;
break;
case 6: b += 3;
break;
default: b += 5;
}
b--;
a = 2;
b = 0;
switch (a) {
case -50: b++;
break;
case 230: b += 2;
break;
case 2: b += 3;
break;
default: b += 5;
}
b--;
}
} Das Listing LookupTableSwitchExample.java enthält zwei
switch -Anweisungen. Das Beispiel kann mit javac in
die Klassendatei LookupTableSwitchExample.class übersetzt werden.
Durch ein geeignetes Programm können nun die einzelnen Zahlenwerte, die jeweils
im Bereich von 0 bis 255 liegen, dieser Datei zugänglich gemacht werden (Hexdump).
Dabei wird deutlich, dass die erste switch -Anweisung in die JVM-Instruktion
tableswitch übersetzt wurde, da an entsprechender Stelle der
Opcode aa auftritt. Für die zweite Mehrfachverzweigung wird
lookupswitch verwendet. Auch das anschließende Jasmin-Listing verwendet
diese unterschiedlichen Realisierungen, um die switch -Anweisungen aus
LookupTableSwitchExampl.java nachzubilden.
Listing 5.10. LookupTableSwitchExample.j . Realisierung von Mehrfachverzweigungen
mittels tableswitch und lookupswitch .
.bytecode 50.0
.class public LookupTableSwitchExample
.super java/lang/Object
.method public <init>()V
.limit stack 1
.limit locals 1
aload_0
invokespecial java/lang/Object/<init>()V
return
.end method
.method public static main([Ljava/lang/String;)V
.limit stack 1
.limit locals 3
iconst_4
istore_1
iconst_0
istore_2
iload_1
tableswitch 3 6
Label36
Label42
Label54
Label48
default : Label54
Label36:
iinc 2 1
goto Label57
Label42:
iinc 2 2
goto Label57
Label48:
iinc 2 3
goto Label57
Label54:
iinc 2 5
Label57:
iinc 2 -1
iconst_2
istore_1
iconst_0
istore_2
iload_1
lookupswitch
-50 : Label100
2 : Label112
230 : Label106
default : Label118
Label100:
iinc 2 1
goto Label121
Label106:
iinc 2 2
goto Label121
Label112:
iinc 2 3
goto Label121
Label118:
iinc 2 5
Label121:
iinc 2 -1
return
.end method
Syntax der Jasmin-Instruktionen
In Tabelle 5.1 sind alle Jasmin-Instruktionen
mit zugehöriger Syntax aufgelistet, die innerhalb der Direktiven
.method und .end method verwendet werden können.
Zu jeden dieser Jasmin-Instruktionen ist ein zugehöriges mnemonisches Kürzel
der entsprechenden Anweisung der virtuellen Java-Maschinen angegeben. In den ersten
beiden Spalten der Tabelle stehen Informationen zum Operationscode der
JVM-Instruktionen, wobei die erste Spalte die dezimalen und die zweite Spalte die
hexadezimalen Zahlenwerte der Opcodes enthalten.
Tabelle 5.1. Operationscodes, Mnemoniks der Java Virtual Machine und zugehörige
Jasmin-Syntax.
Opcode |
JVM-Mnemonik |
Syntax Jasmin-Instruktionen |
0 |
0x00 |
nop |
nop |
1 |
0x01 |
aconst_null |
aconst_null |
2 |
0x02 |
iconst_m1 |
iconst_m1 |
3 |
0x03 |
iconst_0 |
inconst_0 |
4 |
0x04 |
iconst_1 |
iconst_1 |
5 |
0x05 |
iconst_2 |
iconst_2 |
6 |
0x06 |
iconst_3 |
iconst_3 |
7 |
0x07 |
iconst_4 |
iconst_4 |
8 |
0x08 |
iconst_5 |
iconst_5 |
9 |
0x09 |
lconst_0 |
lconst_0 |
10 |
0x0a |
lconst_1 |
lconst_1 |
11 |
0x0b |
fconst_0 |
fconst_0 |
12 |
0x0c |
fconst_1 |
fconst_1 |
13 |
0x0d |
fconst_2 |
fconst_2 |
14 |
0x0e |
dconst_0 |
dconst_0 |
15 |
0x0f |
dconst_1 |
dconst_1 |
16 |
0x10 |
bipush |
bipush <integer> |
integer : Ganzzahl aus den Bereichen
-128 <= integer <= -2 oder
6 <= integer <= 127
Beispiel: bipush 10
|
17 |
0x11 |
sipush |
sipush <integer> |
integer : Ganzzahl aus den Bereichen
-32768 <= integer <= -129 oder
128 <= integer <= 32767
Beispiel: sipush 128
|
18 |
0x12 |
ldc |
ldc <value> |
value : Ganzzahl (int -Zahl) oder
Gleitkommazahl (float -Zahl) oder String .
Beispiele: ldc 10 , ldc 3.4 ,
ldc "Hello World!"
|
19 |
0x13 |
ldc_w |
ldc_w <value> |
value : Ganzzahl (int -Zahl) oder
Gleitkommazahl (float -Zahl) oder String .
Die Instruktion ldc_w ist identisch mit
ldc , außer dass ldc_w einen erweiterter Index im
Konstantenpool besitzt.
Beispiele: ldc_w 10 , ldc_w 3.4 ,
ldc_w "Hello World!"
|
20 |
0x14 |
ldc2_w |
ldc2_w <value> |
value : Ganzzahl (long -Zahl) oder
Gleitkommazahl (double -Zahl).
Beispiele: ldc2_w 2147483648 ,
ldc2_w 3.141592653589793
|
21 |
0x15 |
iload |
iload <varindex> |
varindex : Index im Array der lokalen Variablen,
varindex <= 255.
Beispiel: iload 7
|
22 |
0x16 |
lload |
lload <varindex> |
varindex : Index im Array der lokalen Variablen,
varindex <= 255.
Beispiel: lload 7
|
23 |
0x17 |
fload |
fload <varindex> |
varindex : Index im Array der lokalen Variablen,
varindex <= 255.
Beispiel: fload 7
|
24 |
0x18 |
dload |
dload <varindex> |
varindex : Index im Array der lokalen Variablen,
varindex <= 255.
Beispiel: dload 7
|
25 |
0x19 |
aload |
aload <varindex> |
varindex : Index im Array der lokalen Variablen,
varindex <= 255.
Beispiel: aload 7
|
26 |
0x1a |
iload_0 |
iload_0 |
27 |
0x1b |
iload_1 |
iload_1 |
28 |
0x1c |
iload_2 |
iload_2 |
29 |
0x1d |
iload_3 |
iload_3 |
30 |
0x1e |
lload_0 |
lload_0 |
31 |
0x1f |
lload_1 |
lload_1 |
32 |
0x20 |
lload_2 |
lload_2 |
33 |
0x21 |
lload_3 |
lload_3 |
34 |
0x22 |
fload_0 |
fload_0 |
35 |
0x23 |
fload_1 |
fload_1 |
36 |
0x24 |
fload_2 |
fload_2 |
37 |
0x25 |
fload_3 |
fload_3 |
38 |
0x26 |
dload_0 |
dload_0 |
39 |
0x27 |
dload_1 |
dload_1 |
40 |
0x28 |
dload_2 |
dload_2 |
41 |
0x29 |
dload_3 |
dload_3 |
42 |
0x2a |
aload_0 |
aload_0 |
43 |
0x2b |
aload_1 |
aload_1 |
44 |
0x2c |
aload_2 |
aload_2 |
45 |
0x2d |
aload_3 |
aload_3 |
46 |
0x2e |
iaload |
iaload |
47 |
0x2f |
laload |
laload |
48 |
0x30 |
faload |
faload |
49 |
0x31 |
daload |
daload |
50 |
0x32 |
aaload |
aaload |
51 |
0x33 |
baload |
baload |
52 |
0x34 |
caload |
caload |
53 |
0x35 |
saload |
saload |
54 |
0x36 |
istore |
istore <varindex> |
varindex : Index im Array der lokalen Variablen,
varindex <= 255.
Beispiel: istore 7
|
55 |
0x37 |
lstore |
lstore <varindex> |
varindex : Index im Array der lokalen Variablen,
varindex <= 255.
Beispiel: lstore 7
|
56 |
0x38 |
fstore |
fstore <varindex> |
varindex : Index im Array der lokalen Variablen,
varindex <= 255.
Beispiel: fstore 7
|
57 |
0x39 |
dstore |
dstore <varindex> |
varindex : Index im Array der lokalen Variablen,
varindex <= 255.
Beispiel: dstore 7
|
58 |
0x3a |
astore |
astore <varindex> |
varindex : Index im Array der lokalen Variablen,
varindex <= 255.
Beispiel: astore 7
|
59 |
0x3b |
istore_0 |
istore_0 |
60 |
0x3c |
istore_1 |
istore_1 |
61 |
0x3d |
istore_2 |
istore_2 |
62 |
0x3e |
istore_3 |
istore_3 |
63 |
0x3f |
lstore_0 |
lstore_0 |
64 |
0x40 |
lstore_1 |
lstore_1 |
65 |
0x41 |
lstore_2 |
lstore_2 |
66 |
0x42 |
lstore_3 |
lstore_3 |
67 |
0x43 |
fstore_0 |
fstore_0 |
68 |
0x44 |
fstore_1 |
fstore_1 |
69 |
0x45 |
fstore_2 |
fstore_2 |
70 |
0x46 |
fstore_3 |
fstore_3 |
71 |
0x47 |
dstore_0 |
dstore_0 |
72 |
0x48 |
dstore_1 |
dstore_1 |
73 |
0x49 |
dstore_2 |
dstore_2 |
74 |
0x4a |
dstore_3 |
dstore_3 |
75 |
0x4b |
astore_0 |
astore_0 |
76 |
0x4c |
astore_1 |
astore_1 |
77 |
0x4d |
astore_2 |
astore_2 |
78 |
0x4e |
astore_3 |
astore_3 |
79 |
0x4f |
iastore |
iastore |
80 |
0x50 |
lastore |
lastore |
81 |
0x51 |
fastore |
fastore |
82 |
0x52 |
dastore |
dastore |
83 |
0x53 |
aastore |
aastore |
84 |
0x54 |
bastore |
bastore |
85 |
0x55 |
castore |
castore |
86 |
0x56 |
sastore |
sastore |
87 |
0x57 |
pop |
pop |
88 |
0x58 |
pop2 |
pop2 |
89 |
0x59 |
dup |
dup |
90 |
0x5a |
dup_x1 |
dup_x1 |
91 |
0x5b |
dup_x2 |
dup_x2 |
92 |
0x5c |
dup2 |
dup2 |
93 |
0x5d |
dup2_x1 |
dup2_x1 |
94 |
0x5e |
dup2_x2 |
dup2_x2 |
95 |
0x5f |
swap |
swap |
96 |
0x60 |
iadd |
iadd |
97 |
0x61 |
ladd |
ladd |
98 |
0x62 |
fadd |
fadd |
99 |
0x63 |
dadd |
dadd |
100 |
0x64 |
isub |
isub |
101 |
0x65 |
lsub |
lsub |
102 |
0x66 |
fsub |
fsub |
103 |
0x67 |
dsub |
dsub |
104 |
0x68 |
imul |
imul |
105 |
0x69 |
lmul |
lmul |
106 |
0x6a |
fmul |
fmul |
107 |
0x6b |
dmul |
dmul |
108 |
0x6c |
idiv |
idiv |
109 |
0x6d |
ldiv |
ldiv |
110 |
0x6e |
fdiv |
fdiv |
111 |
0x6f |
ddiv |
ddiv |
112 |
0x70 |
irem |
irem |
113 |
0x71 |
lrem |
lrem |
114 |
0x72 |
frem |
frem |
115 |
0x73 |
drem |
drem |
116 |
0x74 |
ineg |
ineg |
117 |
0x75 |
lneg |
lneg |
118 |
0x76 |
fneg |
fneg |
119 |
0x77 |
dneg |
dneg |
120 |
0x78 |
ishl |
ishl |
121 |
0x79 |
lshl |
lshl |
122 |
0x7a |
ishr |
ishr |
123 |
0x7b |
lshr |
lshr |
124 |
0x7c |
iushr |
iushr |
125 |
0x7d |
lushr |
lushr |
126 |
0x7e |
iand |
iand |
127 |
0x7f |
land |
land |
128 |
0x80 |
ior |
ior |
129 |
0x81 |
lor |
lor |
130 |
0x82 |
ixor |
ixor |
131 |
0x83 |
lxor |
lxor |
132 |
0x84 |
iinc |
iinc <varindex> <integer> |
varindex : Index im Array der lokalen Variablen,
0 <= varindex <= 255.
integer : Ganzzahl aus dem Bereich -128 <= integer <= 127.
Beispiele: iinc 7 10 , iinc 5 -3
|
133 |
0x85 |
i2l |
i2l |
134 |
0x86 |
i2f |
i2f |
135 |
0x87 |
i2d |
i2d |
136 |
0x88 |
l2i |
l2i |
137 |
0x89 |
l2f |
l2f |
138 |
0x8a |
l2d |
l2d |
139 |
0x8b |
f2i |
f2i |
140 |
0x8c |
f2l |
f2l |
141 |
0x8d |
f2d |
f2d |
142 |
0x8e |
d2i |
d2i |
143 |
0x8f |
d2l |
d2l |
144 |
0x90 |
d2f |
d2f |
145 |
0x91 |
i2b |
i2b |
146 |
0x92 |
i2c |
i2c |
147 |
0x93 |
i2s |
i2s |
148 |
0x94 |
lcmp |
lcmp |
149 |
0x95 |
fcmpl |
fcmpl |
150 |
0x96 |
fcmpg |
fcmpg |
151 |
0x97 |
dcmpl |
dcmpl |
152 |
0x98 |
dcmpg |
dcmpg |
153 |
0x99 |
ifeq |
ifeq <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: ifeq Label7 , ifeq 7 , ifeq $+7 ,
ifeq $-7
|
154 |
0x9a |
ifne |
ifne <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: ifne Label7 , ifne 7 , ifne $+7 ,
ifne $-7
|
155 |
0x9b |
iflt |
iflt <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: iflt Label7 , iflt 7 , iflt $+7 ,
iflt $-7
|
156 |
0x9c |
ifge |
ifge <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: ifge Label7 , ifge 7 , ifge $+7 ,
ifge $-7
|
157 |
0x9d |
ifgt |
ifgt <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: ifgt Label7 , ifgt 7 , ifgt $+7 ,
ifgt $-7
|
158 |
0x9e |
ifle |
ifle <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: ifle Label7 , ifle 7 , ifle $+7 ,
ifle $-7
|
159 |
0x9f |
if_icmpeq |
if_icmpeq <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: if_icmpeq Label7 , if_icmpeq 7 ,
if_icmpeq $+7 , if_icmpeq $-7
|
160 |
0xa0 |
if_icmpne |
if_icmpne <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: if_icmpne Label7 , if_icmpne 7 ,
if_icmpne $+7 , if_icmpne $-7
|
161 |
0xa1 |
if_icmplt |
if_icmplt <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: if_icmplt Label7 , if_icmplt 7 ,
if_icmplt $+7 , if_icmplt $-7
|
162 |
0xa2 |
if_icmpge |
if_icmpge <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: if_icmpge Label7 , if_icmpge 7 ,
if_icmpge $+7 , if_icmpge $-7
|
163 |
0xa3 |
if_icmpgt |
if_icmpgt <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: if_icmpgt Label7 , if_icmpgt 7 ,
if_icmpgt $+7 , if_icmpgt $-7
|
164 |
0xa4 |
if_icmple |
if_icmple <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: if_icmple Label7 , if_icmple 7 ,
if_icmple $+7 , if_icmple $-7
|
165 |
0xa5 |
if_acmpeq |
if_acmpeq <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: if_acmpeq Label7 , if_acmpeq 7 ,
if_acmpeq $+7 , if_acmpeq $-7
|
166 |
0xa6 |
if_acmpne |
if_acmpne <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: if_acmpne Label7 , if_acmpne 7 ,
if_acmpne $+7 , if_acmpne $-7
|
167 |
0xa7 |
goto |
goto <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Als Verzweigungsoffset kann eine vozeichenbehaftete 16-Bit-Zahl
verwendet werden.
Beispiele: goto Label7 , goto 7 ,
goto $+7 , goto $-7
|
168 |
0xa8 |
jsr |
jsr <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Als Verzweigungsoffset kann eine vozeichenbehaftete 16-Bit-Zahl
verwendet werden.
Beispiele: jsr Label7 , jsr 7 ,
jsr $+7 , jsr $-7
|
169 |
0xa9 |
ret |
ret <varindex> |
varindex : Index im Array der lokalen Variablen,
0 <= varindex <= 255.
Beispiel: ret 3
|
170 |
0xaa |
tableswitch |
tableswitch <constantlow> <constanthigh>
<label>
<label>
<label>
...
default : <label>
|
constantlow : Niedrigste case -Konstante.
constanthigh : Höchste case -Konstante.
label : Konventioneller Label.
Beispiel:
tableswitch 3 6
Label3
Label4
Labeld
Label6
default : Labeld
|
171 |
0xab |
lookupswitch |
lookupswitch
<constant> : <label>
<constant> : <label>
<constant> : <label>
...
default : <label>
|
constant : case -Konstante (sortiert).
label : Konventioneller Label.
Beispiel:
tableswitch
-50 : Label1
2 : Label2
230 : Label3
default : Labeld
|
172 |
0xac |
ireturn |
ireturn |
173 |
0xad |
lreturn |
lreturn |
174 |
0xae |
freturn |
freturn |
175 |
0xaf |
dreturn |
dreturn |
176 |
0xb0 |
areturn |
areturn |
177 |
0xb1 |
return |
return |
178 |
0xb2 |
getstatic |
getstatic <classfieldname> <fielddescriptor> |
classfieldname : Zusammengesetzter Bezeichner, bestehend
aus dem vollen (qualifizierten) Namen der Klasse und dem Namen des Feldes.
Die beiden Namen sind durch einen zusätzlich eingefügten Schrägstrich "/"
voneinander getrennt.
fielddescriptor : Deskriptor des Feldes.
Beispiel:
getstatic java/lang/System/out Ljava/io/PrintStream;
Name der Klasse: java/lang/System
Name des Feldes: out
Felddeskriptor: Ljava/io/PrintStream;
|
179 |
0xb3 |
putstatic |
putstatic <classfieldname> <fielddescriptor> |
classfieldname : Zusammengesetzter Bezeichner, bestehend
aus dem vollen (qualifizierten) Namen der Klasse und dem Namen des Feldes.
Die beiden Namen sind durch einen zusätzlich eingefügten Schrägstrich "/"
voneinander getrennt.
fielddescriptor : Deskriptor des Feldes.
Beispiel:
putstatic Test/a I
Name der Klasse: Test
Name des Feldes: a
Felddeskriptor: I
|
180 |
0xb4 |
getfield |
getfield <classfieldname> <fielddescriptor> |
classfieldname : Zusammengesetzter Bezeichner, bestehend
aus dem vollen (qualifizierten) Namen der Klasse und dem Namen des Feldes.
Die beiden Namen sind durch einen zusätzlich eingefügten Schrägstrich "/"
voneinander getrennt.
fielddescriptor : Deskriptor des Feldes.
Beispiel:
getfield Test/b I
Name der Klasse: Test
Name des Feldes: b
Felddeskriptor: I
|
181 |
0xb5 |
putfield |
putfield <classfieldname> <fielddescriptor> |
classfieldname : Zusammengesetzter Bezeichner, bestehend
aus dem vollen (qualifizierten) Namen der Klasse und dem Namen des Feldes.
Die beiden Namen sind durch einen zusätzlich eingefügten Schrägstrich "/"
voneinander getrennt.
fielddescriptor : Deskriptor des Feldes.
Beispiel:
putfield Test/b I
Name der Klasse: Test
Name des Feldes: b
Felddeskriptor: I
|
182 |
0xb6 |
invokevirtual |
invokevirtual <classmethodname><methoddescriptor> |
classmethodname : Zusammengesetzter Bezeichner, bestehend
aus dem vollen (qualifizierten) Namen der Klasse und dem Namen der Methode.
Die beiden Namen sind durch einen zusätzlich eingefügten Schrägstrich "/"
voneinander getrennt.
methoddescriptor : Deskriptor der Methode.
Beispiel:
invokevirtual java/lang/Integer/intValue()I
Name der Klasse: java/lang/Integer
Name der Methode: intValue
Methodendeskriptor: ()I
|
183 |
0xb7 |
invokespecial |
invokespecial <classmethodname><methoddescriptor> |
classmethodname : Zusammengesetzter Bezeichner, bestehend
aus dem vollen (qualifizierten) Namen der Klasse und dem Namen der Methode.
Die beiden Namen sind durch einen zusätzlich eingefügten Schrägstrich "/"
voneinander getrennt.
methoddescriptor : Deskriptor der Methode.
Beispiel:
invokespecial java/lang/Object/<init>()V
Name der Klasse: java/lang/Object
Name der Methode: <init>
Methodendeskriptor: ()V
|
184 |
0xb8 |
invokestatic |
invokestatic <classmethodname><methoddescriptor> |
classmethodname : Zusammengesetzter Bezeichner, bestehend
aus dem vollen (qualifizierten) Namen der Klasse und dem Namen der Methode.
Die beiden Namen sind durch einen zusätzlich eingefügten Schrägstrich "/"
voneinander getrennt.
methoddescriptor : Deskriptor der Methode.
Beispiel:
invokestatic java/lang/Integer/signum(I)I
Name der Klasse: java/lang/Integer
Name der Methode: signum
Methodendeskriptor: (I)I
|
185 |
0xb9 |
invokeinterface |
invokeinterface <classmethodname><methoddescriptor> <count> |
classmethodname : Zusammengesetzter Bezeichner, bestehend
aus dem vollen (qualifizierten) Namen des Interfaces und dem Namen der Methode.
Die beiden Namen sind durch einen zusätzlich eingefügten Schrägstrich "/"
voneinander getrennt.
methoddescriptor : Deskriptor der Methode.
count : Maßzahl, die sich aus der Anzahl und dem Typ der
Argumente der Methode ergibt.
Beispiel:
invokeinterface
java/lang/Comparable/compareTo(Ljava/lang/Object;)I 2
Name des Interfaces: java/lang/Comparable
Name der Methode: compareTo
Methodendeskriptor: (Ljava/lang/Object;)I
count: 2
|
186 |
0xba |
... |
... |
187 |
0xbb |
new |
new <classname> |
classname : Voller (qualifizierter) Name der Klasse.
Beispiel: new java/lang/String
|
188 |
0xbc |
newarray |
newarray <arraytype> |
arraytype : Typ des Arrays (boolean ,
char , float , double , byte ,
short , int , long ).
Beispiel: newarray int
|
189 |
0xbd |
anewarray |
anewarray <classname> |
classname : Voller (qualifizierter) Name der Klasse.
Beispiel: anewarray java/lang/String
|
190 |
0xbe |
arraylength |
arraylength |
191 |
0xbf |
athrow |
athrow |
192 |
0xc0 |
checkcast |
checkcast <classname> |
classname : Voller (qualifizierter) Name der Klasse.
Beispiel: checkcast java/lang/String
|
193 |
0xc1 |
instanceof |
instanceof <classname> |
classname : Voller (qualifizierter) Name der Klasse.
Beispiel: instanceof java/lang/String
|
194 |
0xc2 |
monitorenter |
monitorenter |
195 |
0xc3 |
monitorexit |
monitorexit |
196 |
0xc4 |
wide |
Die Verwendung des Postfixes "_w " bei bestimmten
Instruktionen führt zu einer wide -Form der Bytecodegenerierung
durch Jasmin.
aload_w <varindex>
dload_w <varindex>
fload_w <varindex>
iload_w <varindex>
lload_w <varindex>
astore_w <varindex>
dstore_w <varindex>
fstore_w <varindex>
istore_w <varindex>
lstore_w <varindex>
ret_w <varindex>
iinc_w <varindex> <integer>
|
varindex : Index im Array der lokalen Variablen,
varindex <= 65536.
integer : Ganzzahl aus dem Bereich
-32768 <= integer <= 32767.
Beispiele: iload_w 300 , fstore_w 303 ,
ret_w 606 , iinc_w 300 303
|
197 |
0xc5 |
multianewarray |
multianewarray <fielddescriptor> <dimensions> |
fielddescriptor : Deskriptor des Arrays.
dimensions : Anzahl der Dimensionen des Arrays.
Beispiel: multianewarray [[I 2
|
198 |
0xc6 |
ifnull |
ifnull <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: ifnull Label7 , ifnull 7 ,
ifnull $+7 , ifnull $-7
|
199 |
0xc7 |
ifnonnull |
ifnonnull <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Beispiele: ifnonnull Label7 , ifnonnull 7 ,
ifnonnull $+7 , ifnonnull $-7
|
200 |
0xc8 |
goto_w |
goto_w <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Als Verzweigungsoffset kann eine vozeichenbehaftete 32-Bit-Zahl
verwendet werden.
Beispiele: goto_w Label32769 , goto_w 32769 ,
goto_w $+32769 , goto_w $-32769
|
201 |
0xc9 |
jsr_w |
jsr_w <target> |
target : Konventioneller Label, pc-Label, relativer Offset.
Als Verzweigungsoffset kann eine vozeichenbehaftete 32-Bit-Zahl
verwendet werden.
Beispiele: jsr_w Label32769 , jsr_w 32769 ,
jsr_w $+32769 , jsr_w $-32769
|
|