javaseiten.de   |   Version 0.6
 

4.21. JVM-Befehlssatz: Kurzbeschreibung W

 

 

Befehl Operandenstapel Opcode
wide aload indexbyte1 indexbyte2 Siehe die Operandenstapelbeschreibungen der jeweiligen nicht erweiterten JVM-Befehle. 0xc4
wide astore indexbyte1 indexbyte2
wide dload indexbyte1 indexbyte2
wide dstore indexbyte1 indexbyte2
wide fload indexbyte1 indexbyte2
wide fstore indexbyte1 indexbyte2
wide iload indexbyte1 indexbyte2
wide istore indexbyte1 indexbyte2
wide lload indexbyte1 indexbyte2
wide lstore indexbyte1 indexbyte2
wide ret indexbyte1 indexbyte2
wide iinc indexbyte1 indexbyte2 constbyte1 constbyte2

Ermögliche ein zusätzliches Byte für den Indexwert zur Adressierung von lokalen Variablen im zugehörigen Array.

Bezeichner Typ Beschreibung
indexbyte1 Vorzeichenloses Byte Index im Array der lokalen Variablen.
indexbyte2 Vorzeichenloses Byte Index im Array der lokalen Variablen.
constbyte1 Vorzeichenloses Byte Zahlenwert für iinc.
constbyte2 Vorzeichenloses Byte Zahlenwert für iinc.

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
}

 

 

 

Diese Seite nutzt Google-Dienste - siehe dazu Datenschutz.

Copyright © 2006, 2007 Harald Roeder