javaseiten.de   |   Version 0.6
 

5.7. Instruktionen

(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.

; NewExample.j

.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.

; LookupTableSwitchExample.j

.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


 

 

 

Diese Seite nutzt Google-Dienste - siehe dazu Datenschutz.

Copyright © 2006, 2007 Harald Roeder