4.21. JVM-Befehlssatz: Kurzbeschreibung W
Ermögliche ein zusätzliches Byte für den Indexwert zur Adressierung von
lokalen Variablen im zugehörigen Array.
Für z.B. den Befehl iload
steht ein Indexbyte zur Verfügung und es können damit nur 256 lokale Variablen einer
Methode adressiert werden. Unter Verwendung von wide
stehen zwei
Indexbytes zur Verfügung und ein Zugriff könnte auf 65536 (0xffff) lokale Variablen
erfolgen. Aus den beiden Indexbytes berechnet sich der vorzeichenlose 16-Bit-Index
wie folgt: (indexbyte1 << 8) | indexbyte2.
Steht direkt im Anschluss an den Opcode c4
von wide
der
Opcode 84
für iinc
,
folgen nach den beiden Indexbytes noch zwei Konstantenbytes. Die beiden Konstantenbytes
ermöglichen Konstanten im Bereich von -32768 bis 32767, um die der Inhalt einer
Variablen mit der JVM-Anweisung iinc
verändert werden kann. Die
vorzeichenbehaftete 16-Bit-Konstante berechnet sich dabei wie folgt:
(constbyte1 << 8) | constbyte2.
Beispiel:
Für das Beispiel werden 258 lokale Variablen für eine main
-Methode
definiert: i1
, i2
, a1
bis a255
und b
. Falls z.B. der JVM-Befehl iload
in der erweiterten
Form genutzt wird, wird durch den Klassendatei-Disassembler javap
die
Mnemonik iload_w
angezeigt. Der JVM-Befehl iload_w 256
aus dem Beispiel wird innerhalb der zugehörigen Klassendatei Test.class
durch die Zahlenfolge (hex.) c4 15 01 00
repräsentiert. Der Wert
c4
ist der Opcode von wide
, 15
ist der
Opcode von iload
und die beiden Bytes 01 00
ergeben den
Index 256 im Array der lokalen Variablen. Für die Anweisung i2 += 300;
im Quelltext wird durch den Java-Compiler die Bytefolge c4 84 01 02 01 2c
generiert (iinc_w 258,300
).
Die folgende Übersicht besteht aus drei Spalten. In der linken Spalte steht
der verkürzte Java-Quelltext zur Definiton von 258 lokalen Variablen. Die mittlere
Spalte enthält die Mnemoniks der JVM-Befehle, die durch den Compiler erzeugt werden.
Die hexadezimalen Zahlenwerte, die diese mnemonischen Kürzel codieren, sind in der
rechten Spalte notiert.
public class Test {
public static void public static void
main(String[] args) { main(java.lang.String[]);
Code:
int i1 = 0; 0: iconst_0 03
1: istore_1 3c
i1 += 300; 2: iinc_w 1,300 c4 84 00 01 01 2c
int a1 = 0; 8: iconst_0 03
9: istore_2 3d
int a2 = 0; 10: iconst_0 03
11: istore_3 3e
... ... ...
int a254 = 0; 765: iconst_0 03
766: istore 255 36 ff
int a255 = 0; 768: iconst_0 03
769: istore_w 256 c4 36 01 00
int b = a255; 773: iload_w 256 c4 15 01 00
777: istore_w 257 c4 36 01 01
int i2 = 0; 781: iconst_0 03
782: istore_w 258 c4 36 01 02
i2 += 300; 786: iinc_w 258,300 c4 84 01 02 01 2c
} 792: return b1
}