javaseiten.de   |   Version 0.6
 

4.9. JVM-Befehlssatz: Kurzbeschreibung D

 

 

Befehl Operandenstapel Opcode
d2f ..., value --> ..., result 0x90

Wandle einen double-Wert in einen float-Wert um.

Bezeichner Typ Beschreibung
value double Wert, der umgewandelt werden soll.
result float Ergebnis der Umwandlung.

Beispiel:

double a = -3.7d;          0: ldc2_w #2; //double -3.7d
                           3: dstore_1
float b = (float)a;        4: dload_1
                           5: d2f
                           6: fstore_3

Binäre Darstellung:
-3.7d = (110000000000 110110011001100110011 0011001100110011001100110011010)b
-3.7f = (110000000    110110011001100110011 01)b

Die Variable b vom Typ float enthält nach der Umwandlung den Wert -3.7. Bei einem double-Wert besteht die Mantisse der Binärdarstellung aus 52 Bits (Bits 51-0). Der Programmausschnitt befindet sich innerhalb einer main-Methode. Mit Hilfe des Ladebefehls ldc2_w #2 wird die 2. Konstante im Konstantenpool der zum Quelltext zugehörigen Klassendatei auf den Operandenstapel geladen (Laufzeit-Konstantenpool). Der Wert der Double-Konstanten wird innerhalb der Klassendatei durch die Bytefolge c0 0d 99 99 99 99 99 9a repräsentiert (hexadezimale Schreibweise der Binärdarstellung von -3.7d). Siehe dazu auch Binärdarstellung einer Gleitkommazahl (32 Bit).

 

 

d2i ..., value --> ..., result 0x8e

Wandle einen double-Wert in einen int-Wert um.

Bezeichner Typ Beschreibung
value double Wert, der umgewandelt werden soll.
result int Ergebnis der Umwandlung.

Siehe auch Beispiele zu f2i.

Beispiel:

double a = -3.7d;        0: ldc2_w #2; //double -3.7d
                         3: dstore_1
int b = (int)a;          4: dload_1
                         5: d2i
                         6: istore_3

 

 

d2l ..., value --> ..., result 0x8f

Wandle einen double-Wert in einen long-Wert um.

Bezeichner Typ Beschreibung
value double Wert, der umgewandelt werden soll.
result long Ergebnis der Umwandlung.

Siehe auch Beispiele zu f2i.

Beispiel:

double a = -3.7d;        0: ldc2_w #2; //double -3.7d
                         3: dstore_1
long b = (long)a;        4: dload_1
                         5: d2l
                         6: lstore_3

 

 

dadd ..., value1, value2 --> ..., result 0x63

Addiere zwei double-Werte.

Bezeichner Typ Beschreibung
value1 double 1. Operand
value2 double 2. Operand
result double Ergebnis der Operation.

Die beiden obersten Elemente werden vom Stapel genommen und addiert: result = value1' + value2'. Die Werte value1' und value2' werden aus value1 und value2 durch eine Value Set Conversion ermittelt.

Beispiel:

double a = 1.0;          0: dconst_1
                         1: dstore_1
double b = 2.0;          2: ldc2_w #2; //double 2.0d
                         5: dstore_3
double c = a + b;        6: dload_1
                         7: dload_3
                         8: dadd
                         9: dstore 5

 

 

daload ..., arrayref, index --> ..., value 0x31

Lade einen double-Wert value aus einem double-Array auf den Operandenstapel.

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

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

Beispiel:

double[] d = {4.0, 5.0};          0: iconst_2
                                  1: newarray double
                                  3: dup
                                  4: iconst_0
                                  5: ldc2_w #2; //double 4.0d
                                  8: dastore
                                  9: dup
                                 10: iconst_1
                                 11: ldc2_w #4; //double 5.0d
                                 14: dastore
                                 15: astore_1
double d0 = d[0];                16: aload_1
                                 17: iconst_0
                                 18: daload
                                 19: dstore_2

