javaseiten.de   |   Version 0.6
 

4.6. JVM-Befehlssatz: Kurzbeschreibung A

 

 

Befehl Operandenstapel Opcode
aaload ..., arrayref, index --> ..., value 0x32

Lade einen reference-Wert value (Referenz auf ein Objekt) aus einem reference-Array auf den Operandenstapel.

Bezeichner Typ Beschreibung
arrayref reference Referenz auf ein Array.
index int Index im Array.
value reference  

Mit Hilfe von arrayref und index wird ein reference-Wert ermittelt und auf den Stapel gelegt.

Beispiel:

String[] s = {"Hallo", "Java"};       0: iconst_2
                                      1: anewarray #2; //class java/lang/String
                                      4: dup
                                      5: iconst_0
                                      6: ldc #3; //String Hallo
                                      8: aastore
                                      9: dup
                                     10: iconst_1
                                     11: ldc #4; //String Java
                                     13: aastore
                                     14: astore_1
String s0 = s[0];                    15: aload_1
                                     16: iconst_0
                                     17: aaload
                                     18: astore_2

Mit aastore werden zunächst die beiden Zeichenketten "Hallo" und "Java" in das Array geschrieben. Anschließend erfolgt das Auslesen des ersten Elements (Index 0) mit aaload.

 

 

aastore ..., arrayref, index, value --> ... 0x53

Speichere einen reference-Wert value (Referenz auf ein Objekt) in ein reference-Array.

Bezeichner Typ Beschreibung
arrayref reference Referenz auf ein Array.
index int Index im Array.
value reference  

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 reference-Wert value. Siehe auch das Beispiel zu aaload.

 

 

aconst_null ... --> ..., null 0x01

Lege die vordefinierte Konstante null (leere Referenz) auf den Operandenstapel.

Beispiel:

Object obj = null;        0: aconst_null
                          1: astore_1

 

 

aload index ... --> ..., objectref 0x19

Lade eine Objektreferenz aus dem Array der lokalen Variablen auf den Operandenstapel.

Bezeichner Typ Beschreibung
index Vorzeichenloses Byte Index im Array der lokalen Variablen.
objectref reference Referenz auf ein Objekt.

Der Eintrag objectref im Array bei diesem Index muss vom Typ reference sein.

Beispiel:

public class Test {
  public static void main(String[] args) {
    int i = args.length;;                         0: aload_0
                                                  1: arraylength
                                                  2: istore_1
    String s1 = "Ha";                             3: ldc #2; //String Ha
                                                  5: astore_2
    String s2 = "ll";                             6: ldc #3; //String ll
                                                  8: astore_3
    String s3 = "o!";                             9: ldc #4; //String o!
                                                 11: astore 4
    String s4 = s1 + s2 + s3;                    13: new #5; //class 
                                                     java/lang/StringBuilder
                                                 16: dup
                                                 17: invokespecial #6; //Method
                                                     java/lang/StringBuilder.
                                                     "<init>":()V
                                                 20: aload_2
                                                 21: invokevirtual #7; //Method
                                                     java/lang/StringBuilder.
                                                     append:(Ljava/lang/
                                                     String;)Ljava/lang/
                                                     StringBuilder;
                                                 24: aload_3
                                                 25: invokevirtual #7;
                                                 28: aload 4
                                                 30: invokevirtual #7;
                                                 33: invokevirtual #8; //Method
                                                     java/lang/StringBuilder.
                                                     toString:()Ljava/lang/
                                                     String;
                                                 36: astore 5
  }
}

Das Laden der Objektreferenzen aus dem Array der lokalen Variablen übernehmen zunächst die mit einem Byte codierten JVM-Befehle aload_2 und aload_3. Das Laden der Objektreferenz bei Index 4 übernimmt aload. Auch bei mehr als 4 lokalen Variablen würde im Beispiel das Laden mit aload erfolgen und mit dem auf den Opcode folgenden Indexbyte könnten bis zu 256 lokale Variablen adressiert werden. Im Array der lokalen Variablen ist bei Index 0 eine Referenz auf ein String-Array gespeichert, dem einzigen Parameter der main-Methode. Im Beispiel wird mit aload_0 diese Referenz zunächst auf den Operandenstapel geladen.

 

 

