Seminarthemen→ Die Architektur der Java VM→ I.• II.• III.• IV.• V. Befehlssatz • VI.• VII.
Die JVM ist intern insofern streng getypt, dass jeweils nur genau bestimmte JVM-Typen von einem Befehl verarbeitet werden. Daher existieren für mathematische, logische und load & store Operationen seperate typspeziefische Befehle. D.h. es gibt z.B. je einen Befehl um zwei int
's float
's oder double
's zu addieren, suptrahieren usw. . Welche Typen ein Befehl erwartet wird meist durch einen Prefix im Namen des Befehls angedeutet. Etwa addiert iadd
int
's und fadd
float
's. Nicht alle Typen der JVM werden so äquivalent unterstützt. Insbesondere für int
gibt es noch einige zusätzliche Befehle, die auch für long
, float
und double
nicht vorhanden sind. Ansonsten sind diese 4 jedoch ähnlich gut unterstützt. Die primitiven Typen byte
, short
und char
werden hingegen nicht besonders vielseitig durch eigene Befehle unterstützt. Sie werden für die meisten Operationen von der JVM automatisch zu int
erweitert, als solche verarbeitet, und per Typkonvertierung wieder auf ihre ausgangslänge abgeschnitten.
Volle Unterstützung durch Befehlssatz | ||
---|---|---|
Kategorie | Prefix | JVM-Typ |
1 | i | int |
2 | l | long |
1 | f | float |
2 | d | double |
1 | a | reference |
Geringe Unterstützung durch Befehlssatz (sonst als int behandelt) |
||
1 | c | char |
1 | s | short |
1 | b | byte |
Die JVM unterteilt ihre Typen zudem in Kategorie 1 und Kategorie 2 Typen. Alle Typen, die durch einen 32-Bit-Wert dargestellt werden konnen gehören zur Kategorie 1 (belegen 1 Element des OS oder LV):
Kategorie 1 = ( int, float, returnAddress, reference, [ byte, short, char ] )
Die wenig unterstützten Typen sind nur impliziet Teil dieser Menge, da sie auf dem Operand-Stack oder in den lokalen Variablen als int
abgelegt werden.
Zur Kategorie 2 gehören die verbleibenden 64-Bit breiten Typen:
Kategorie 2 = ( long, double )
Diese belegen immer 2 aufeinander folgende Elemente des Operand-Stack oder der lokalen Variablen. Diese gehören untrennbar zusammen, und dürfen von Befehlen entwerder garnicht oder nur als Einheit (Paar) manipuliert werden. Daher existieren von einigen Befehlen zwei Varianten: Je eine für Kategorie 1 und eine für Kategorie 2 Typen. Zum Beispiel entnimmt pop
das oberste Kat1-Element vom Operand-Stack, pop2
die obersten 2 Kat1-Elemente oder das oberste Kat2-Element.
Der Befehlssatz der JVM ist so gestalltet, dass direktes Manipulieren eines Programm-Counters nicht möglich ist. Dieser kann mit Sprunganweisungen lediglich inkrementiert oder dekrementiert werden. Die Länge, um welche gesprungen wird, ist dabei bereits im Bytecode
festgesetzt. Dadurch kann sichergestellt werden, dass ein Sprung die aktuelle Methoden-Implementierung nicht verlässt und zu einem gültigen Opcode eines Befehls führt.
Opcode | Mnemonic | Opcode | Mnemonic | Opcode | Mnemonic | Opcode | Mnemonic |
---|---|---|---|---|---|---|---|
50 (x32) | aaload | 92 (x5c) | dup2 | 7 (x07) | iconst_4 | 136 (x88) | l2i |
83 (x53) | aastore | 93 (x5d) | dup2_x1 | 8 (x08) | iconst_5 | 97 (x61) | ladd |
1 (x01) | aconst_null | 94 (x5e) | dup2_x2 | 2 (x02) | iconst_m1 | 47 (x2f) | laload |
25 (x19) | aload | 90 (x5a) | dup_x1 | 108 (x6c) | idiv | 127 (x7f) | land |
42 (x2a) | aload_0 | 91 (x5b) | dup_x2 | 153 (x99) | ifeq | 80 (x50) | lastore |
43 (x2b) | aload_1 | 141 (x8d) | f2d | 156 (x9c) | ifge | 148 (x94) | lcmp |
44 (x2c) | aload_2 | 139 (x8b) | f2i | 157 (x9d) | ifgt | 9 (x09) | lconst_0 |
45 (x2d) | aload_3 | 140 (x8c) | f2l | 158 (x9e) | ifle | 10 (x0a) | lconst_1 |
189 (xbd) | anewarray | 98 (x62) | fadd | 155 (x9b) | iflt | 18 (x12) | ldc |
176 (xb0) | areturn | 48 (x30) | faload | 154 (x9a) | ifne | 20 (x14) | ldc2_w |
190 (xbe) | arraylenght | 81 (x51) | fastore | 199 (xc7) | ifnonnull | 19 (x13) | ldc_w |
58 (x3a) | astore | 150 (x96) | fcmpg | 198 (xc6) | ifnull | 109 (x6d) | ldiv |
75 (x4b) | astore_0 | 149 (x95) | fcmpl | 165 (xa5) | if_acmpeq | 22 (x16) | lload |
76 (x4c) | astore_1 | 11 (x0b) | fconst_0 | 166 (xa6) | if_acmpne | 30 (x1e) | lload_0 |
77 (x4d) | astore_2 | 12 (x0c) | fconst_1 | 159 (x9f) | if_icmpeq | 31 (x1f) | lload_1 |
78 (x4e) | astore_3 | 13 (x0d) | fconst_2 | 162 (xa2) | if_icmpge | 32 (x20) | lload_2 |
191 (xbf) | athrow | 110 (x6e) | fdiv | 163 (xa3) | if_icmpgt | 33 (x21) | lload_3 |
51 (x33) | baload | 23 (x17) | fload | 164 (xa4) | if_icmple | 105 (x69) | lmul |
84 (x54) | bastore | 34 (x22) | fload_0 | 161 (xa1) | if_icmplt | 117 (x75) | lneg |
16 (x10) | bipush | 35 (x23) | fload_1 | 160 (xa0) | if_icmpne | 171 (xab) | lookupswitch |
52 (x34) | caload | 36 (x24) | fload_2 | 132 (x84) | iinc | 129 (x81) | lor |
85 (x55) | castore | 37 (x25) | fload_3 | 21 (x15) | iload | 113 (x71) | lrem |
192 (xc0) | checkcast | 106 (x6a) | fmul | 26 (x1a) | iload_0 | 173 (xad) | lreturn |
144 (x90) | d2f | 118 (x76) | fneg | 27 (x1b) | iload_1 | 121 (x79) | lshl |
142 (x8e) | d2i | 114 (x72) | frem | 28 (x1c) | iload_2 | 123 (x7b) | lshr |
143 (x8f) | d2l | 174 (xae) | freturn | 29 (x1d) | iload_3 | 55 (x37) | lstore |
99 (x63) | dadd | 56 (x38) | fstore | 104 (x68) | imul | 63 (x3f) | lstore_0 |
49 (x31) | daload | 67 (x43) | fstore_0 | 116 (x74) | ineg | 64 (x40) | lstore_1 |
82 (x52) | dastore | 68 (x44) | fstore_1 | 193 (xc1) | instanceof | 65 (x41) | lstore_2 |
152 (x98) | dcmpg | 69 (x45) | fstore_2 | 185 (xb9) | invokeinterface | 66 (x42) | lstore_3 |
151 (x97) | dcmpl | 70 (x46) | fstore_3 | 183 (xb7) | invokespecial | 101 (x65) | lsub |
14 (x0e) | dconst_0 | 102 (x66) | fsub | 184 (xb8) | invokestatic | 125 (x7d) | lushr |
15 (x0f) | dconst_1 | 180 (xb4) | getfield | 182 (xb6) | invokevirtual | 131 (x83) | lxor |
111 (x6f) | ddiv | 178 (xb2) | getstatic | 128 (x80) | ior | 194 (xc2) | monitorenter |
24 (x18) | dload | 167 (xa7) | goto | 112 (x70) | irem | 195 (xc3) | monitorexit |
38 (x26) | dload_0 | 200 (xc8) | goto_w | 172 (xac) | ireturn | 197 (xc5) | multianewarray |
39 (x27) | dload_1 | 145 (x91) | i2b | 120 (x78) | ishl | 187 (xbb) | new |
40 (x28) | dload_2 | 146 (x92) | i2c | 122 (x7a) | ishr | 188 (xbc) | newarray |
41 (x29) | dload_3 | 135 (x87) | i2d | 54 (x36) | istore | 0 (x00) | nop |
107 (x6b) | dmul | 134 (x86) | i2f | 59 (x3b) | istore_0 | 87 (x57) | pop |
119 (x77) | dneg | 133 (x85) | i2l | 60 (x3c) | istore_1 | 88 (x58) | pop2 |
115 (x73) | drem | 147 (x93) | i2s | 61 (x3d) | istore_2 | 181 (xb5) | putfield |
175 (xaf) | dreturn | 96 (x60) | iadd | 62 (x3e) | istore_3 | 179 (xb3) | putstatic |
57 (x39) | dstore | 46 (x2e) | iaload | 100 (x64) | isub | 169 (xa9) | ret |
71 (x47) | dstore_0 | 126 (x7e) | iand | 124 (x7c) | iushr | 177 (xb1) | return |
72 (x48) | dstore_1 | 79 (x4f) | iastore | 130 (x82) | ixor | 53 (x35) | saload |
73 (x49) | dstore_2 | 3 (x03) | iconst_0 | 168 (xa8) | jsr | 86 (x56) | sastore |
74 (x4a) | dstore_3 | 4 (x04) | iconst_1 | 201 (xc9) | jsr_w | 17 (x11) | sipush |
103 (x67) | dsub | 5 (x05) | iconst_2 | 138 (x8a) | l2d | 95 (x5f) | swap |
89 (x59) | dup | 6 (x06) | iconst_3 | 137 (x89) | l2f | 170 (xaa) | tableswitch |
Opcode | Mnemonic | Opcode | Mnemonic | Opcode | Mnemonic | Opcode | Mnemonic |
---|---|---|---|---|---|---|---|
0 (x00) | nop | 64 (x40) | lstore_1 | 128 (x80) | ior | 192 (xc0) | checkcast |
1 (x01) | aconst_null | 65 (x41) | lstore_2 | 129 (x81) | lor | 193 (xc1) | instanceof |
2 (x02) | iconst_m1 | 66 (x42) | lstore_3 | 130 (x82) | ixor | 194 (xc2) | monitorenter |
3 (x03) | iconst_0 | 67 (x43) | fstore_0 | 131 (x83) | lxor | 195 (xc3) | monitorexit |
4 (x04) | iconst_1 | 68 (x44) | fstore_1 | 132 (x84) | iinc | 196 (xc4) | wide |
5 (x05) | iconst_2 | 69 (x45) | fstore_2 | 133 (x85) | i2l | 197 (xc5) | multianewarray |
6 (x06) | iconst_3 | 70 (x46) | fstore_3 | 134 (x86) | i2f | 198 (xc6) | ifnull |
7 (x07) | iconst_4 | 71 (x47) | dstore_0 | 135 (x87) | i2d | 199 (xc7) | ifnonnull |
8 (x08) | iconst_5 | 72 (x48) | dstore_1 | 136 (x88) | l2i | 200 (xc8) | goto_w |
9 (x09) | lconst_0 | 73 (x49) | dstore_2 | 137 (x89) | l2f | 201 (xc9) | jsr_w |
10 (x0a) | lconst_1 | 74 (x4a) | dstore_3 | 138 (x8a) | l2d | ||
11 (x0b) | fconst_0 | 75 (x4b) | astore_0 | 139 (x8b) | f2i | ||
12 (x0c) | fconst_1 | 76 (x4c) | astore_1 | 140 (x8c) | f2l | ||
13 (x0d) | fconst_2 | 77 (x4d) | astore_2 | 141 (x8d) | f2d | ||
14 (x0e) | dconst_0 | 78 (x4e) | astore_3 | 142 (x8e) | d2i | ||
15 (x0f) | dconst_1 | 79 (x4f) | iastore | 143 (x8f) | d2l | ||
16 (x10) | bipush | 80 (x50) | lastore | 144 (x90) | d2f | ||
17 (x11) | sipush | 81 (x51) | fastore | 145 (x91) | i2b | ||
18 (x12) | ldc | 82 (x52) | dastore | 146 (x92) | i2c | ||
19 (x13) | ldc_w | 83 (x53) | aastore | 147 (x93) | i2s | ||
20 (x14) | ldc2_w | 84 (x54) | bastore | 148 (x94) | lcmp | ||
21 (x15) | iload | 85 (x55) | castore | 149 (x95) | fcmpl | ||
22 (x16) | lload | 86 (x56) | sastore | 150 (x96) | fcmpg | ||
23 (x17) | fload | 87 (x57) | pop | 151 (x97) | dcmpl | ||
24 (x18) | dload | 88 (x58) | pop2 | 152 (x98) | dcmpg | ||
25 (x19) | aload | 89 (x59) | dup | 153 (x99) | ifeq | ||
26 (x1a) | iload_0 | 90 (x5a) | dup_x1 | 154 (x9a) | ifne | ||
27 (x1b) | iload_1 | 91 (x5b) | dup_x2 | 155 (x9b) | iflt | ||
28 (x1c) | iload_2 | 92 (x5c) | dup2 | 156 (x9c) | ifge | ||
29 (x1d) | iload_3 | 93 (x5d) | dup2_x1 | 157 (x9d) | ifgt | ||
30 (x1e) | lload_0 | 94 (x5e) | dup2_x2 | 158 (x9e) | ifle | ||
31 (x1f) | lload_1 | 95 (x5f) | swap | 159 (x9f) | if_icmpeq | ||
32 (x20) | lload_2 | 96 (x60) | iadd | 160 (xa0) | if_icmpne | ||
33 (x21) | lload_3 | 97 (x61) | ladd | 161 (xa1) | if_icmplt | ||
34 (x22) | fload_0 | 98 (x62) | fadd | 162 (xa2) | if_icmpge | ||
35 (x23) | fload_1 | 99 (x63) | dadd | 163 (xa3) | if_icmpgt | ||
36 (x24) | fload_2 | 100 (x64) | isub | 164 (xa4) | if_icmple | ||
37 (x25) | fload_3 | 101 (x65) | lsub | 165 (xa5) | if_acmpeq | ||
38 (x26) | dload_0 | 102 (x66) | fsub | 166 (xa6) | if_acmpne | ||
39 (x27) | dload_1 | 103 (x67) | dsub | 167 (xa7) | goto | ||
40 (x28) | dload_2 | 104 (x68) | imul | 168 (xa8) | jsr | ||
41 (x29) | dload_3 | 105 (x69) | lmul | 169 (xa9) | ret | ||
42 (x2a) | aload_0 | 106 (x6a) | fmul | 170 (xaa) | tableswitch | ||
43 (x2b) | aload_1 | 107 (x6b) | dmul | 171 (xab) | lookupswitch | ||
44 (x2c) | aload_2 | 108 (x6c) | idiv | 172 (xac) | ireturn | ||
45 (x2d) | aload_3 | 109 (x6d) | ldiv | 173 (xad) | lreturn | ||
46 (x2e) | iaload | 110 (x6e) | fdiv | 174 (xae) | freturn | ||
47 (x2f) | laload | 111 (x6f) | ddiv | 175 (xaf) | dreturn | ||
48 (x30) | faload | 112 (x70) | irem | 176 (xb0) | areturn | ||
49 (x31) | daload | 113 (x71) | lrem | 177 (xb1) | return | ||
50 (x32) | aaload | 114 (x72) | frem | 178 (xb2) | getstatic | ||
51 (x33) | baload | 115 (x73) | drem | 179 (xb3) | putstatic | ||
52 (x34) | caload | 116 (x74) | ineg | 180 (xb4) | getfield | ||
53 (x35) | saload | 117 (x75) | lneg | 181 (xb5) | putfield | ||
54 (x36) | istore | 118 (x76) | fneg | 182 (xb6) | invokevirtual | ||
55 (x37) | lstore | 119 (x77) | dneg | 183 (xb7) | invokespecial | ||
56 (x38) | fstore | 120 (x78) | ishl | 184 (xb8) | invokestatic | ||
57 (x39) | dstore | 121 (x79) | lshl | 185 (xb9) | invokeinterface | ||
58 (x3a) | astore | 122 (x7a) | ishr | 186 (xba) | u_n_u_s_e_d | ||
59 (x3b) | istore_0 | 123 (x7b) | lshr | 187 (xbb) | new | ||
60 (x3c) | istore_1 | 124 (x7c) | iushr | 188 (xbc) | newarray | Reserviert | |
61 (x3d) | istore_2 | 125 (x7d) | lushr | 189 (xbd) | anewarray | 202 (xca) | breakpoint |
62 (x3e) | istore_3 | 126 (x7e) | iand | 190 (xbe) | arraylenght | 254 (xfe) | impdep1 |
63 (x3f) | lstore_0 | 127 (x7f) | land | 191 (xbf) | athrow | 255 (xff) | impdep2 |
Jeder Befehl wird entsprechend dem untenstehenden Beispiel genau beschrieben. Einige Befehle gehören zu Befehlsfamilien. Alle Befehle einer Familie sind prinzipiel funktional identisch. Jeder benennt jedoch impliziet ein anderen konstanten Wert. Hierbei handelt es sich um eine numerische Konstante, oder den Index einer lokalen Variablen des aktuellen Frames. Für eine Befehlsfamilie existiert jeweils nur eine Beschreibung unter der Titel familie_<n>
. Je nach Familie kann n
verschiedene Werte annehmen. Diese sind unter Formen aufgeführt.
Befehl | Kurzbeschreibung des Befehls |
---|---|
Format | mnemonic operant1 operant2 ... |
Formen |
|
Operanden-Stack | ... wert1 type wert2 type ⇓
... wert3 type |
Beschreibung | Eine ausführlichere Beschreibung, welche die Abläufe auf dem Operanden-Stack, Zugriffe auf den Konstanten-Pool oder die durchgeführte Operation und deren Ergebnisse beschreibt. |
Exceptions |
|
Hinweise | Zusätzliche Hinweise, die nicht direkt mit der Operation zusammenhängen, aber in deren Kontext evt. hilfreich sein könnten. |
Das Format des Befehls stellt die einzelnen Bytes des Befehls dar, so wie dieser im Bytecode der class
-Dateien steht. Teilweise wird dabei eine numerische Konstante oder ein Index in den Laufzeit-Konstanten-Pool aus 2 Operanden-Bytes zusammengesetzt, die dann etwa mit operand1
und operand2
benannt sind. Die meisten Befehle bestehen jedoch ausschließlich aus dem 1. Byte (8 Bit) für den opcode
/ mnemonic
.
In der Zeile Operanden-Stack werden die Auswirkungen des Befehls auf den Operanden-Stack gezeigt. Der Stack baut sich von oben nach unten auf. Der meist als erstes angeführte ...
-Eintrag deutet an, dass vor den verwendteten Befehlen beliebige (auch keine) Befehle auf dem Stack vorhanden sein können, die, von der Operation unangetastet, auf dem Stack verbleiben. Die breite eines Stack-Eintrags ist hier proportional richtig zur Breite eines Bytes in der Formatangabe dargestellt. Alle Einträge auf dem Stack sind also 4 Byte = 32 Bit breit. Operanden vom Typ long
oder double
die 64 Bit breit sind, und daher eigentlich auch 2 Einträge auf dem Stack entsprechen, werden als 1 voller Eintrag gefolgt von einem verkleinerten dargestellt (wie bei wert2), da die 2 Einträge ohnehin untrennbar sind, und nur von entsprechenden Befehlen als ein ganzes behandelt werden können. Durch die hier gewählte logisch Darstellung verdeutlicht sich die Arbeitsweise des Befehls besser. Die Analogie zu gleichen Befehlen für andere Datentypen zeigt sich sofoert.
Der Typ jedes Operanden auf dem Stack ist (sofern dieser von einem bestimmten Typ sein muss) in Klammern hinter dem Operanden angegeben. Unterschieden wird zwischen den einfachen Datentypen int
, long
, float
, double
und dem Referenztypen reference
. Die Typen byte
, short
und char
werden von der JVM als int
auf dem OS verarbeitet. Dazu werden diese automatisch richtig auf eine 32-Bit Integer-Darstellung erweitert. wert3 deutet etwa eine Erweiterung von short
zu int
an.
Die Reihenfolge der aufgeführten Exceptions gibt an, welche Überprüfung zuerst stattfindet, also eine höhere Priorität besitzt.
A• B• C• D• F• G• I• J• L• M• N• P• R• S• T• W
Befehl | Läd Objekt-reference value aus Zelle index des Arrays arrayref |
---|---|
Format | aaload |
Formen |
|
Operand-Stack | ... arrayref reference index int ... value reference |
Beschreibung | Die Referenz arrayref muss auf ein Array verweisen, dessen Komponenten ebenfalls vom Typ reference sind. Aus arrayref und index, die vom Stack entnommen werden, wird die reference value an der Position index des Arrays bestimmt, und auf den Stack gebracht. |
Exceptions |
|
Befehl | Speichert reference value in Zelle index des Arrays arrayref |
---|---|
Format | aastore |
Formen |
|
Operand-Stack | ... arrayref reference index int value reference ... |
Beschreibung | Die Operanden arrayref, index und value werden vom Operad-Stack entnommen. Die reference value wird im Array arrayref in Zelle index abgelegt. Dessen Elementtyp muss zuweisungskompatibel mit der Klasse von value sein. |
Exceptions |
|
Befehl | null auf OS |
---|---|
Format | aconst_null |
Formen |
|
Operand-Stack | ... ... null |
Beschreibung | Bringt die null Objekt-reference auf den Operand-Stack. |
Hinweis | Die JVM schreibt keinen bestimmten Wert für null vor. |
Befehl | Läd reference objectref aus lokaler Variable index |
---|---|
Format | aload index |
Formen |
|
Operand-Stack | ... ... objectref reference |
Beschreibung | Der index ist ein vorzeichenloser byte -Wert, der einen Index in das Array der lokalen Variablen des aktuellen Frames angibt. Dies muss dort eine objectref reference enthalten, die auf den Operand-Stack gebracht wird. |
Hinweis | Der Der |
Befehl | Läd reference objectref aus lokaler Variable a |
---|---|
Format | iload_<i> |
Formen | |
Operand-Stack | ... ... objectref reference |
Beschreibung | Die reference objectref aus dem Element a (0, 1 , 2, 3) des Arrays der kolaken Variablen wird auf den Operand-Stack abgelegt. |
Hinweis | Jeder Befehl der Familie ist äquivalent zum aload <a> Befehl, nur dass der Index a der lokalen Variable hier im Befehl selbst enthalten ist. |
Befehl | Neues 1-dimensionales Array mit reference Elementtyp anlegen |
---|---|
Format | anewarray indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... count int ... arrayref reference |
Befehl | Rückgabewert reference objectref einer Methode |
---|---|
Format | areturn |
Formen |
|
Operand-Stack | ... objectref reference [empty] |
Befehl | Länge eines Arrays lesen |
---|---|
Format | arraylenght |
Formen |
|
Operand-Stack | ... arrayref reference ... length int |
Befehl | Speichert returnAddress oder reference objectref in lokaler Variable index |
---|---|
Format | astore index |
Formen |
|
Operand-Stack | ... objectref reference|returnAddress ... |
Beschreibung | Der index ist ein vorzeichenloser byte -Wert, der einen Index in das Array der lokalen Variablen des aktuellen Frames angibt. Die reference bzw. returnAddress objectref wird vom Operand-Stack entnommen und in der lokalen Variable index gespeichert. |
Hinweis | Der astore Befehl kann zusammen mit dem wide Befehl verwendet werden, um einen höheren Index über eine vorzeichenlose 2-byte -Wert anzugeben. |
Befehl | Speichert refernce oder returnAddress objectref in lokaler Variable a |
---|---|
Format | astore_<a> |
Formen | |
Operand-Stack | ... objectref reference|returnAddress ... |
Beschreibung | Die reference bzw. returnAddress objectref wird vom Operand-Stack entnommen und in der lokalen Variable a (0, 1 , 2, 3) gespeichert. |
Hinweis | Jeder Befehl der Familie ist äquivalent zum astore <a> Befehl, nur dass der Index a der lokalen Variable hier im Befehl selbst enthalten ist. |
Befehl | Exception oder Error auslösen |
---|---|
Format | athrow |
Formen |
|
Operand-Stack | ... objectref reference objectref reference |
Befehl | Läd byte oder boolean value aus Zelle index des Arrays arrayref |
---|---|
Format | baload |
Formen |
|
Operand-Stack | ... arrayref reference index int ... value int |
Beschreibung | Die Referenz arrayref muss auf ein Array verweisen, dessen Komponenten vom Typ byte oder boolean sind. Aus arrayref und index, die vom Stack entnommen werden, wird der byte - oder boolean -Wert an der Position index des Arrays bestimmt, auf den int -Wert value erweiteret, und dieser auf den Stack gebracht. Für byte wird das Vorzeichen berücksichtigt. Bei boolean findet eine vorzeichenlose Erweiterung statt. |
Exceptions |
|
Hinweis | Die baload-Anweisung wird sowohl für byte - als auch boolean -Arrays verwendet. Suns Implementierung verwendet etwa 8 Bit Werte um ein boolean abzubilden. Diese können aber ebenso als Bitfeld implementiert werden. |
Befehl | Speichert byte oder boolean value in Zelle index des Arrays arrayref |
---|---|
Format | bastore |
Formen |
|
Operand-Stack | ... arrayref reference index int value int ... |
Beschreibung | Die Operanden arrayref, index und value werden vom Operad-Stack entnommen. Der int Wert value wird auf byte gekürzt, und im Array arrayref in Zelle index abgelegt. |
Exceptions |
|
Hinweis | Der bastore Befehl wird für byte - und boolean -Arrays verwendet, um einen Wert darin zu setzen. Ein boolean -Array kann dabei als byte -Array oder auch als Bitfeld implementiert sein. |
Befehl | byte Konstante bvalue zu int ivalue erweitern und auf OS |
---|---|
Format | bipush bvalue |
Formen |
|
Operand-Stack | ... ... ivalue int |
Beschreibung | Erweitert die byte Konstante bvalue vorzeichenbehaftet zum int -Wert ivalue und legt diesen auf dem Operand-Stack ab. |
Befehl | Läd char value aus Zelle index des Arrays arrayref |
---|---|
Format | caload |
Formen |
|
Operand-Stack | ... arrayref reference index int ... value int |
Beschreibung | Die Referenz arrayref muss auf ein Array verweisen, dessen Komponenten vom Typ char sind. Aus arrayref und index, die vom Stack entnommen werden, wird der char -Wert an der Position index des Arrays bestimmt, vorzeichenlos auf den int -Wert value erweitert, und dieser auf den Stack gebracht. |
Exceptions |
|
Befehl | Speichert char value in Zelle index des Arrays arrayref |
---|---|
Format | castore |
Formen |
|
Operand-Stack | ... arrayref reference index int value int ... |
Beschreibung | Die Operanden arrayref, index und value werden vom Operad-Stack entnommen. Der int Wert value wird auf char gekürzt, und im Array arrayref in Zelle index abgelegt. |
Exceptions |
|
Befehl | Prüfen, ob reference objectref zu einer bestimmten Klasse zuweisungsungskompatiebel ist |
---|---|
Format | checkcast indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... objectref reference ... objectref reference |
Befehl | Typkonvertierung: double value zu float result |
---|---|
Format | d2f |
Formen |
|
Operand-Stack | ... value double ... result float |
Befehl | Typkonvertierung: double value zu int result |
---|---|
Format | d2i |
Formen |
|
Operand-Stack | ... value double ... result int |
Befehl | Typkonvertierung: double value zu long result |
---|---|
Format | d2l |
Formen |
|
Operand-Stack | ... value double ... result long |
Befehl | Addition (double ): value1 + value2 = result |
---|---|
Format | dadd |
Formen |
|
Operand-Stack | ... value1 double value2 double ... result double |
Beschreibung | Entnimmt die Es gelten die Regeln der IEEE Arithmetik:
Ansonsten wird auf den nächsten |
Befehl | Läd double value aus Zelle index des Arrays arrayref |
---|---|
Format | daload |
Formen |
|
Operand-Stack | ... arrayref reference index int ... value double |
Beschreibung | Die Referenz arrayref muss auf ein Array verweisen, dessen Komponenten vom Typ double sind. Aus arrayref und index, die vom Stack entnommen werden, wird der double -Wert value an der Position index des Arrays bestimmt, und auf den Stack gebracht. |
Exceptions |
|
Befehl | Speichert double value in Zelle index des Arrays arrayref |
---|---|
Format | dastore |
Formen |
|
Operand-Stack | ... arrayref reference index int value double ... |
Beschreibung | Die Operanden arrayref, index und value werden vom Operad-Stack entnommen. Der double Wert value wird im Array arrayref in Zelle index abgelegt. |
Exceptions |
|
Befehl | Vergeich (double ): value1 == value2 ? |
---|---|
Format | dcmp<d> |
Formen | |
Operand-Stack | ... value1 double value2 double ... result int |
Befehl | double -Konstante const_value auf OS |
---|---|
Format | dconst_<d> |
Formen | |
Operand-Stack | ... ... const_value double |
Beschreibung | Bringt die double Konstante const_value (0.0d, 1.0d) auf den Operand-Stack. |
Befehl | Division (double ): value1 / value2 = result |
---|---|
Format | ddiv |
Formen |
|
Operand-Stack | ... value1 double value2 double ... result double |
Befehl | Läd double value aus lokaler Variable index und index + 1 |
---|---|
Format | dload index |
Formen |
|
Operand-Stack | ... ... value double |
Beschreibung | Der index ist ein vorzeichenloser byte -Wert, der einen Index in das Array der lokalen Variablen des aktuellen Frames angibt. Der an index und index + 1 enthaltene double -Wert value wird auf den Operand-Stack gebracht. |
Hinweis | Der dload Befehl kann zusammen mit dem wide Befehl verwendet werden, um einen höheren Index über eine vorzeichenlose 2-byte -Wert anzugeben. |
Befehl | Läd double value aus lokaler Variable d und d + 1 |
---|---|
Format | dload_<d> |
Formen | |
Operand-Stack | ... ... value double |
Beschreibung | Der double Wert value aus dem Element d (0, 1 , 2, 3) und d + 1 des Arrays der kolaken Variablen wird auf den Operand-Stack abgelegt. |
Hinweis | Jeder Befehl der Familie ist äquivalent zum dload <d> Befehl, nur dass der Index d der lokalen Variable hier im Befehl selbst enthalten ist. |
Befehl | Multiplikation (double ): value1 * value2 = result |
---|---|
Format | dmul |
Formen |
|
Operand-Stack | ... value1 double value2 double ... result double |
Befehl | Negation (double ): -value = result |
---|---|
Format | dneg |
Formen |
|
Operand-Stack | ... value double ... result double |
Befehl | Divisionsrest (double ): value1 % value2 = result |
---|---|
Format | drem |
Formen |
|
Operand-Stack | ... value1 double value2 double ... result double |
Befehl | Rückgabewert double value einer Methode |
---|---|
Format | dreturn |
Formen |
|
Operand-Stack | ... value double [empty] |
Befehl | Speichert double value in lokalen Variablen index und index + 1 |
---|---|
Format | dstore index |
Formen |
|
Operand-Stack | ... value double ... |
Beschreibung | Der index ist ein vorzeichenloser byte -Wert, der einen Index in das Array der lokalen Variablen des aktuellen Frames angibt. Der double Wert value wird vom Operand-Stack entnommen und in den lokalen Variablen index und index + 1 gespeichert. |
Hinweis | Der dstore Befehl kann zusammen mit dem wide Befehl verwendet werden, um einen höheren Index über eine vorzeichenlose 2-byte -Wert anzugeben. |
Befehl | Speichert double value in lokalen Variablen d und d + 1 |
---|---|
Format | dstore_<d> |
Formen | |
Operand-Stack | ... value double ... |
Beschreibung | Der double Wert value wird vom Operand-Stack entnommen und in den lokalen Variablen d (0, 1 , 2, 3) und d + 1 gespeichert. |
Hinweis | Jeder Befehl der Familie ist äquivalent zum dstore <d> Befehl, nur dass der Index d der lokalen Variable hier im Befehl selbst enthalten ist. |
Befehl | Subtraktion (double ): value1 - value2 = result |
---|---|
Format | dsub |
Formen |
|
Operand-Stack | ... value1 double value2 double ... result double |
Befehl | Verdoppelt das oberste Element des OS |
---|---|
Format | dup |
Formen |
|
Operand-Stack | ... value ... value value |
Beschreibung | Erstellt eine Kopie des obersten Elements des Operand-Stacks und legt diese darauf ab. Das Element value muss von einem Kategorie 1 Typ (int , float , returnAddress oder reference ) sein. |
Befehl | Verdoppelt die obersten 2 Elemente des OS |
---|---|
Format | dup2 |
Formen |
|
Operand-Stack | ... value2 value1 ... value2 value1 value2 value1 |
Beschreibung | Erstellt eine Kopie der obersten zwei Elemente des Operand-Stacks und legt beide nochmals darauf ab. value1 und value2 können beides Elemente der Kategorie 1 (int , float , returnAddress oder reference ) sein, oder aber zusammen ein Element der Kategorie 2 (long oder double ) bilden. |
Befehl | Kopiert die obersten 2 Element des OS und fügt dies 3 Elemente darüber ein. |
---|---|
Format | dup2_x1 |
Formen |
|
Operand-Stack | ... value3 value2 value1 ... value2 value1 value3 value2 value1 |
Beschreibung | Erstellt eine Kopie der obersten beiden Elemente des Operand-Stacks und fügt diese drei Elemente davor auf dem Operand-Stack ein. value3 muss ein Element der Kategorie 1 (int , float , returnAddress oder reference ) sein. Die kopierten Elemente value1 und value2 können entweder beide ebenso zur Kategorie 1 gehören oder aber zusammen ein Element der Kategorie 2 (long oder double ) bilden. |
Befehl | Kopiert die obersten 2 Element des OS und fügt dies 4 Elemente darüber ein. |
---|---|
Format | dup2_x2 |
Formen |
|
Operand-Stack | ... value4 value3 value2 value1 ... value2 value1 value4 value3 value2 value1 |
Beschreibung | Erstellt eine Kopie der obersten beiden Elemente des Operand-Stacks und fügt diese drei Elemente davor auf dem Operand-Stack ein. Die Paare value3 und value4 und value1 und value2 können entweder aus zwei Element der Kategorie 1 (int , float , returnAddress oder reference ) bestehen oder jedes Paar für sich zusammen ein Element der Kategorie 2 (long oder double ) bilden. |
Befehl | Kopiert das oberste Element des OS und fügt dies 2 Elemente darüber ein. |
---|---|
Format | dup_x1 |
Formen |
|
Operand-Stack | ... value2 value1 ... value1 value2 value1 |
Beschreibung | Erstellt eine Kopie des obersten Elements des Operand-Stacks und fügt diese zwei Elemente davor auf dem Operand-Stack ein. value1 und value2 müssen Elemente der Kategorie 1 (int , float , returnAddress oder reference ) sein. |
Befehl | Kopiert das oberste Element des OS und fügt dies 3 Elemente darüber ein. |
---|---|
Format | dup_x2 |
Formen |
|
Operand-Stack | ... value3 value2 value1 ... value1 value3 value2 value1 |
Beschreibung | Erstellt eine Kopie des obersten Elements des Operand-Stacks und fügt diese drei Elemente davor auf dem Operand-Stack ein. value1 muss ein Elemente der Kategorie 1 (int , float , returnAddress oder reference ) sein. value2 und value 3 können ebenfalls beides Elemente der Kategorie 1 sein, oder aber zusammen ein Element der Kategorie 2 (long oder double ) bilden. |
Befehl | Typkonvertierung: float value zu double result |
---|---|
Format | f2d |
Formen |
|
Operand-Stack | ... value float ... result double |
Befehl | Typkonvertierung: float value zu int result |
---|---|
Format | f2i |
Formen |
|
Operand-Stack | ... value float ... result int |
Befehl | Typkonvertierung: float value zu long result |
---|---|
Format | f2l |
Formen |
|
Operand-Stack | ... value float ... result long |
Befehl | Addition (float ): value1 + value2 = result |
---|---|
Format | fadd |
Formen |
|
Operand-Stack | ... value1 float value2 float ... result float |
Beschreibung | Entnimmt die Es gelten die Regeln der IEEE Arithmetik:
Ansonsten wird auf den nächsten |
Befehl | Läd float value aus Zelle index des Arrays arrayref |
---|---|
Format | faload |
Formen |
|
Operand-Stack | ... arrayref reference index int ... value float |
Beschreibung | Die Referenz arrayref muss auf ein Array verweisen, dessen Komponenten vom Typ float sind. Aus arrayref und index, die vom Stack entnommen werden, wird der float -Wert value an der Position index des Arrays bestimmt, und auf den Stack gebracht. |
Exceptions |
|
Befehl | Speichert float value in Zelle index des Arrays arrayref |
---|---|
Format | fastore |
Formen |
|
Operand-Stack | ... arrayref reference index int value float ... |
Beschreibung | Die Operanden arrayref, index und value werden vom Operad-Stack entnommen. Der float Wert value wird im Array arrayref in Zelle index abgelegt. |
Exceptions |
|
Befehl | Vergeich (float ): value1 == value2 ? |
---|---|
Format | fcmp<f> |
Formen | |
Operand-Stack | ... value1 float value2 float ... result int |
Befehl | float -Konstante const_value auf OS |
---|---|
Format | fconst_<f> |
Formen | |
Operand-Stack | ... ... const_value float |
Beschreibung | Bringt die float Konstante const_value (0.0f, 1.0f, 2.0f) auf den Operand-Stack. |
Befehl | Division (float ): value1 / value2 = result |
---|---|
Format | fdiv |
Formen |
|
Operand-Stack | ... value1 float value2 float ... result float |
Befehl | Läd float value aus lokaler Variable index |
---|---|
Format | fload index |
Formen |
|
Operand-Stack | ... ... value float |
Beschreibung | Der index ist ein vorzeichenloser byte -Wert, der einen Index in das Array der lokalen Variablen des aktuellen Frames angibt. Der an index enthaltene float -Wert value wird auf den Operand-Stack gebracht. |
Hinweis | Der fload Befehl kann zusammen mit dem wide Befehl verwendet werden, um einen höheren Index über eine vorzeichenlose 2-byte -Wert anzugeben. |
Befehl | Läd float value aus lokaler Variable f |
---|---|
Format | fload_<f> |
Formen | |
Operand-Stack | ... ... value float |
Beschreibung | Der float Wert value aus dem Element f (0, 1 , 2, 3) des Arrays der kolaken Variablen wird auf den Operand-Stack abgelegt. |
Hinweis | Jeder Befehl der Familie ist äquivalent zum fload <f> Befehl, nur dass der Index f der lokalen Variable hier im Befehl selbst enthalten ist. |
Befehl | Multiplikation (float ): value1 * value2 = result |
---|---|
Format | fmul |
Formen |
|
Operand-Stack | ... value1 float value2 float ... result float |
Befehl | Negation (float ): -value = result |
---|---|
Format | fneg |
Formen |
|
Operand-Stack | ... value float ... result float |
Befehl | Divisionsrest (float ): value1 % value2 = result |
---|---|
Format | frem |
Formen |
|
Operand-Stack | ... value1 float value2 float ... result float |
Befehl | Rückgabewert float value einer Methode |
---|---|
Format | freturn |
Formen |
|
Operand-Stack | ... value float [empty] |
Befehl | Speichert float value in lokaler Variable index |
---|---|
Format | fstore index |
Formen |
|
Operand-Stack | ... value float ... |
Beschreibung | Der index ist ein vorzeichenloser byte -Wert, der einen Index in das Array der lokalen Variablen des aktuellen Frames angibt. Der float Wert value wird vom Operand-Stack entnommen und in der lokalen Variable index gespeichert. |
Hinweis | Der fstore Befehl kann zusammen mit dem wide Befehl verwendet werden, um einen höheren Index über eine vorzeichenlose 2-byte -Wert anzugeben. |
Befehl | Speichert float value in lokaler Variable f |
---|---|
Format | fstore_<f> |
Formen | |
Operand-Stack | ... value float ... |
Beschreibung | Der float Wert value wird vom Operand-Stack entnommen und in der lokalen Variable f (0, 1 , 2, 3) gespeichert. |
Hinweis | Jeder Befehl der Familie ist äquivalent zum fstore <f> Befehl, nur dass der Index f der lokalen Variable hier im Befehl selbst enthalten ist. |
Befehl | Subtraktion (float ): value1 - value2 = result |
---|---|
Format | fsub |
Formen |
|
Operand-Stack | ... value1 float value2 float ... result float |
Befehl | Lesen eines Feldes der Instanz objectref |
---|---|
Format | getfield indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... objectref reference ... value |
Befehl | Lesen eines static Feldes einer Klasse |
---|---|
Format | getstatic indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... ... value |
Befehl | Unbedingter Sprung |
---|---|
Format | goto branchbyte1 branchbyte2 |
Formen |
|
Operand-Stack | ... ... |
Befehl | Unbedingter Sprung (weitreichender Index) |
---|---|
Format | goto_w branchbyte1 branchbyte2 branchbyte3 branchbyte4 |
Formen |
|
Operand-Stack | ... ... |
Befehl | Typkonvertierung: int value zu byte result |
---|---|
Format | i2b |
Formen |
|
Operand-Stack | ... value int ... result int |
Befehl | Typkonvertierung: int value zu char result |
---|---|
Format | i2c |
Formen |
|
Operand-Stack | ... value int ... result int |
Befehl | Typkonvertierung: int value zu double result |
---|---|
Format | i2d |
Formen |
|
Operand-Stack | ... value int ... result double |
Befehl | Typkonvertierung: int value zu float result |
---|---|
Format | i2f |
Formen |
|
Operand-Stack | ... value int ... result float |
Befehl | Typkonvertierung: int value zu long result |
---|---|
Format | i2l |
Formen |
|
Operand-Stack | ... value int ... result long |
Befehl | Typkonvertierung: int value zu short result |
---|---|
Format | i2s |
Formen |
|
Operand-Stack | ... value int ... result int |
Befehl | Addition (int ): value1 + value2 = result |
---|---|
Format | iadd |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Beschreibung | Entnimmt die Wenn es bei der Addition zu einem Überlauf kommt, kann das Vorzeichen von result ungleich dem Vorzeichen der korrekten mathematischen Summe von value1 und value2 sein. Es wird auch dann keine Exception ausgelöst. |
Befehl | Läd int value aus Zelle index des Arrays arrayref |
---|---|
Format | iaload |
Formen |
|
Operand-Stack | ... arrayref reference index int ... value int |
Beschreibung | Die Referenz arrayref muss auf ein Array verweisen, dessen Komponenten vom Typ int sind. Aus arrayref und index, die vom Stack entnommen werden, wird der int -Wert value an der Position index des Arrays bestimmt, und auf den Stack gebracht. |
Exceptions |
|
Befehl | Logisches UND (int ): value1 & value2 = result |
---|---|
Format | iand |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Befehl | Speichert int value in Zelle index des Arrays arrayref |
---|---|
Format | iastore |
Formen |
|
Operand-Stack | ... arrayref reference index int value int ... |
Beschreibung | Die Operanden arrayref, index und value werden vom Operad-Stack entnommen. Der int Wert value wird im Array arrayref in Zelle index abgelegt. |
Exceptions |
|
Befehl | int -Konstante const_value auf OS |
---|---|
Format | iconst_<i> |
Formen | |
Operand-Stack | ... ... const_value int |
Beschreibung | Bringt die int Konstante const_value (-1, 0, 1, 2, 3, 4, 5) auf den Operand-Stack. |
Hinweis | Jeder Befehl der Familie ist äqivalent zum bipush <i> Befehl, nur dass der Wert i impliziet im Befehl enthalten ist. |
Befehl | Division (int ): value1 / value2 = result |
---|---|
Format | idiv |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Beschreibung | Entnimmt die Eine |
Exceptions |
|
Befehl | Sprung wenn Bedingung i auf int Vergleich value == 0 zutrifft |
---|---|
Format | if<i> branchbyte1 branchbyte2 |
Formen | |
Operand-Stack | ... value int ... |
Befehl | Sprung wenn reference value nicht null ist |
---|---|
Format | ifnonnull branchbyte1 branchbyte2 |
Formen |
|
Operand-Stack | ... value reference ... |
Befehl | Sprung wenn reference value null ist |
---|---|
Format | ifnull branchbyte1 branchbyte2 |
Formen |
|
Operand-Stack | ... value reference ... |
Befehl | Sprung wenn Bedingung i auf reference Vergleich value1 == value2 zutrifft |
---|---|
Format | if_acmp<i> branchbyte1 branchbyte2 |
Formen | |
Operand-Stack | ... value1 reference value2 reference ... |
Befehl | Sprung wenn Bedingung i auf int Vergleich value1 == value2 zutrifft |
---|---|
Format | if_icmp<i> branchbyte1 branchbyte2 |
Formen | |
Operand-Stack | ... value1 int value2 int ... |
Befehl | Lokale Variable index um Konstante value inkementieren |
---|---|
Format | iinc index value |
Formen |
|
Operand-Stack | ... ... |
Befehl | Läd int value aus lokaler Variable index |
---|---|
Format | iload index |
Formen |
|
Operand-Stack | ... ... value int |
Beschreibung | Der index ist ein vorzeichenloser byte -Wert, der einen Index in das Array der lokalen Variablen des aktuellen Frames angibt. Der an index enthaltene int -Wert value wird auf den Operand-Stack gebracht. |
Hinweis | Der iload Befehl kann zusammen mit dem wide Befehl verwendet werden, um einen höheren Index über eine vorzeichenlose 2-byte -Wert anzugeben. |
Befehl | Läd int value aus lokaler Variable i |
---|---|
Format | iload_<i> |
Formen | |
Operand-Stack | ... ... value int |
Beschreibung | Der int Wert value aus dem Element i (0, 1 , 2, 3) des Arrays der kolaken Variablen wird auf den Operand-Stack abgelegt. |
Hinweis | Jeder Befehl der Familie ist äquivalent zum iload <i> Befehl, nur dass der Index i der lokalen Variable hier im Befehl selbst enthalten ist. |
Befehl | Multiplikation (int ): value1 * value2 = result |
---|---|
Format | imul |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Beschreibung | Entnimmt die Wenn es bei der Multiplikation zu einem Überlauf kommt, kann das Vorzeichen von result ungleich dem Vorzeichen der korrekten mathematischen Differnz von value1 und value2 sein. Es wird auch dann keine Exception ausgelöst. |
Befehl | Negation (int ): -value = result |
---|---|
Format | ineg |
Formen |
|
Operand-Stack | ... value int ... result int |
Beschreibung | Entnimmt den Bei Es gilt: |
Befehl | Prüfen, ob reference objectref zu einer bestimmten Klasse zuweisungsungskompatiebel ist |
---|---|
Format | instanceof indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... objectref reference ... result int |
Befehl | Auf einer Interface-Methode für Instanz objectref |
---|---|
Format | invokeinterface indexbyte1 indexbyte2 count 0 |
Formen |
|
Operand-Stack | ... objectref reference [arg1] [arg2...] ... |
Befehl | Auf einer Methode für Instanz objectref, besondere Behandlung für super , private und Initialiserungsmethoden |
---|---|
Format | invokespecial indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... objectref reference [arg1] [arg2...] ... |
Befehl | Auf einer Klassen-Methode (static ) |
---|---|
Format | invokestatic indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... [arg1] [arg2...] ... |
Befehl | Auf einer Methode für Instanz objectref, klassenabhängiges Binden |
---|---|
Format | invokevirtual indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... objectref reference [arg1] [arg2...] ... |
Befehl | Logisches ODER (int ): value1 | value2 = result |
---|---|
Format | ior |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Befehl | Divisionsrest (int ): value1 % value2 = result |
---|---|
Format | irem |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Beschreibung | Entnimmt die int -Werte value1 und value2 vom Operand-Stack und legt den Divisionsrest value1 - (value1 / value2) * value2 als Ergebnis result wieder auf diesem ab. |
Exceptions |
|
Befehl | Rückgabewert int value einer Methode |
---|---|
Format | ireturn |
Formen |
|
Operand-Stack | ... value int [empty] |
Befehl | Schieben nach links (int ): value1 << value2' = result |
---|---|
Format | ishl |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Beschreibung | Entnimmt value1 und value2 vom Operand-Stack, schiebt den int Wert value1 um s Stellen nach links, und legt das Ergebnis result wieder auf dem OS ab. s ist durch die niederwertisten 5 Bit von value2 bestimmt. |
Hinweis | Die Operation entspricht: Die Anzahl der Stellen s, um die geschoben wird, liegt immer zwischen 0 und 31 (inklusive), als ob value2 zunächst mit |
Befehl | Arithmetisches Schieben nach rechts (int ): value1 >> value2' = result |
---|---|
Format | ishr |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Beschreibung | Entnimmt value1 und value2 vom Operand-Stack, schiebt den int Wert value1 um s Stellen nach rechts, und legt das Ergebnis result wieder auf dem OS ab. s ist durch die niederwertisten 5 Bit von value2 bestimmt. |
Hinweis | Die Operation entspricht Die Anzahl der Stellen s, um die geschoben wird, liegt immer zwischen 0 und 31 (inklusive), als ob value2 zunächst mit |
Befehl | Speichert int value in lokaler Variable index |
---|---|
Format | istore index |
Formen |
|
Operand-Stack | ... value int ... |
Beschreibung | Der index ist ein vorzeichenloser byte -Wert, der einen Index in das Array der lokalen Variablen des aktuellen Frames angibt. Der int Wert value wird vom Operand-Stack entnommen und in der lokalen Variable index gespeichert. |
Hinweis | Der istore Befehl kann zusammen mit dem wide Befehl verwendet werden, um einen höheren Index über eine vorzeichenlose 2-byte -Wert anzugeben. |
Befehl | Speichert int value in lokaler Variable i |
---|---|
Format | istore_<i> |
Formen | |
Operand-Stack | ... value int ... |
Beschreibung | Der int Wert value wird vom Operand-Stack entnommen und in der lokalen Variable i (0, 1 , 2, 3) gespeichert. |
Hinweis | Jeder Befehl der Familie ist äquivalent zum istore <i> Befehl, nur dass der Index i der lokalen Variable hier im Befehl selbst enthalten ist. |
Befehl | Subtraktion (int ): value1 - value2 = result |
---|---|
Format | isub |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Beschreibung | Entnimmt die Wenn es bei der Subtraktion zu einem Überlauf kommt, kann das Vorzeichen von result ungleich dem Vorzeichen der korrekten mathematischen Differnz von value1 und value2 sein. Es wird auch dann keine Exception ausgelöst. |
Befehl | Logisches Schieben nach rechts (int ): value1 >>> value2' = result |
---|---|
Format | iushr |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Befehl | Logisches XOR (int ): value1 ^ value2 = result |
---|---|
Format | ixor |
Formen |
|
Operand-Stack | ... value1 int value2 int ... result int |
Befehl | Unterprogrammsprung |
---|---|
Format | jsr branchbyte1 branchbyte2 |
Formen |
|
Operand-Stack | ... ... address returnAddress |
Befehl | Unterprogrammsprung (weitreichender Index) |
---|---|
Format | jsr_w branchbyte1 branchbyte2 branchbyte3 branchbyte4 |
Formen |
|
Operand-Stack | ... ... address returnAddress |
Befehl | Typkonvertierung: long value zu double result |
---|---|
Format | l2d |
Formen |
|
Operand-Stack | ... value long ... result double |
Befehl | Typkonvertierung: long value zu float result |
---|---|
Format | l2f |
Formen |
|
Operand-Stack | ... value long ... result float |
Befehl | Typkonvertierung: long value zu int result |
---|---|
Format | l2i |
Formen |
|
Operand-Stack | ... value long ... result int |
Befehl | Addition (long ): value1 + value2 = result |
---|---|
Format | ladd |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Beschreibung | Entnimmt die Wenn es bei der Addition zu einem Überlauf kommt, kann das Vorzeichen von result ungleich dem Vorzeichen der korrekten mathematischen Summe von value1 und value2 sein. Es wird auch dann keine Exception ausgelöst. |
Befehl | Läd long value aus Zelle index des Arrays arrayref |
---|---|
Format | laload |
Formen |
|
Operand-Stack | ... arrayref reference index int ... value long |
Beschreibung | Die Referenz arrayref muss auf ein Array verweisen, dessen Komponenten vom Typ long sind. Aus arrayref und index, die vom Stack entnommen werden, wird der long -Wert value an der Position index des Arrays bestimmt, und auf den Stack gebracht. |
Exceptions |
|
Befehl | Logisches UND (long ): value1 & value2 = result |
---|---|
Format | land |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Befehl | Speichert long value in Zelle index des Arrays arrayref |
---|---|
Format | lastore |
Formen |
|
Operand-Stack | ... arrayref reference index int value long ... |
Beschreibung | Die Operanden arrayref, index und value werden vom Operad-Stack entnommen. Der long Wert value wird im Array arrayref in Zelle index abgelegt. |
Exceptions |
|
Befehl | Vergeich (long ): value1 == value2 ? |
---|---|
Format | lcmp |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result int |
Befehl | long -Konstante const_value auf OS |
---|---|
Format | lconst_<l> |
Formen | |
Operand-Stack | ... ... const_value long |
Beschreibung | Bringt die long Konstante const_value (0L, 1L) auf den Operand-Stack. |
Befehl | Konstante aus RCP #index auf OS |
---|---|
Format | ldc index |
Formen |
|
Operand-Stack | ... ... value |
Beschreibung | Der index-Wert wird als vorzeichenloser Indexwert in den RCP der aktuellen Klasse verwendet, der dort eine Konstante vom Typ Enthält der RCP an index eine Ist an index eine String-Konstante enthalten wird eine Ansonsten muss es sich beim Eintrag index um eine symbolische Referenz einer Klasse handeln, die zu einer |
Exceptions |
|
Befehl | Konstante aus RCP #index auf OS |
---|---|
Format | ldc2_w indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... ... value long|double |
Beschreibung | Aus indexbyte1 und indexbyte2 wird ein vorzeichenlosen Indexwert in den RCP der aktuellen Klasse bestimmt: Der numerischer Wert value der |
Hinweis | Es gibt keine ldc2 -Variante wie bei ldc und ldc_w . |
Befehl | Konstante aus RCP #index auf OS |
---|---|
Format | ldc_w indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... ... value |
Beschreibung | Aus indexbyte1 und indexbyte2 wird ein vorzeichenlosen Indexwert in den RCP der aktuellen Klasse bestimmt: index = (indexbyte1 << 8) Ι indexbyte2 . Ansonsten verhält sich ldc_w wie ldc . |
Befehl | Division (long ): value1 / value2 = result |
---|---|
Format | ldiv |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Beschreibung | Entnimmt die Eine |
Exceptions |
|
Befehl | Läd long value aus lokaler Variable index und index + 1 |
---|---|
Format | lload index |
Formen |
|
Operand-Stack | ... ... value long |
Beschreibung | Der index ist ein vorzeichenloser byte -Wert, der einen Index in das Array der lokalen Variablen des aktuellen Frames angibt. Der an index und index + 1 enthaltene long -Wert value wird auf den Operand-Stack gebracht. |
Hinweis | Der lload Befehl kann zusammen mit dem wide Befehl verwendet werden, um einen höheren Index über eine vorzeichenlose 2-byte -Wert anzugeben. |
Befehl | Läd long value aus lokaler Variable l und l + 1 |
---|---|
Format | lload_<l> |
Formen | |
Operand-Stack | ... ... value long |
Beschreibung | Der long Wert value aus dem Element l (0, 1 , 2, 3) und l + 1 des Arrays der kolaken Variablen wird auf den Operand-Stack abgelegt. |
Hinweis | Jeder Befehl der Familie ist äquivalent zum lload <l> Befehl, nur dass der Index l der lokalen Variable hier im Befehl selbst enthalten ist. |
Befehl | Multiplikation (long ): value1 * value2 = result |
---|---|
Format | lmul |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Beschreibung | Entnimmt die Wenn es bei der Multiplikation zu einem Überlauf kommt, kann das Vorzeichen von result ungleich dem Vorzeichen der korrekten mathematischen Differnz von value1 und value2 sein. Es wird auch dann keine Exception ausgelöst. |
Befehl | Negation (long ): -value = result |
---|---|
Format | lneg |
Formen |
|
Operand-Stack | ... value long ... result long |
Beschreibung | Entnimmt den Bei Es gilt: |
Befehl | Sprungtabelleneintrag nach key durchsuchen und springen |
---|---|
Format | lookupswitch <0-3 byte pad> defaultbyte1 defaultbyte2 defaultbyte3 defaultbyte4 npairs1 npairs2 npairs3 npairs4 match-offset pairs... |
Formen |
|
Operand-Stack | ... key int ... |
Befehl | Logisches ODER (long ): value1 | value2 = result |
---|---|
Format | lor |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Befehl | Divisionsrest (long ): value1 % value2 = result |
---|---|
Format | lrem |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Beschreibung | Entnimmt die long -Werte value1 und value2 vom Operand-Stack und legt den Divisionsrest value1 - (value1 / value2) * value2 als Ergebnis result wieder auf diesem ab. |
Exceptions |
|
Befehl | Rückgabewert long value einer Methode |
---|---|
Format | lreturn |
Formen |
|
Operand-Stack | ... value long [empty] |
Befehl | Schieben nach links (long ): value1 << value2' = result |
---|---|
Format | lshl |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Beschreibung | Entnimmt value1 und value2 vom Operand-Stack, schiebt den long Wert value1 um s Stellen nach links, und legt das Ergebnis result wieder auf dem OS ab. s ist durch die niederwertisten 6 Bit von value2 bestimmt. |
Hinweis | Die Operation entspricht: Die Anzahl der Stellen s, um die geschoben wird, liegt immer zwischen 0 und 63 (inklusive), als ob value2 zunächst mit |
Befehl | Arithmetisches Schieben nach rechts (long ): value1 >> value2' = result |
---|---|
Format | lshr |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Beschreibung | Entnimmt value1 und value2 vom Operand-Stack, schiebt den long Wert value1 um s Stellen nach links, und legt das Ergebnis result wieder auf dem OS ab. s ist durch die niederwertisten 6 Bit von value2 bestimmt. |
Hinweis | Die Operation entspricht: Die Anzahl der Stellen s, um die geschoben wird, liegt immer zwischen 0 und 63 (inklusive), als ob value2 zunächst mit |
Befehl | Speichert long value in lokalen Variablen index und index + 1 |
---|---|
Format | lstore index |
Formen |
|
Operand-Stack | ... value long ... |
Beschreibung | Der index ist ein vorzeichenloser byte -Wert, der einen Index in das Array der lokalen Variablen des aktuellen Frames angibt. Der long Wert value wird vom Operand-Stack entnommen und in den lokalen Variablen index und index + 1 gespeichert. |
Hinweis | Der lstore Befehl kann zusammen mit dem wide Befehl verwendet werden, um einen höheren Index über eine vorzeichenlose 2-byte -Wert anzugeben. |
Befehl | Speichert long value in lokalen Variablen l und l + 1 |
---|---|
Format | lstore_<l> |
Formen | |
Operand-Stack | ... value long ... |
Beschreibung | Der long Wert value wird vom Operand-Stack entnommen und in den lokalen Variablen l (0, 1 , 2, 3) und l + 1 gespeichert. |
Hinweis | Jeder Befehl der Familie ist äquivalent zum lstore <l> Befehl, nur dass der Index l der lokalen Variable hier im Befehl selbst enthalten ist. |
Befehl | Subtraktion (long ): value1 - value2 = result |
---|---|
Format | lsub |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Beschreibung | Entnimmt die Wenn es bei der Subtraktion zu einem Überlauf kommt, kann das Vorzeichen von result ungleich dem Vorzeichen der korrekten mathematischen Differnz von value1 und value2 sein. Es wird auch dann keine Exception ausgelöst. |
Befehl | Logisches Schieben nach rechts (long ): value1 >>> value2' = result |
---|---|
Format | lushr |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Befehl | Logisches XOR (long ): value1 ^ value2 = result |
---|---|
Format | lxor |
Formen |
|
Operand-Stack | ... value1 long value2 long ... result long |
Befehl | Monitor des Objekts objectref betreten |
---|---|
Format | monitorenter |
Formen |
|
Operand-Stack | ... objectref reference ... |
Befehl | Monitor des Objekts objectref verlassen |
---|---|
Format | monitorexit |
Formen |
|
Operand-Stack | ... objectref reference ... |
Befehl | Neues mehrdimensionales Array mit reference Elementtyp anlegen |
---|---|
Format | multianewarray indexbyte1 indexbyte2 dimensions |
Formen |
|
Operand-Stack | ... count1 int [count2...] int ... arrayref |
Befehl | Neues Objekt erzeugen (Speicher allozieren) |
---|---|
Format | new indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... ... objectref reference |
Befehl | Neues 1-dimensionales Array mit primitiven Elementtyp anlegen |
---|---|
Format | newarray atype |
Formen |
|
Operand-Stack | ... count int ... arrayref reference |
Befehl | Keine Aktion |
---|---|
Format | nop |
Formen |
|
Operand-Stack | ... ... |
Beschreibung | Es wird keine Aktion ausgeführt. |
Befehl | Entfernt das oberste Element vom OS |
---|---|
Format | pop |
Formen |
|
Operand-Stack | ... value ... |
Beschreibung | Entfernd das oberste Element vom Operand-Stack. Dies muss von einem Kategorie 1 Typ (int , float , returnAddress oder reference ) sein. |
Befehl | Entfernt die obersten 1 oder 2 Elemente vom OS |
---|---|
Format | pop2 |
Formen |
|
Operand-Stack | ... value1 value2 ... |
Beschreibung | Entfernt die obersten beiden Kategorie 1 (int , float , returnAddress oder reference ) Elemente oder das oberste Kategorie 2 (long oder double ) Element vom Operand-Stack. |
Befehl | Setzen eines Feldes der Instanz objectref |
---|---|
Format | putfield indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... objectref reference value ... |
Befehl | Setzen eines static Feldes einer Klasse |
---|---|
Format | putstatic indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | ... value ... |
Befehl | Rücksprung aus Unterprogramm |
---|---|
Format | ret index |
Formen |
|
Operand-Stack | ... ... |
Befehl | Rückgabewert void einer Methode |
---|---|
Format | return |
Formen |
|
Operand-Stack | ... [empty] |
Befehl | Läd short value aus Zelle index des Arrays arrayref |
---|---|
Format | saload |
Formen |
|
Operand-Stack | ... arrayref reference index int ... value int |
Beschreibung | Die Referenz arrayref muss auf ein Array verweisen, dessen Komponenten vom Typ short sind. Aus arrayref und index, die vom Stack entnommen werden, wird der short -Wert an der Position index des Arrays bestimmt, vorzeichenbehaftet auf den int -Wert value erweitert, und dieser auf den Stack gebracht. |
Exceptions |
|
Befehl | Speichert short value in Zelle index des Arrays arrayref |
---|---|
Format | sastore |
Formen |
|
Operand-Stack | ... arrayref reference index int value int ... |
Beschreibung | Die Operanden arrayref, index und value werden vom Operad-Stack entnommen. Der int Wert value wird auf short gekürzt, und im Array arrayref in Zelle index abgelegt. |
Exceptions |
|
Befehl | short Konstante svalue zu int ivalue erweitern und auf OS |
---|---|
Format | sipush svalue |
Formen |
|
Operand-Stack | ... ... ivalue int |
Beschreibung | Erweitert die short Konstante svalue vorzeichenbehaftet zum int -Wert ivalue und legt diesen auf dem Operand-Stack ab. |
Befehl | Vertauscht die obersten beiden Elemente auf dem OS |
---|---|
Format | swap |
Formen |
|
Operand-Stack | ... value2 value1 ... value1 value2 |
Beschreibung | Vertauscht die obersten zwei Elemente des Operand-Stack. value1 und value2 müssen Elemente der Kategorie 1 (int , float , returnAddress oder reference ) sein. |
Hinweis | Die JVM sieht keinen swap2 -Befehl vor, mit dem Elemente der Kategorie 2 (long oder double ) getaucht werden könnten. |
Befehl | Sprungtabelleneintrag über index direkt auswählen und springen |
---|---|
Format | tableswitch <0-3 byte pad> defaultbyte1 defaultbyte2 defaultbyte3 defaultbyte4 lowbyte1 lowbyte2 lowbyte3 lowbyte4 highbyte1 highbyte2 highbyte3 highbyte4 jump offsets... |
Formen |
|
Operand-Stack | ... index int ... |
Befehl | Erweitert den Index von lokalen Variablen mit zusätzlichen Bytes |
---|---|
Format | wide <opcode> indexbyte1 indexbyte2 |
Formen |
|
Operand-Stack | Genau wie der mit wide modifizierte Befehl |
Seminarthemen→ Die Architektur der Java VM→ I.• II.• III.• IV.• V. Befehlssatz • VI.• VII.