Mit dastore werden zunächst die beiden Zahlenwerte 4.0 und 5.0 in das Array geschrieben. Anschließend erfolgt das Auslesen des ersten Elements (Index 0) mit daload.

 

 

dastore ..., arrayref, index, value --> ... 0x52

Speichere einen double-Wert value in ein double-Array.

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

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

 

 

dcmpg ..., value1, value2 --> ..., result 0x98

Vergleiche zwei double-Werte.

Bezeichner Typ Beschreibung
value1 double 1. Vergleichswert
value2 double 2. Vergleichswert
result int Ergebnis des Vergleichs (ohne Double.NaN).
value1' > value2' : result = 1,
value1' == value2' : result = 0,
value1' < value2' : result = -1.

Die Werte value1' und value2' werden aus value1 und value2 durch eine Value Set Conversion ermittelt. Falls ein Vergleichswert (oder beide) die Konstante Double.NaN ist (Not-a-Number), wird durch dcmpg der Integer-Wert 1 auf den Operandenstapel gelegt. Die Anweisungen dcmpg und dcmpl unterscheiden sich lediglich in der Behandlung von Vergleichen, in denen ein Vergleichswert Double.NaN vorkommt (es wird der Zahlenwert 1 bzw. -1 auf den Stapel gelegt).

Beispiel: Siehe dazu fcmpg.

 

 

dcmpl ..., value1, value2 --> ..., result 0x97

Vergleiche zwei double-Werte.

Bezeichner Typ Beschreibung
value1 double 1. Vergleichswert
value2 double 2. Vergleichswert
result int Ergebnis des Vergleichs (ohne Double.NaN).
value1' > value2' : result = 1,
value1' == value2' : result = 0,
value1' < value2' : result = -1.

Die Werte value1' und value2' werden aus value1 und value2 durch eine Value Set Conversion ermittelt. Falls ein Vergleichswert (oder beide) die Konstante Double.NaN ist (Not-a-Number), wird durch dcmpl der Integer-Wert -1 auf den Operandenstapel gelegt. Die Anweisungen dcmpl und dcmpg unterscheiden sich lediglich in der Behandlung von Vergleichen, in denen ein Vergleichswert Double.NaN vorkommt (es wird der Zahlenwert -1 bzw. 1 auf den Stapel gelegt).

Beispiel: Siehe dazu fcmpl.

 

 

dconst_0 ... --> ..., 0.0 0x0e

Lege die double-Konstante 0.0 auf den Operandenstapel.

Beispiel:

double d = 0.0;        0: dconst_0
                       1: dstore_1

 

 

dconst_1 ... --> ..., 1.0 0x0f

Lege die double-Konstante 1.0 auf den Operandenstapel.

Beispiel: Siehe dazu dconst_0.

 

 

ddiv ..., value1, value2 --> ..., result 0x6f

Dividiere zwei double-Werte.

Bezeichner Typ Beschreibung
value1 double 1. Operand
value2 double 2. Operand
result double Ergebnis der Operation.

Die beiden obersten Elemente werden vom Stapel genommen und die folgende Division wird durchgeführt: result = value1' / value2'. Die Werte value1' und value2' werden aus value1 und value2 durch eine Value Set Conversion ermittelt.

Beispiel:

double a = 1.0;          0: dconst_1
                         1: dstore_1
double b = 2.0;          2: ldc2_w #2; //double 2.0d
                         5: dstore_3
double c = a / b;        6: dload_1
                         7: dload_3
                         8: ddiv
                         9: dstore 5

 

 

dload index ... --> ..., value 0x18

Lade einen double-Wert aus dem Array der lokalen Variablen auf den Operandenstapel.

Bezeichner Typ Beschreibung
index Vozeichenloses Byte Index im Array der lokalen Variablen.
value double  

Der Eintrag value im Array bei diesem Index muss vom Typ double sein.

Beispiel:

