Wandle einen
Beispiel: long a = 6442450944L; 0: ldc2_w #2; //long 6442450944L 3: lstore_1 double b = a; 4: lload_1 5: l2d 6: dstore_3 Binäre Darstellung: 6442450944L = (00000000 00000000 00000000 00000001 10000000 00000000 00000000 00000000)b 6.442450944E9d = (01000001 11111000 00000000 00000000 00000000 00000000 00000000 00000000)b Die Variable
Wandle einen
Beispiel: long a = 6442450944L; 0: ldc2_w #2; //long 6442450944L 3: lstore_1 float b = a; 4: lload_1 5: l2f 6: fstore_3 Binäre Darstellung: 6442450944L = (00000000 00000000 00000000 00000001 10000000 00000000 00000000 00000000)b 6.4424509E9f = (01001111 11000000 00000000 00000000)b Die Variable
Wandle einen
Für einen Beispiel: long a = 6442450944L; 0: ldc2_w #2; //long 6442450944L 3: lstore_1 int b = (int)a; 4: lload_1 5: l2i 6: istore_3 Binäre Darstellung: 6442450944L = (00000000 00000000 00000000 00000001 10000000 00000000 00000000 00000000)b -2147483648i = (10000000 00000000 00000000 00000000)b Die Variable
Addiere zwei
Die beiden obersten Elemente werden vom Stapel genommen und addiert: result = value1 + value2. Beispiel: long a = 3; 0: ldc2_w #2; //long 3l
3: lstore_1
long b = 4; 4: ldc2_w #4; //long 4l
7: lstore_3
long c = a + b; 8: lload_1
9: lload_3
10: ladd
11: lstore 5
Lade einen
Mit Hilfe von arrayref und index
wird ein Beispiel: long[] l = {4, 5}; 0: iconst_2
1: newarray long
3: dup
4: iconst_0
5: ldc2_w #2; //long 4l
8: lastore
9: dup
10: iconst_1
11: ldc2_w #4; //long 5l
14: lastore
15: astore_1
long l0 = l[0]; 16: aload_1
17: iconst_0
18: laload
19: lstore_2 Mit
Verknüpfe zwei
Es gilt: result = value1 & value2 Beispiel: 32762 & 31 = 26 long a = 32762; 0: ldc2_w #2; //long 32762l 3: lstore_1 long b = 31; 4: ldc2_w #4; //long 31l 7: lstore_3 long c = a & b; 8: lload_1 9: lload_3 10: land 11: lstore 5 Binäre Darstellung: 32762 = (00000000 00000000 00000000 00000000 00000000 00000000 01111111 11111010)b 31 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00011111)b 26 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00011010)b
Speichere einen
Auf dem Operandenstapel befinden sich, vor der Ausführung des Befehls, die
Referenz auf das Array, der Index des Elements im Array und der zu speichernde
Vergleiche zwei
Beispiel: long a = 4L; 0: ldc2_w #2; //long 4L
3: lstore_1
long b = 3L; 4: ldc2_w #4; //long 3L
7: lstore_3
boolean c = a > b; 8: lload_1
9: lload_3
10: lcmp
11: ifle 18
14: iconst_1
15: goto 19
18: iconst_0
19: istore 5 Nachdem die Vergleichsanweisung
Lege die Beispiel: long l = 0; 0: lconst_0
1: lstore_1
Lege die Beispiel: Siehe dazu
Lege einen Wert vom Typ
Die (Laufzeit-)Konstante bei index kann vom Typ Integer,
Float oder String sein. Eine Konstante vom Typ String verweist wiederum auf eine
Konstante im Pool vom Typ Utf8, die letztendlich den Inhalt der Zeichenkette zur
Verfügung stellt. Der Wert value, der auf den Stapel
gelegt wird, besitzt den Typ Beispiel: int i = 32768; 0: ldc #2; //int 32768 2: istore_1 float f = 3.0f; 3: ldc #3; //float 3.0f 5: fstore_2 String s = "Hallo!"; 6: ldc #4; //String Hallo! 8: astore_3
Lege einen Wert vom Typ
Aus den beiden vorzeichenlosen Bytes indexbyte1 und
indexbyte2 kann ein Index im (Laufzeit-)Konstantenpool der
aktuellen Klasse berechnet werden: (indexbyte1 << 8) |
indexbyte2. Die Konstante bei diesem Index ist vom Typ Integer,
Float oder String. Der Befehl
Lege einen Wert vom Typ
Aus den beiden vorzeichenlosen Bytes indexbyte1 und indexbyte2 kann ein Index im (Laufzeit-)Konstantenpool der aktuellen Klasse berechnet werden: (indexbyte1 << 8) | indexbyte2. Die Konstante bei diesem Index ist vom Typ Long oder Double. Beispiel: long l = 2; 0: ldc2_w #2; //long 2l 3: lstore_1 double d = 2.0; 4: ldc2_w #4; //double 2.0d 7: dstore_3
Dividiere zwei
Die beiden obersten Elemente werden vom Stapel genommen und die folgende Division wird durchgeführt: result = value1 / value2. Da das Ergebnis wiederum eine Ganzzahl sein muss, werden mögliche Nachkommastellen nicht beachtet. Beispiel: long a = 9; 0: ldc2_w #2; //long 9l
3: lstore_1
long b = 4; 4: ldc2_w #4; //long 4l
7: lstore_3
long c = a / b; 8: lload_1
9: lload_3
10: ldiv
11: lstore 5 Der Inhalt der Variablen
Lade einen
Der Eintrag value im Array bei diesem Index muss vom
Typ Beispiel: public class Test {
public static void main(String[] args) {
long l1 = args.length; 0: aload_0
1: arraylength
2: i2l
3: lstore_1
long l2 = 0; 4: lconst_0
5: lstore_3
long l3 = 1; 6: lconst_1
7: lstore 5
long l4 = l1 + l2 + l3; 9: lload_1
10: lload_3
11: ladd
12: lload 5
14: ladd
15: lstore 7
}
} Das Laden der Zahlenwerte aus dem Array der lokalen Variablen übernehmen
zunächst die mit einem Byte codierten JVM-Befehle
Lade den
Der Eintrag im Array bei Index 0 muss vom Typ
Lade den
Der Eintrag im Array bei Index 1 muss vom Typ
Lade den
Der Eintrag im Array bei Index 2 muss vom Typ
Lade den
Der Eintrag im Array bei Index 3 muss vom Typ
Multipliziere zwei
Die beiden obersten Elemente werden vom Stapel genommen und miteinander multipliziert: result = value1 * value2. Beispiel: long a = 3; 0: ldc2_w #2; //long 3l
3: lstore_1
long b = 4; 4: ldc2_w #4; //long 4l
7: lstore_3
long c = a * b; 8: lload_1
9: lload_3
10: lmul
11: lstore 5
Negiere einen
Es gilt: result = -value. Die
Negation eines Beispiel: long a = 3; 0: ldc2_w #2; //long 3l
3: lstore_1
long b = -a; 4: lload_1
5: lneg
6: lstore_3
Der JVM-Befehl Im Anschluss an die Mnemonik
Eine switch (key) { case konstante: anweisung; ... default: ... } Eine Übersetzung einer Die auf den Opcode von default = (default1 << 24) | (default2 << 16) | (default3 << 8) | default4 npairs = (npairs1 << 24) | (npairs2 << 16) | (npairs3 << 8) | npairs4 m1op = (mop11 << 24) | (mop12 << 16) | (mop13 << 8) | mop14 mo1p = (mop15 << 24) | (mop16 << 16) | (mop17 << 8) | mop18 m2op = (mop21 << 24) | (mop22 << 16) | (mop23 << 8) | mop24 mo2p = (mop25 << 24) | (mop26 << 16) | (mop27 << 8) | mop28 ... Im unmittelbaren Anschluss an den Opcode Eine public class Test { public static void main(String[] args) { int a = 2; int b = 0; switch (a) { case -50: b++; break; case 230: b += 2; break; case 2: b += 3; break; default: b += 5; } b--; } } Das kurze Beispielprogramm kann mittels ab 00 00 00 00 00 35 00 00 00 03 ff ff ff ce 00 00 00 23 00 00 00 02 00 00 00 2f 00 00 00 e6 00 00 00 29 Auf den Opcode
Die folgende Übersicht listet die zum betrachteten Programmausschnitt
korrespondierenden JVM-Befehle auf, wie sie mit Hilfe des Klassendatei-Disassemblers
int a = 2; 0: iconst_2 1: istore_1 int b = 0; 2: iconst_0 3: istore_2 switch (a) { 4: iload_1 5: lookupswitch { //3 -50: 40; 2: 52; 230: 46; default: 58 } case -50: b++; 40: iinc 2,1 break; 43: goto 61 case 230: b += 2; 46: iinc 2,2 break; 49: goto 61 case 2: b += 3; 52: iinc 2,3 break; 55: goto 61 default: b += 5; 58: iinc 2,5 } b--; 61: iinc 2,-1 Operationscode des Befehls lookupswitch und dessen Operandenbytes (5 - 39): 5: ab Opcode lookupswitch 6: 00 00 2 Padding-Bytes 8: 00 00 00 35 default = 53, (5 + 53 = 58) 12: 00 00 00 03 npairs = 3, (3 Match-Offset-Paare) 16: ff ff ff ce m1op = -50, (1. case-Konstante bzw. 1. Match) 20: 00 00 00 23 mo1p = 35, (1. Offset, 5 + 35 = 40) 24: 00 00 00 02 m2op = 2, (2. case-Konstante, 2. Match) 28: 00 00 00 2f mo2p = 47, (2. Offset, 5 + 47 = 52) 32: 00 00 00 e6 m3op = 230, (3. case-Konstante, 3. Match) 36: 00 00 00 29 mo3p = 41, (3. Offset, 5 + 41 = 46)
Verknüpfe zwei
Es gilt: result = value1 | value2 Beispiel: 70 | 42 = 110 long a = 70; 0: ldc2_w #2; //long 70l 3: lstore_1 long b = 42; 4: ldc2_w #4; //long 42l 7: lstore_3 long c = a | b; 8: lload_1 9: lload_3 10: lor 11: lstore 5 Binäre Darstellung: 70 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 01000110)b 42 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00101010)b 110 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 01101110)b
Berechne den
Die beiden obersten Elemente werden vom Stapel genommen und die folgende
Berechnung wird durchgeführt: result = value1 -
(value1 / value2) * value2.
Zur Berechnung von value1 / value2 siehe
auch Beispiel: 11 % 4 = 3 long a = 11; 0: ldc2_w #2; //long 11l
3: lstore_1
long b = 4; 4: ldc2_w #4; //long 4l
7: lstore_3
long c = a % b; 8: lload_1
9: lload_3
10: lrem
11: lstore 5
Der Inhalt der Variablen
Gebe einen
Der Rückgabewert value wird vom Stapel genommen und an den Aufrufer der Methode zurückgegeben, indem dieser auf den Operandenstapel des Methodenaufrufers gelegt wird. Beispiel: public class Test {
public static long method1() { public static long method1();
Code:
long a = 3; 0: ldc2_w #2; //long 3l
3: lstore_0
return a; 4: lload_0
} 5: lreturn
public static void main(String[] args) {
long b = method1();
}
}
Verschiebe die Bits eines
Beispiel: 15 << 4 = 240 long a = 15; 0: ldc2_w #2; //long 15l 3: lstore_1 long b = 4; 4: ldc2_w #4; //long 4l 7: lstore_3 long c = a << b; 8: lload_1 9: lload_3 10: l2i 11: lshl 12: lstore 5 Binäre Darstellung: 15 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001111)b 4 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000100)b 240 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 11110000)b
Verschiebe die Bits eines
Siehe auch Beispiel: -4 >> 1 = -2 long a = -4; 0: ldc2_w #2; //long -4l 3: lstore_1 long b = 1; 4: lconst_1 5: lstore_3 long c = a >> b; 6: lload_1 7: lload_3 9: lshr 10: lstore 5 Binäre Darstellung: -4 = (11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111100)b 1 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001)b -2 = (11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110)b
Speichere einen
Die
Speichere einen
Die
Speichere einen
Die
Speichere einen
Die
Speichere einen
Die
Subtrahiere zwei
Die beiden obersten Elemente werden vom Stapel genommen und subtrahiert: result = value1 - value2. Beispiel: long a = 2; 0: ldc2_w #2; //long 2l
3: lstore_1
long b = 1; 4: lconst_1
5: lstore_3
long c = a - b; 6: lload_1
7: lload_3
8: lsub
9: lstore 5
Verschiebe die Bits eines
Siehe auch Beispiel: -4 >>> 1 = 9223372036854775806 long a = -4; 0: ldc2_w #2; //long -4l 3: lstore_1 long b = 1; 4: lconst_1 5: lstore_3 long c = a >>> b; 6: lload_1 7: lload_3 8: l2i 9: lushr 10: lstore 5 Binäre Darstellung: -4 = (11111111 11111111 11111111 11111111 11111111 11111111 11111111 11111100)b 1 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001)b 9223372036854775806 = (01111111 11111111 11111111 11111111 11111111 11111111 11111111 11111110)b
Verknüpfe zwei
Es gilt: result = value1 ^ value2 Beispiel: 70 ^ 42 = 108 long a = 70; 0: ldc2_w #2; //long 70l 3: lstore_1 long b = 42; 4: ldc2_w #4; //long 42l 7: lstore_3 long c = a ^ b; 8: lload_1 9: lload_3 10: lxor 11: lstore 5 Binäre Darstellung: 70 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 01000110)b 42 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 00101010)b 108 = (00000000 00000000 00000000 00000000 00000000 00000000 00000000 01101100)b |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||