aload_0 ... --> ..., objectref 0x2a

Lade eine Objektreferenz aus dem Array der lokalen Variablen auf den Operandenstapel. Dabei steht 0 für einen Index im Array der lokalen Variablen des zugehörigen Methoden-Frames.

Bezeichner Typ Beschreibung
objectref reference Referenz auf ein Objekt.

Der Eintrag im Array bei Index 0 muss vom Typ reference sein. Bei aload_0 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu aload index. Siehe auch das Beispiel zu aload.

 

 

aload_1 ... --> ..., objectref 0x2b

Lade eine Objektreferenz aus dem Array der lokalen Variablen auf den Operandenstapel. Dabei steht 1 für einen Index im Array der lokalen Variablen des zugehörigen Methoden-Frames.

Bezeichner Typ Beschreibung
objectref reference Referenz auf ein Objekt.

Der Eintrag im Array bei Index 1 muss vom Typ reference sein. Bei aload_1 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu aload index. Siehe auch das Beispiel zu aload.

 

 

aload_2 ... --> ..., objectref 0x2c

Lade eine Objektreferenz aus dem Array der lokalen Variablen auf den Operandenstapel. Dabei steht 2 für einen Index im Array der lokalen Variablen des zugehörigen Methoden-Frames.

Bezeichner Typ Beschreibung
objectref reference Referenz auf ein Objekt.

Der Eintrag im Array bei Index 2 muss vom Typ reference sein. Bei aload_2 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu aload index. Siehe auch das Beispiel zu aload.

 

 

aload_3 ... --> ..., objectref 0x2d

Lade eine Objektreferenz aus dem Array der lokalen Variablen auf den Operandenstapel. Dabei steht 3 für einen Index im Array der lokalen Variablen des zugehörigen Methoden-Frames.

Bezeichner Typ Beschreibung
objectref reference Referenz auf ein Objekt.

Der Eintrag im Array bei Index 3 muss vom Typ reference sein. Bei aload_3 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu aload index. Siehe auch das Beispiel zu aload.

 

 

anewarray indexbyte1 indexbyte2 ..., count --> ..., arrayref 0xbd

Erzeuge ein neues Array (für Referenztypen).

Bezeichner Typ Beschreibung
indexbyte1 Vorzeichenoses Byte Index im (Laufzeit-)Konstantenpool.
indexbyte2 Vorzeichenloses Byte Index im (Laufzeit-)Konstantenpool.
count int Anzahl der Array-Elemente.
arrayref reference Referenz auf das neu erzeugte Array.

Mit Hilfe der vorzeichenlosen Bytes indexbyte1 und indexbyte2 wird ein Index im (Laufzeit-)Konstantenpool der aktuellen Klasse berechnet: (indexbyte1 << 8) | indexbyte2. Mit diesem Index kann eine entsprechende Referenz auf eine Klasse, ein Array oder ein Interface erhalten werden. Der ermittelte Typ legt den Typ der Elemente des zu erzeugenden Arrays fest. Für das generierte Array wird Speicherplatz vom Heap bereitgestellt und jedes Element des Arrays wird mit der leeren Referenz null initialisiert. Zur Erzeugung von Arrays für primitive Datentypen siehe newarray.

Beispiel:

Im Beispiel wird ein Integer-Array mit 3 Elementen erzeugt.

Integer[] i = new Integer[3];         0: iconst_3
                                      1: anewarray #2; 
                                         //class java/lang/Integer
                                      4: astore_1
i[0] = new Integer(4);                5: aload_1
                                      6: iconst_0
                                      7: new #2; //class java/lang/Integer
                                     10: dup
                                     11: iconst_4
                                     12: invokespecial #3; //Method 
                                         java/lang/Integer."<init>":(I)V
                                     15: aastore

 

 