public class Test {
  public static void main(String[] args) {
    double d1 = args.length;                       0: aload_0
                                                   1: arraylength
                                                   2: i2d
                                                   3: dstore_1
    double d2 = 0.0;                               4: dconst_0
                                                   5: dstore_3
    double d3 = 1.0;                               6: dconst_1
                                                   7: dstore 5
    double d4 = d1 + d2 + d3;                      9: dload_1
                                                  10: dload_3
                                                  11: dadd
                                                  12: dload 5
                                                  14: dadd
                                                  15: dstore 7
  }
}

Das Laden der Zahlenwerte aus dem Array der lokalen Variablen übernehmen zunächst die mit einem Byte codierten JVM-Befehle dload_1 und dload_3. Das Laden der Gleitkommazahl bei Index 5 übernimmt dload. Für eine lokale Variable vom Typ double werden zwei Einträge im Array der lokalen Variablen reserviert. Es sind daher für einen double-Wert die Inhalte bei index und index+1 zu beachten. Im Array der lokalen Variablen ist bei Index 0 eine Referenz auf ein String-Array gespeichert, dem einzigen Parameter der main-Methode.

 

 

dload_0 ... --> ..., value 0x26

Lade den double-Wert einer 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
value double  

Der Eintrag im Array bei Index 0 muss vom Typ double sein. Für eine lokale Variable vom Typ double werden zwei Einträge im Array der lokalen Variablen reserviert. Für den double-Wert sind daher die Inhalte bei Index 0 und Index 1 zu beachten. Bei dload_0 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu dload index. Siehe auch das Beispiel zu dload.

 

 

dload_1 ... --> ..., value 0x27

Lade den double-Wert einer 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
value double  

Der Eintrag im Array bei Index 1 muss vom Typ double sein. Für eine lokale Variable vom Typ double werden zwei Einträge im Array der lokalen Variablen reserviert. Für den double-Wert sind daher die Inhalte bei Index 1 und Index 2 zu beachten. Bei dload_1 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu dload index. Siehe auch das Beispiel zu dload.

 

 

dload_2 ... --> ..., value 0x28

Lade den double-Wert einer 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
value double  

Der Eintrag im Array bei Index 2 muss vom Typ double sein. Für eine lokale Variable vom Typ double werden zwei Einträge im Array der lokalen Variablen reserviert. Für den double-Wert sind daher die Inhalte bei Index 2 und Index 3 zu beachten. Bei dload_2 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu dload index. Siehe auch das Beispiel zu dload.

 

 

dload_3 ... --> ..., value 0x29

Lade den double-Wert einer 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
value double  

Der Eintrag im Array bei Index 3 muss vom Typ double sein. Für eine lokale Variable vom Typ double werden zwei Einträge im Array der lokalen Variablen reserviert. Für den double-Wert sind daher die Inhalte bei Index 3 und Index 4 zu beachten. Bei dload_3 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu dload index. Siehe auch das Beispiel zu dload.

 

 

dmul ..., value1, value2 --> ..., result 0x6b

Multipliziere zwei double-Werte.

Bezeichner Typ Beschreibung
value1 double 1. Operand
value2 double 2. Operand
result double Ergebnis der Operation.

Die beiden obersten Elemente werden vom Stapel genommen und miteinander multipliziert: result = value1' * value2'. Die Werte value1' und value2' werden aus value1 und value2 durch eine Value Set Conversion ermittelt.

Beispiel:

double a = 1.0;          0: dconst_1
                         1: dstore_1
double b = 2.0;          2: ldc2_w #2; //double 2.0d
                         5: dstore_3
double c = a * b;        6: dload_1
                         7: dload_3
                         8: dmul
                         9: dstore 5

 

 

dneg ..., value --> ..., result 0x77

Negiere einen double-Wert.

Bezeichner Typ Beschreibung
value double  
result double  

Es gilt: result = -value'. Die Berechnung gilt, falls value' nicht Double.NaN ist (Not-a-Number (NaN) besitzt kein Vorzeichen). Der Wert value' wird aus value durch eine Value Set Conversion ermittelt. Die Negation einer positiven double-Null ist nicht gleich der Subtraktion dieser Null von einer weiteren positiven Null.

Beispiel:

double a = 1.0;        0: dconst_1
                       1: dstore_1
double b = -a;         2: dload_1
                       3: dneg
                       4: dstore_3

 

 

drem ..., value1, value2 --> ..., result 0x73

Berechne den double-Restwert value1 % value2.

Bezeichner Typ Beschreibung
value1 double 1. Operand
value2 double 2. Operand
result double Ergebnis der Operation.

Die beiden obersten Elemente werden vom Stapel genommen und die folgende Berechnung wird durchgeführt: result = value1' - (value2' * q). Die Berechnung gilt, falls value1' und value2' nicht Double.NaN, Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY oder 0 sind. Wenn die angegebene Berechnung nicht erfolgen kann, werden entsprechende Festlegungen getroffen (siehe auch die Beispiele zu frem). Die Werte value1' und value2' werden aus value1 und value2 durch eine Value Set Conversion ermittelt. q ist ein int-Zahlenwert.

Beispiel: 10.7 % 4.1 = 2.5

double a = 10.7;          0: ldc2_w #2; //double 10.7d
                          3: dstore_1
double b = 4.1;           4: ldc2_w #4; //double 4.1d
                          7: dstore_3
double c = a % b;         8: dload_1
                          9: dload_3
                         10: drem
                         11: dstore 5

Der Inhalt der Variablen c ist 2.5.

 

 

dreturn ..., value --> [leer] 0xaf

Gebe einen double-Wert der aktuellen Methode zurück.

Bezeichner Typ Beschreibung
value double Rückgabewert der aktuellen Methode.

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 double method1() {              public static double method1();
                                                Code:
    double a = 3.0;                             0: ldc2_w #2; //double 3.0d
                                                3: dstore_0
    return a;                                   4: dload_0
  }                                             5: dreturn

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

 

 

dstore index ..., value --> ... 0x39

Speichere einen double-Wert in das Array der lokalen Variablen.

Bezeichner Typ Beschreibung
index Vorzeichenloses Byte Index im Array der lokalen Variablen.
value double  

Die double-Zahl value wird vom Stapel genommen und in das Array der lokalen Variablen geschrieben. Ein Zahlenwert vom Typ double benötigt zwei Einträge im entsprechenden Array (bei index und index+1). Bevor die Gleitkommazahl in das Array geschrieben wird, erfolgt möglicherweise eine Value Set Conversion.

Beispiel: Siehe dload.

 

 

dstore_0 ..., value --> ... 0x47

Speichere einen double-Wert 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
value double  

Die double-Zahl value wird vom Stapel genommen und in das Array der lokalen Variablen geschrieben (bei Index 0). Ein Zahlenwert vom Typ double benötigt zwei Einträge im entsprechenden Array (bei Index 0 und 1). Bevor die Gleitkommazahl in das Array geschrieben wird, erfolgt möglicherweise eine Value Set Conversion. Bei dstore_0 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu dstore index.

Beispiel: Siehe dload.

 

 

dstore_1 ..., value --> ... 0x48

Speichere einen double-Wert 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
value double  

Die double-Zahl value wird vom Stapel genommen und in das Array der lokalen Variablen geschrieben (bei Index 1). Ein Zahlenwert vom Typ double benötigt zwei Einträge im entsprechenden Array (bei Index 1 und 2). Bevor die Gleitkommazahl in das Array geschrieben wird, erfolgt möglicherweise eine Value Set Conversion. Bei dstore_1 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu dstore index.

Beispiel: Siehe dload.

 

 

dstore_2 ..., value --> ... 0x49

Speichere einen double-Wert 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
value double  