areturn ..., objectref --> [leer] 0xb0

Gebe eine Objektreferenz vom Typ reference der aktuellen Methode zurück.

Bezeichner Typ Beschreibung
objectref reference Rückgabewert der aktuellen Methode.

Der Rückgabewert objectref 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 String method1() {              public static String method1();
                                                Code:
    String a = "Hallo!";                        0: ldc #2; //String Hallo!
                                                2: astore_0
    return a;                                   3: aload_0
  }                                             4: areturn

  public static void main(String[] args) {
    String b = method1();
  }
}

 

 

arraylength ..., arrayref --> ..., length 0xbe

Ermittle die Länge eines Arrays (Anzahl der Array-Elemente).

Bezeichner Typ Beschreibung
arrayref reference Referenz auf ein Array.
length int Anzahl der Array-Elemente.

Beispiel:

int[] i = new int[3];        0: iconst_3
                             1: newarray int
                             3: astore_1
int a = i.length;            4: aload_1
                             5: arraylength
                             6: istore_2

 

 

astore index ..., objectref --> ... 0x3a

Speichere eine Objektreferenz bzw. eine Rücksprungadresse in das Array der lokalen Variablen.

Bezeichner Typ Beschreibung
index Vorzeichenloses Byte Index im Array der lokalen Variablen.
objectref reference oder returnAddress Referenz auf ein Objekt bzw. auf eine Rücksprungadresse.

Die Objektreferenz bzw. die Rücksprungadresse wird vom Stapel genommen und in das Array der lokalen Variablen geschrieben. Die Speicherung einer Rücksprungadresse mit astore erfolgt bei der Compilierung einer finally-Klausel, die ein optionaler Bestandteil einer try-catch-Anweisung ist. Siehe dazu auch die Beschreibungen zu jsr und ret.

Beispiele: Siehe aload, jsr.

 

 

astore_0 ..., objectref --> ... 0x4b

Speichere eine Objektreferenz bzw. eine Rücksprungadresse in das Array der lokalen Variablen. Dabei steht 0 für einen Index im Array der lokalen Variablen des zugehörigen Methoden-Frames.

Bezeichner Typ Beschreibung
objectref reference oder returnAddress Referenz auf ein Objekt bzw. auf eine Rücksprungadresse.

Die Objektreferenz bzw. die Rücksprungadresse wird vom Stapel genommen und in das Array der lokalen Variablen geschrieben (bei Index 0). Bei astore_0 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu astore index. Die Speicherung einer Rücksprungadresse mit astore_0 erfolgt bei der Compilierung einer finally-Klausel, die ein optionaler Bestandteil einer try-catch-Anweisung ist. Siehe dazu auch die Beschreibungen zu jsr und ret.

Beispiele: Siehe aload, jsr.

 

 

astore_1 ..., objectref --> ... 0x4c

Speichere eine Objektreferenz bzw. eine Rücksprungadresse in das Array der lokalen Variablen. Dabei steht 1 für einen Index im Array der lokalen Variablen des zugehörigen Methoden-Frames.

Bezeichner Typ Beschreibung
objectref reference oder returnAddress Referenz auf ein Objekt bzw. auf eine Rücksprungadresse.

Die Objektreferenz bzw. die Rücksprungadresse wird vom Stapel genommen und in das Array der lokalen Variablen geschrieben (bei Index 1). Bei astore_1 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu astore index. Die Speicherung einer Rücksprungadresse mit astore_1 erfolgt bei der Compilierung einer finally-Klausel, die ein optionaler Bestandteil einer try-catch-Anweisung ist. Siehe dazu auch die Beschreibungen zu jsr und ret.

Beispiele: Siehe aload, jsr.

 

 

astore_2 ..., objectref --> ... 0x4d

Speichere eine Objektreferenz bzw. eine Rücksprungadresse in das Array der lokalen Variablen. Dabei steht 2 für einen Index im Array der lokalen Variablen des zugehörigen Methoden-Frames.