Die double-Zahl value wird vom Stapel genommen und in das Array der lokalen Variablen geschrieben (bei Index 2). Ein Zahlenwert vom Typ double benötigt zwei Einträge im entsprechenden Array (bei Index 2 und 3). Bevor die Gleitkommazahl in das Array geschrieben wird, erfolgt möglicherweise eine Value Set Conversion. Bei dstore_2 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu dstore index.

Beispiel: Siehe dload.

 

 

dstore_3 ..., value --> ... 0x4a

Speichere einen double-Wert 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
value double  

Die double-Zahl value wird vom Stapel genommen und in das Array der lokalen Variablen geschrieben (bei Index 3). Ein Zahlenwert vom Typ double benötigt zwei Einträge im entsprechenden Array (bei Index 3 und 4). Bevor die Gleitkommazahl in das Array geschrieben wird, erfolgt möglicherweise eine Value Set Conversion. Bei dstore_3 ist der Index im entsprechenden Array implizit und es wird lediglich ein Byte für diesen Befehl benötigt, im Gegensatz zu dstore index.

Beispiel: Siehe dload.

 

 

dsub ..., value1, value2 --> ..., result 0x67

Subtrahiere zwei double-Werte.

Bezeichner Typ Beschreibung
value1 double 1. Operand
value2 double 2. Operand
result double Ergebnis der Operation.

Die beiden obersten Elemente werden vom Stapel genommen und subtrahiert: result = value1' - value2'. Die Werte value1' und value2' werden aus value1 und value2 durch eine Value Set Conversion ermittelt.

Beispiel:

double a = 2.0;          0: ldc2_w #2; //double 2.0d
                         3: dstore_1
double b = 1.0;          4: dconst_1
                         5: dstore_3
double c = a - b;        6: dload_1
                         7: dload_3
                         8: dsub
                         9: dstore 5

 

 

dup ..., value --> ..., value, value 0x59

Verdoppele das oberste Element value des Operandenstapels.

Bezeichner Typ Beschreibung
value int, float, reference oder returnAddress.  

Der Typ von value ist aus Typkategorie 1 (interner Typ, siehe auch Tabelle 4.7).

Beispiel:

public class Test {
  long l = 0;
  public long test() {        public long test(); 
                              Code:
    return l++;                0: aload_0
                               1: dup
                               2: getfield #2; //Field l:J
                               5: dup2_x1
                               6: lconst_1
                               7: ladd
                               8: putfield #2; //Field l:J
  }                           11: lreturn
}

Zunächst wird mit Hilfe von aload_0 eine Referenz auf ein Objekt der Beispielklasse Test auf den Operandenstapel geladen. Die genannte Referenz wird einer nicht-statischen Methode automatisch übergeben; sie ist im Array der lokalen Variablen des Methoden-Frames bei Index 0 gespeichert. Anschließend wird diese Objektreferenz durch dup verdoppelt und es befinden sich zwei gleiche Elemente an oberster Stelle des Operandenstapels. Mit getfield wird der Inhalt der Klassenvariablen l (Feld) auf den Stapel geladen. Dabei wird eine der beiden Objektreferenzen "verbraucht", d.h. sie wird vom Stapel entfernt und der Inhalt der Variablen l wird auf den Stapel geladen. Der Operandenstapel könnte zu diesem Zeitpunkt wie folgt aussehen:

|   value   |
| objectref |
-------------

Durch die Anweisung dup2_x1 ändert sich der Inhalt des Stapels zu (der Typ von value ist aus Typkategorie 2 und der Typ von objectref ist aus Typkategorie 1):

|   value   |
| objectref |
|   value   |
-------------

Der Befehl lconst_1 legt die Konstante 1 auf den Stapel, die anschließend zum Inhalt von l addiert wird. Mit Hilfe von putfield wird l mit dem neuen Inhalt gesetzt. Auf dem Operandenstapel befindet sich nun nur noch ein Element, das mit der Rückgabeanweisung an den Aufrufer der Methode zurückgegeben wird.

 

 