Bezeichner Typ Beschreibung
objectref reference oder returnAddress Referenz auf ein Objekt bzw. auf eine Rücksprungadresse.

Die Objektreferenz bzw. die Rücksprungadresse wird vom Stapel genommen und in das Array der lokalen Variablen geschrieben (bei Index 2). Bei astore_2 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu astore index. Die Speicherung einer Rücksprungadresse mit astore_2 erfolgt bei der Compilierung einer finally-Klausel, die ein optionaler Bestandteil einer try-catch-Anweisung ist. Siehe dazu auch die Beschreibungen zu jsr und ret.

Beispiele: Siehe aload, jsr.

 

 

astore_3 ..., objectref --> ... 0x4e

Speichere eine Objektreferenz bzw. eine Rücksprungadresse in das Array der lokalen Variablen. Dabei steht 3 für einen Index im Array der lokalen Variablen des zugehörigen Methoden-Frames.

Bezeichner Typ Beschreibung
objectref reference oder returnAddress Referenz auf ein Objekt bzw. auf eine Rücksprungadresse.

Die Objektreferenz bzw. die Rücksprungadresse wird vom Stapel genommen und in das Array der lokalen Variablen geschrieben (bei Index 3). Bei astore_3 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu astore index. Die Speicherung einer Rücksprungadresse mit astore_3 erfolgt bei der Compilierung einer finally-Klausel, die ein optionaler Bestandteil einer try-catch-Anweisung ist. Siehe dazu auch die Beschreibungen zu jsr und ret.

Beispiele: Siehe aload, jsr.

 

 

athrow ..., objectref --> objectref 0xbf

Löse eine Ausnahme (Exception) oder einen Fehler (Error) aus.

Bezeichner Typ Beschreibung
objectref reference Verweist auf ein Objekt der Klasse Throwable bzw. auf eine Unterklasse (Klasse Error, Klasse Exception)

Nachdem eine Ausnahme ausgelöst wurde, wird mit Hilfe von objectref nach einem Programmabschnitt gesucht (Exception Handler), der eine Behandlung dieses Fehlers übernimmt (Stichwort: try-catch-Anweisung). Falls kein entsprechender Handler gefunden wird, erfolgt durch den Compiler eine Fehlermeldung und der laufende Thread wird beendet.

Beispiel:

public class Test {
  public static void                        public static void
  main(String[] args) {                     main(java.lang.String[]);
                                            Code:
    int n = -1;                              0: iconst_m1
                                             1: istore_1
    if (n < 0) {                             2: iload_1
                                             3: ifge 14
      throw new ArithmeticException();       6: new #2; //class java/lang/
    }                                           ArithmeticException
                                             9: dup
                                            10: invokespecial #3; //Method 
                                                java/lang/ArithmeticException.
                                                "<init>":()V
                                            13: athrow
  }                                         14: return
}

Mit Hilfe von new #2 wird zunächst ein neues Objekt der Klasse ArithmeticException erzeugt (die Referenz auf dieses Objekt objectref wird auf den Operandenstapel gelegt), wobei anschließend durch invokespecial #3 der parameterlose Konstruktor der betrachteten Klasse zur Initialisierung dieses Objekts aufgerufen wird. Die Anweisung dup verdoppelt den Wert, der an oberster Stelle des Operandenstapels liegt: ..., objectref --> ..., objectref, objectref. Das ist nötig, da der Aufruf des Konstruktors die oberste Referenz vom Stapel nimmt und für athrow noch einmal der gleiche Objektverweis zur Verfügung stehen muss.

Da der Wert der Variablen n im Beispiel kleiner als null ist und damit nicht in der Menge der natürlichen Zahlen enthalten ist, wird während der Ausführung des Programms eine Fehlermeldung ausgegeben:

Exception in thread "main" java.lang.ArithmeticException
  at Test.main(Test.java:5)
Process java exited with code 1

 

 

 

Diese Seite nutzt Google-Dienste - siehe dazu Datenschutz.

Copyright © 2006, 2007 Harald Roeder