dup_x1 ..., value2, value1 --> ..., value1, value2, value1 0x5a

Erzeuge ein Duplikat des obersten Elements value1 des Operandenstapels und füge dieses neu erzeugte Element vor dem zweitletzten Element des Stapels ein.

Bezeichner Typ Beschreibung
value1 int, float, reference oder returnAddress.  
value2 int, float, reference oder returnAddress.  

Der Typ von value1 und value2 ist aus Typkategorie 1 (interner Typ, siehe auch Tabelle 4.7).

Beispiel: Siehe dazu dup.

 

 

dup_x2 Siehe Beschreibung. 0x5b

Erzeuge ein Duplikat des obersten Elements value1 des Operandenstapels und füge dieses neu erzeugte Element entweder vor dem zweitletzten Element oder vor dem drittletzten Element des Stapels ein, abhängig vom Typ (Typkategorie) der Elemente an der Spitze des Operandenstapels (siehe dazu auch Tabelle 4.7).

 

1. Möglichkeit: Die Typen der drei obersten Elemente des Operandenstapels sind aus Typkategorie 1 (interner Typ).

Operandenstapel: ..., value3, value2, value1 --> ..., value1, value3, value2, value1

Bezeichner Typ Beschreibung
value1 int, float, reference oder returnAddress.  
value2 int, float, reference oder returnAddress.  
value3 int, float, reference oder returnAddress.  

Das generierte Duplikat von value1 wird vor dem drittletzten Element des Operandenstapels eingefügt.

 

2. Möglichkeit: Der Typ des obersten (letzten) Elements des Operandenstapels ist aus Typkategorie 1 (interner Typ) und das vorletzte Element ist aus Typkategorie 2.

Operandenstapel: ..., value2, value1 --> ..., value1, value2, value1

Bezeichner Typ Beschreibung
value1 int, float, reference oder returnAddress.  
value2 long oder double.  

Das generierte Duplikat von value1 wird vor dem zweitletzten Element des Operandenstapels eingefügt.

 

Beispiel: Siehe dazu dup.

 

 

dup2 Siehe Beschreibung. 0x5c

Verdoppele entweder die beiden obersten Elemente oder nur das oberste Element des Operandenstapels, abhängig vom Typ (Typkategorie) der Elemente an der Spitze des Stapels (siehe dazu auch Tabelle 4.7).

 

1. Möglichkeit: Die Typen der zwei obersten Elemente des Operandenstapels sind aus Typkategorie 1 (interner Typ).

Operandenstapel: ..., value2, value1 --> ..., value2, value1, value2, value1

Bezeichner Typ Beschreibung
value1 int, float, reference oder returnAddress.  
value2 int, float, reference oder returnAddress.  

Die generierten Duplikate von value1 und value2 werden, entsprechend der Operandenstapel-Beschreibung, dem Stapel hinzugefügt.

 

2. Möglichkeit: Der Typ des obersten Elements des Operandenstapels ist aus Typkategorie 2.

Operandenstapel: ..., value --> ..., value, value

Bezeichner Typ Beschreibung
value long oder double.  

Das generierte Duplikat von value wird zusätzlich auf den Operandenstapel gelegt.

 

Beispiel: Siehe dazu dup.

 

 

dup2_x1 Siehe Beschreibung. 0x5d

Verdoppele entweder die beiden obersten Elemente oder nur das oberste Element des Operandenstapels und füge diese neu erzeugten Elemente bzw. das neu erzeugte Element entweder vor dem drittletzten Element oder vor dem zweitletzten Element des Stapels ein, abhängig vom Typ (Typkategorie) der Elemente an der Spitze des Operandenstapels (siehe dazu auch Tabelle 4.7).

 

1. Möglichkeit: Die Typen der drei obersten Elemente des Operandenstapels sind aus Typkategorie 1 (interner Typ).

Operandenstapel: ..., value3, value2, value1 --> ..., value2, value1, value3, value2, value1

Bezeichner Typ Beschreibung
value1 int, float, reference oder returnAddress.  
value2 int, float, reference oder returnAddress.  
value3 int, float, reference oder returnAddress.  

Die generierten Duplikate von value1 und value2 werden, entsprechend der Operandenstapel-Beschreibung, vor dem drittletzten Element des Stapels eingefügt.

 

2. Möglichkeit: Der Typ des obersten (letzten) Elements des Operandenstapels ist aus Typkategorie 2 und das vorletzte Element ist aus Typkategorie 1 (interner Typ).

Operandenstapel: ..., value2, value1 --> ..., value1, value2, value1

Bezeichner Typ Beschreibung
value1 long oder double.  
value2 int, float, reference oder returnAddress.  

Das generierte Duplikat von value1 wird vor dem zweitletzten Element des Operandenstapels eingefügt.

 

Beispiel: Siehe dup.

 

 

dup2_x2 Siehe Beschreibung. 0x5e

Verdoppele entweder die beiden obersten Elemente oder nur das oberste Element des Operandenstapels und füge diese neu erzeugten Elemente bzw. das neu erzeugte Element entweder vor dem viertletzten Element, vor dem drittletzten Element oder vor dem zweitletzten Element des Stapels ein, abhängig vom Typ (Typkategorie) der Elemente an der Spitze des Operandenstapels (siehe dazu auch Tabelle 4.7).

 

1. Möglichkeit: Die Typen der vier obersten Elemente des Operandenstapels sind aus Typkategorie 1 (interner Typ).

Operandenstapel: ..., value4, value3, value2, value1 --> ..., value2, value1, value4, value3, value2, value1

Bezeichner Typ Beschreibung
value1 int, float, reference oder returnAddress.  
value2 int, float, reference oder returnAddress.  
value3 int, float, reference oder returnAddress.  
value4 int, float, reference oder returnAddress.  

Die generierten Duplikate von value1 und value2 werden, entsprechend der Operandenstapel-Beschreibung, vor dem viertletzten Element des Stapels eingefügt.

 

2. Möglichkeit: Der Typ des obersten (letzten) Elements des Operandenstapels ist aus Typkategorie 2, das zweitletzte Element und das drittletzte Element sind aus Typkategorie 1 (interner Typ).

Operandenstapel: ..., value3, value2, value1 --> ..., value1, value3, value2, value1

Bezeichner Typ Beschreibung
value1 long oder double.  
value2 int, float, reference oder returnAddress.  
value3 int, float, reference oder returnAddress.  

Das generierte Duplikat von value1 wird vor dem drittletzten Element des Operandenstapels eingefügt.

 

3. Möglichkeit: Die Typen der beiden obersten (letzten) Elemente des Operandenstapels sind aus Typkategorie 1 (interner Typ) und das drittletzte Element ist aus Typkategorie 2.

Operandenstapel: ..., value3, value2, value1 --> ..., value2 value1, value3, value2, value1

Bezeichner Typ Beschreibung
value1 int, float, reference oder returnAddress.  
value2 int, float, reference oder returnAddress.  
value3 long oder double.  

Die generierten Duplikate von value1 und value2 werden, entsprechend der Operandenstapel-Beschreibung, vor dem drittletzten Element des Stapels eingefügt.

 

4. Möglichkeit: Die Typen der beiden obersten Elemente des Operandenstapels sind aus Typkategorie 2.

Operandenstapel: ..., value2, value1 --> ..., value1, value2, value1

Bezeichner Typ Beschreibung
value1 long oder double.  
value2 long oder double.  

Das generierte Duplikat von value1 wird vor dem zweitletzten Element des Operandenstapels eingefügt.

 

Beispiel: Siehe dazu dup.

 

 

 

Diese Seite nutzt Google-Dienste - siehe dazu Datenschutz.

Copyright © 2006, 2007 Harald Roeder