JVMバイトコード命令のリスト

これは、 Java仮想マシンによって実行される抽象マシン言語であるJVMバイトコードを構成する命令のリストです。[ 1 ] JVMバイトコードは、 Javaプラットフォーム上で実行される言語、特にJava用に作成されたコンパイラによって生成されます。

JVMバイトコードはメソッドの命令内容を構成します。実行されると、各メソッドにはスタック、ローカル変数レジスタ、その他のデータを含む独自のフレームが割り当てられます。ほとんどの命令は1つ以上のスタック値を操作し、その出力をスタックに格納します。

参照される「値」はすべて、Java 命令セットに従って 32 ビット int を参照することに注意してください。

ニモニック オペコード(16進オペコード(バイナリ) その他のバイト[数]: [オペランドラベル] スタック[前]→[後] 説明
たくさんの 32 0011 0010 配列参照、インデックス → 値 配列からの参照をスタックにロードする
アースストア 53 0101 0011 配列参照、インデックス、値 → 参照を配列に格納する
aconst_null 01 0000 0001 → ヌル スタックに ヌル参照をプッシュする
負荷 19 0001 1001 1: インデックス → オブジェクト参照 ローカル変数#indexからスタックに参照をロードします。
aload_0 2a 0010 1010 → オブジェクト参照 ローカル変数0からスタックに参照をロードする
aload_1 2b 0010 1011 → オブジェクト参照 ローカル変数1からスタックに参照をロードする
aload_2 2c 0010 1100 → オブジェクト参照 ローカル変数2からスタックに参照をロードする
aload_3 2日 0010 1101 → オブジェクト参照 ローカル変数3からスタックに参照をロードする
アネワレイ bd 1011 1101 2: インデックスバイト1、インデックスバイト2 カウント → 配列参照 定数プール内の クラス参照インデックスindexbyte1 << 8 | indexbyte2 )で識別される長さcountとコンポーネントタイプの参照の新しい配列を作成します。
復帰 b0 1011 0000 オブジェクト参照 → [空] メソッドから参照を返す
配列の長さ なれ 1011 1110 配列参照 → 長さ 配列の長さを取得する
ストア 3a 0011 1010 1: インデックス オブジェクト参照 → ローカル変数#indexに参照を格納する
astore_0 4b 0100 1011 オブジェクト参照 → ローカル変数0に参照を格納する
astore_1 4c 0100 1100 オブジェクト参照 → ローカル変数1に参照を格納する
astore_2 4日 0100 1101 オブジェクト参照 → ローカル変数2に参照を格納する
astore_3 4e 0100 1110 オブジェクト参照 → ローカル変数3に参照を格納する
投げる 彼氏 1011 1111 オブジェクト参照 → [空], オブジェクト参照 エラーまたは例外をスローします(スタックの残りはクリアされ、Throwableへの参照のみが残ることに注意してください)
バロード 33 0011 0011 配列参照、インデックス → 値 配列からバイト値またはブール値を読み込む
バストア 54 0101 0100 配列参照、インデックス、値 → バイト値またはブール値を配列に格納する
ビプッシュ 10 0001 0000 1: バイト → 価値 1バイトを整数としてスタックにプッシュする
ブレークポイント 1100 1010 Javaデバッガのブレークポイント用に予約されています。クラスファイルには出現しないでください。
負荷 34 0011 0100 配列参照、インデックス → 値 配列から文字を読み込む
カストール 55 0101 0101 配列参照、インデックス、値 → 文字を配列に格納する
チェックキャスト c0 1100 0000 2: インデックスバイト1、インデックスバイト2 オブジェクト参照 → オブジェクト参照 オブジェクト参照が特定の型であるかどうかをチェックします。そのクラス参照は、定数プールのインデックスにあります( indexbyte1 << 8 | indexbyte2 )
d2f 90 1001 0000 値 → 結果 doubleをfloatに変換する
d2i 8e 1000 1110 値 → 結果 doubleをintに変換する
d2l 8階 1000 1111 値 → 結果 doubleをlongに変換する
お父さん 63 0110 0011 値1、値2 → 結果 2つの倍数を追加する
ダロード 31 0011 0001 配列参照、インデックス → 値 配列からdoubleを読み込む
ダストア 52 0101 0010 配列参照、インデックス、値 → 配列に倍精度値を格納する
dcmpg 98 1001 1000 値1、値2 → 結果 2つのdoubleを比較する。NaNの場合は1
dcmpl 97 1001 0111 値1、値2 → 結果 2つのdoubleを比較し、NaNの場合は-1
dconst_0 0e 0000 1110 → 0.0 定数0.0double)をスタックに プッシュする
dconst_1 0f 0000 1111 → 1.0 定数1.0double)をスタックに プッシュする
ddiv 6階 0110 1111 値1、値2 → 結果 2つの倍数を割る
ダウンロード 18 0001 1000 1: インデックス → 価値 ローカル変数#indexからdouble値をロードする
dload_0 26 0010 0110 → 価値 ローカル変数0からdoubleをロードする
dload_1 27 0010 0111 → 価値 ローカル変数1からdoubleをロードする
dload_2 28 0010 1000 → 価値 ローカル変数2からdoubleをロードする
dload_3 29 0010 1001 → 価値 ローカル変数3からdoubleをロードする
dmul 6b 0110 1011 値1、値2 → 結果 2つの倍精度数を掛ける
dneg 77 0111 0111 値 → 結果 ダブルを否定する
73 0111 0011 値1、値2 → 結果 2つの倍精度浮動小数点数の間の割り算の余りを得る
戻る af 1010 1111 値 → [空] メソッドからdoubleを返す
dストア 39 0011 1001 1: インデックス 価値→ ローカル変数#indexにdouble値を格納する
dstore_0 47 0100 0111 価値→ ローカル変数0にdoubleを格納する
dstore_1 48 0100 1000 価値→ ローカル変数1にdoubleを格納する
dstore_2 49 0100 1001 価値→ ローカル変数2にdoubleを格納する
dstore_3 4a 0100 1010 価値→ ローカル変数3にdoubleを格納する
dsub 67 0110 0111 値1、値2 → 結果 倍数から別の倍数を引く
重複 59 0101 1001 価値 → 価値、価値 スタックの一番上の値を複製する
重複_x1 5a 0101 1010 値2、値1 → 値1、値2、値1 一番上の値のコピーをスタックの上から 2 番目の値に挿入します。value1 と value2 は double 型または long 型であってはなりません。
重複x2 5b 0101 1011 値3、値2、値1 → 値1、値3、値2、値1 スタックに、一番上の値のコピーを 2 つ(値 2 が double または long の場合は、値 3 のエントリも占有します)または 3 つ(値 2 が double でも long でもない場合は)挿入します。
重複2 5c 0101 1100 {値2, 値1} → {値2, 値1}, {値2, 値1} スタックの上位 2 つのワードを重複します (値 1 が double でも long でもない場合は 2 つの値、値 1 が double または long の場合は 1 つの値)
重複2_x1 5日 0101 1101 値3、{値2、値1} → {値2、値1}、値3、{値2、値1} 2つの単語を複製し、3番目の単語の下に挿入します(上記の説明を参照)
重複2_x2 5e 0101 1110 {値4, 値3}, {値2, 値1} → {値2, 値1}, {値4, 値3}, {値2, 値1} 2つの単語を複製し、4番目の単語の下に挿入します
f2d 8日 1000 1101 値 → 結果 floatをdoubleに変換する
f2i 8b 1000 1011 値 → 結果 floatをintに変換する
f2l 8c 1000 1100 値 → 結果 floatをlongに変換する
流行 62 0110 0010 値1、値2 → 結果 2つのフロートを追加する
負荷 30 0011 0000 配列参照、インデックス → 値 配列から浮動小数点数を読み込む
ファストア 51 0101 0001 配列参照、インデックス、値 → 浮動小数点数を配列に格納する
fcmpg 96 1001 0110 値1、値2 → 結果 2つの浮動小数点数を比較する(NaNの場合は1)
fcmpl 95 1001 0101 値1、値2 → 結果 2つの浮動小数点数を比較する。NaNの場合は-1
fconst_0 0b 0000 1011 → 0.0f スタックに 0.0fをプッシュする
fconst_1 0c 0000 1100 → 1.0f スタックに 1.0fをプッシュする
fconst_2 0日 0000 1101 → 2.0f 2.0fをスタックに プッシュする
fdiv 6e 0110 1110 値1、値2 → 結果 2つの浮動小数点数を割る
負荷 17 0001 0111 1: インデックス → 価値 ローカル変数#indexからfloat値をロードします。
fload_0 22 0010 0010 → 価値 ローカル変数0から 浮動小数点値を読み込む
fload_1 23 0010 0011 → 価値 ローカル変数1から 浮動小数点値を読み込む
fload_2 24 0010 0100 → 価値 ローカル変数2から 浮動小数点値を読み込む
fload_3 25 0010 0101 → 価値 ローカル変数3から 浮動小数点値を読み込む
フル 6a 0110 1010 値1、値2 → 結果 2つの浮動小数点数を掛ける
fneg 76 0111 0110 値 → 結果 浮動小数点数を反転する
フレム 72 0111 0010 値1、値2 → 結果 2つの浮動小数点数の割り算の余りを求める
freturn ae 1010 1110 値 → [空] 浮動小数点数を返す
fstore 38 0011 1000 1: インデックス 価値→ 浮動小数点値をローカル変数#indexに格納する
fstore_0 43 0100 0011 価値→ 浮動小数点値をローカル変数0に 格納する
fstore_1 44 0100 0100 価値→ ローカル変数1に 浮動小数点値を格納する
fstore_2 45 0100 0101 価値→ ローカル変数2に 浮動小数点値を格納する
fstore_3 46 0100 0110 価値→ ローカル変数3に 浮動小数点値を格納する
fsub 66 0110 0110 値1、値2 → 結果 2つの浮動小数点数を減算する
取得フィールド b4 1011 0100 2: インデックスバイト1、インデックスバイト2 オブジェクト参照 → 値 オブジェクトobjectrefのフィールドを取得します。フィールドは定数プールインデックス内のフィールド参照によって識別されます( indexbyte1 << 8 | indexbyte2 )
取得静的 b2 1011 0010 2: インデックスバイト1、インデックスバイト2 → 価値 クラスの静的フィールドを取得します。フィールドは定数プールインデックス内のフィールド参照によって識別されます( indexbyte1 << 8 | indexbyte2 )
後藤 a7 1010 0111 2: ブランチバイト1、ブランチバイト2 [変更なし] branchoffsetの別の命令に進みます(符号なしバイトから構成される符号付き short branchbyte1 << 8 | branchbyte2 )
goto_w c8 1100 1000 4: ブランチバイト1、ブランチバイト2、ブランチバイト3、ブランチバイト4 [変更なし] branchoffsetの別の命令に進みます(符号なしバイトから構成される符号付き整数branchbyte1 << 24 | branchbyte2 << 16 | branchbyte3 << 8 | branchbyte4 )
i2b 91 1001 0001 値 → 結果 intをbyteに変換する
i2c 92 1001 0010 値 → 結果 intを文字に変換する
i2d 87 1000 0111 値 → 結果 intをdoubleに変換する
i2f 86 1000 0110 値 → 結果 intをfloatに変換する
i2l 85 1000 0101 値 → 結果 intをlongに変換する
i2s 93 1001 0011 値 → 結果 intをshortに変換する
iadd 60 0110 0000 値1、値2 → 結果 2つのintを加算する
iaload 2e 0010 1110 配列参照、インデックス → 値 配列からintを読み込む
そして 7e 0111 1110 値1、値2 → 結果 2つの整数のビットごとのANDを実行する
iastore 4階 0100 1111 配列参照、インデックス、値 → intを配列に格納する
アイコンst_m1 02 0000 0010 → -1 int値-1をスタックにロードする
アイコンt_0 03 0000 0011 → 0 int値0をスタックにロードする
アイコンt_1 04 0000 0100 → 1 int値1をスタックにロードする
アイコンst_2 05 0000 0101 → 2 int値2をスタックにロードする
アイコンst_3 06 0000 0110 → 3 int値3をスタックにロードする
アイコンst_4 07 0000 0111 → 4 int値4をスタックにロードする
アイコンst_5 08 0000 1000 → 5 int値5をスタックにロードする
idiv 6c 0110 1100 値1、値2 → 結果 2つの整数を割る
if_acmpeq a5 1010 0101 2: ブランチバイト1、ブランチバイト2 値1、値2 → 参照が等しい場合、branchoffsetの命令に分岐します(符号なしバイトから構成されるsigned short branchbyte1 << 8 | branchbyte2
if_acmpne a6 1010 0110 2: ブランチバイト1、ブランチバイト2 値1、値2 → 参照が等しくない場合は、branchoffsetの命令に分岐します(符号なしバイトから構成されるsigned short branchbyte1 << 8 | branchbyte2
if_icmpeq 9階 1001 1111 2: ブランチバイト1、ブランチバイト2 値1、値2 → intが等しい場合、branchoffsetの命令に分岐します(符号なしバイトから構築されたsigned short branchbyte1 << 8 | branchbyte2
if_icmpge a2 1010 0010 2: ブランチバイト1、ブランチバイト2 値1、値2 → value1がvalue2以上の場合には、 branchoffsetの命令に分岐します(符号なしバイトから構成される signed short branchbyte1 << 8 | branchbyte2
if_icmpgt a3 1010 0011 2: ブランチバイト1、ブランチバイト2 値1、値2 → value1 がvalue2より大きい場合、 branchoffsetの命令に分岐します(符号なしバイトから構成される signed short branchbyte1 << 8 | branchbyte2
単純な場合 a4 1010 0100 2: ブランチバイト1、ブランチバイト2 値1、値2 → value1がvalue2以下の場合、 branchoffsetの命令に分岐します(符号なしバイトから構成される signed short branchbyte1 << 8 | branchbyte2 )
if_icmplt a1 1010 0001 2: ブランチバイト1、ブランチバイト2 値1、値2 → value1 がvalue2より小さい場合、 branchoffsetの命令に分岐します(符号なしバイトから構成される signed short branchbyte1 << 8 | branchbyte2
if_icmpne a0 1010 0000 2: ブランチバイト1、ブランチバイト2 値1、値2 → intが等しくない場合は、branchoffsetの命令に分岐します(符号なしバイトから構築されたsigned short branchbyte1 << 8 | branchbyte2
イフェク 99 1001 1001 2: ブランチバイト1、ブランチバイト2 価値→ が0の場合、 branchoffsetの命令に分岐します(符号なしバイトから構成されるsigned short branchbyte1 << 8 | branchbyte2
もし 9セント 1001 1100 2: ブランチバイト1、ブランチバイト2 価値→ 値が0以上の場合、 branchoffsetの命令に分岐します(符号なしバイトから構成されるsigned short branchbyte1 << 8 | branchbyte2
もし 9日 1001 1101 2: ブランチバイト1、ブランチバイト2 価値→ 値が0より大きい場合、 branchoffsetの命令に分岐します(符号なしバイトから構成されるsigned short branchbyte1 << 8 | branchbyte2
イフル 9e 1001 1110 2: ブランチバイト1、ブランチバイト2 価値→ 値が0以下の場合、 branchoffsetの命令に分岐します(符号なしバイトから構成されるsigned short branchbyte1 << 8 | branchbyte2
もし 9b 1001 1011 2: ブランチバイト1、ブランチバイト2 価値→ 値が0未満の場合、 branchoffsetの命令に分岐します(符号なしバイトから構成されるsigned short branchbyte1 << 8 | branchbyte2
イフネ 9a 1001 1010 2: ブランチバイト1、ブランチバイト2 価値→ 値が0でない場合、 branchoffsetの命令に分岐します(符号なしバイトから構成されるsigned short branchbyte1 << 8 | branchbyte2
null 以外の場合 c7 1100 0111 2: ブランチバイト1、ブランチバイト2 価値→ がnullでない場合、 branchoffsetの命令に分岐します(符号なしバイトから構成されるsigned short branchbyte1 << 8 | branchbyte2
nullの場合 c6 1100 0110 2: ブランチバイト1、ブランチバイト2 価値→ がnullの場合、 branchoffsetの命令に分岐します(符号なしバイトから構成されるsigned short branchbyte1 << 8 | branchbyte2
iinc 84 1000 0100 2: インデックス、定数 [変更なし] ローカル変数#index を符号付きバイト定数で増分する
iload 15 0001 0101 1: インデックス → 価値 ローカル変数#indexからint値をロードします。
iload_0 1a 0001 1010 → 価値 ローカル変数0から int値をロードする
iload_1 1b 0001 1011 → 価値 ローカル変数1から int値をロードする
iload_2 1c 0001 1100 → 価値 ローカル変数2から int値をロードする
iload_3 1日 0001 1101 → 価値 ローカル変数3から int値をロードする
重要1 フェ 1111 1110 デバッガ内の実装依存の操作のために予約されており、どのクラスファイルにも出現してはならない。
インプデップ2 ff 1111 1111 デバッガ内の実装依存の操作のために予約されており、どのクラスファイルにも出現してはならない。
イムル 68 0110 1000 値1、値2 → 結果 2つの整数を掛ける
イネグ 74 0111 0100 値 → 結果 整数を反転する
インスタンス c1 1100 0001 2: インデックスバイト1、インデックスバイト2 オブジェクト参照 → 結果 オブジェクトオブジェクト参照が、定数プール内のクラス参照インデックスによって識別される特定の型であるかどうかを判断します( indexbyte1 << 8 | indexbyte2)。
呼び出しダイナミック 1011 1010 4: インデックスバイト1、インデックスバイト2、0、0 [arg1, arg2, ...] → 結果 動的メソッドを呼び出して、その結果をスタックに格納します(voidの可能性があります)。メソッドは、定数プール内のメソッド参照インデックスによって識別されます( indexbyte1 << 8 | indexbyte2)。
呼び出しインターフェース b9 1011 1001 4: インデックスバイト1、インデックスバイト2、カウント、0 objectref, [arg1, arg2, ...] → 結果 オブジェクトobjectrefのインターフェースメソッドを呼び出し、その結果をスタックに格納します(void の可能性があります)。インターフェースメソッドは、定数プール内のメソッド参照インデックスによって識別されます(indexbyte1 << 8 | indexbyte2)。
特別な呼び出し b7 1011 0111 2: インデックスバイト1、インデックスバイト2 objectref, [arg1, arg2, ...] → 結果 オブジェクトobjectrefのインスタンスメソッドを呼び出し、その結果をスタックに置きます(void の可能性があります)。メソッドは、定数プール内のメソッド参照インデックスによって識別されます(indexbyte1 << 8 | indexbyte2)。
呼び出し静的 b8 1011 1000 2: インデックスバイト1、インデックスバイト2 [arg1, arg2, ...] → 結果 静的メソッドを呼び出して、結果をスタックに格納します(void の可能性があります)。メソッドは、定数プール内のメソッド参照インデックスによって識別されます( indexbyte1 << 8 | indexbyte2)。
仮想呼び出し b6 1011 0110 2: インデックスバイト1、インデックスバイト2 objectref, [arg1, arg2, ...] → 結果 オブジェクトobjectrefの仮想メソッドを呼び出し、その結果をスタックに格納します(void の可能性があります)。メソッドは定数プール内のメソッド参照インデックスによって識別されます( indexbyte1 << 8 | indexbyte2)。
ior 80 1000 0000 値1、値2 → 結果 ビット単位の整数OR
アイレム 70 0111 0000 値1、値2 → 結果 論理整数剰余
リターン 交流 1010 1100 値 → [空] メソッドから整数を返す
イシュル 78 0111 1000 値1、値2 → 結果 int 左シフト
イシュル 7a 0111 1010 値1、値2 → 結果 int算術右シフト
iストア 36 0011 0110 1: インデックス 価値→ int値を変数#indexに格納する
istore_0 3b 0011 1011 価値→ int値を変数0に 格納する
istore_1 3c 0011 1100 価値→ int値を変数1に 格納する
istore_2 3D 0011 1101 価値→ 変数2に int値を格納する
istore_3 3e 0011 1110 価値→ 変数3に int値を格納する
isub 64 0110 0100 値1、値2 → 結果 int 減算
イシュル 7c 0111 1100 値1、値2 → 結果 int 論理右シフト
イクソル 82 1000 0010 値1、値2 → 結果 整数排他論理和
jsr a8 1010 1000 2: ブランチバイト1、ブランチバイト2 → 住所 branchoffset(符号なしバイトbranchbyte1 << 8 | branchbyte2から構成されるsigned short)のサブルーチンにジャンプし、戻りアドレスをスタックに配置します。
jsr_w c9 1100 1001 4: ブランチバイト1、ブランチバイト2、ブランチバイト3、ブランチバイト4 → 住所 branchoffset(符号なしバイトbranchbyte1 << 24 | branchbyte2 << 16 | branchbyte3 << 8 | branchbyte4から構成される符号付き整数)のサブルーチンにジャンプし、戻りアドレスをスタックに配置します。
l2d 8a 1000 1010 値 → 結果 longをdoubleに変換する
l2f 89 1000 1001 値 → 結果 longをfloatに変換する
l2i 88 1000 1000 値 → 結果 longをintに変換する
ラッド 61 0110 0001 値1、値2 → 結果 2つのlongを加算する
ロード 2階 0010 1111 配列参照、インデックス → 値 配列からlongを読み込む
土地 7階 0111 1111 値1、値2 → 結果 2つのlongのビットAND
ラストール 50 0101 0000 配列参照、インデックス、値 → 配列にlongを格納する
lcmp 94 1001 0100 値1、値2 → 結果 2つのlongが同じ場合は0を、value1がvalue2より大きい場合は1を、そうでない場合は-1をプッシュします。
lconst_0 09 0000 1001 → 0L 0L ( long型の数値ゼロ)をスタックに プッシュする
lconst_1 0a 0000 1010 → 1L 1L ( long型の数値1 )をスタックに プッシュする
ldc 12 0001 0010 1: インデックス → 価値 定数プール(String、int、float、Class、java.lang.invoke.MethodType、java.lang.invoke.MethodHandle、または動的に計算された定数)から定数#indexをスタックに プッシュします。
ldc_w 13 0001 0011 2: インデックスバイト1、インデックスバイト2 → 価値 定数プール(String、int、float、Class、java.lang.invoke.MethodType、java.lang.invoke.MethodHandle、または動的に計算された定数)から定数#index をスタックにプッシュします(ワイドインデックスはindexbyte1 << 8 | indexbyte2として構築されます)。
ldc2_w 14 0001 0100 2: インデックスバイト1、インデックスバイト2 → 価値 定数プール(double、long、または動的に計算された定数)から定数#index をスタックにプッシュします(ワイドインデックスはindexbyte1 << 8 | indexbyte2として構築されます)
ldiv 6日 0110 1101 値1、値2 → 結果 2つのlongを割る
ロード 16 0001 0110 1: インデックス → 価値 ローカル変数#indexから long 値をロードする
ロード_0 1e 0001 1110 → 価値 ローカル変数0からlong値をロードする
ロード1 1階 0001 1111 → 価値 ローカル変数1からlong値を読み込む
ロード2 20 0010 0000 → 価値 ローカル変数2からlong値を読み込む
lload_3 21 0010 0001 → 価値 ローカル変数3からlong値を読み込む
ルムル 69 0110 1001 値1、値2 → 結果 2つのlongを掛ける
75 0111 0101 値 → 結果 長い否定
ルックアップスイッチ 腹筋 1010 1011 8+: <0~3 バイトのパディング>、defaultbyte1、defaultbyte2、defaultbyte3、defaultbyte4、npairs1、npairs2、npairs3、npairs4、一致オフセット ペア... キー→ ターゲットアドレスはキーを使用してテーブルから検索され、そのアドレスの命令から実行が続行されます。
ロール 81 1000 0001 値1、値2 → 結果 2つのlongのビットごとのOR
lrem 71 0111 0001 値1、値2 → 結果 2つのlong値の割り算の余り
戻る 広告 1010 1101 値 → [空] 長い値を返す
lshl 79 0111 1001 値1、値2 → 結果 long value1をint value2 の位置 だけ左にビットシフトする
lshr 7b 0111 1011 値1、値2 → 結果 long value1を int value2 の位置 だけ右にビットシフトする
lstore 37 0011 0111 1: インデックス 価値→ ローカル変数#indexにlong値を格納する
lstore_0 3階 0011 1111 価値→ ローカル変数0に long値を格納する
lstore_1 40 0100 0000 価値→ ローカル変数1に long値を格納する
lstore_2 41 0100 0001 価値→ ローカル変数2に long値を格納する
lstore_3 42 0100 0010 価値→ ローカル変数3に long値を格納する
lsub 65 0110 0101 値1、値2 → 結果 2つのlongを減算する
豊かな 7日 0111 1101 値1、値2 → 結果 long value1をint value2 の位置で右にビットシフトする(符号なし)
ルクソール 83 1000 0011 値1、値2 → 結果 2つのlongのビット単位のXOR
モニター入力 c2 1100 0010 オブジェクト参照 → オブジェクトのモニターに入る(「ロックを取得する」 - synchronized() セクションの開始)
モニター終了 c3 1100 0011 オブジェクト参照 → オブジェクトの終了モニター(「ロックを解除する」 – synchronized() セクションの終了)
マルチアネワアレイ c5 1100 0101 3: インデックスバイト1、インデックスバイト2、寸法 count1, [count2,...] → 配列参照 定数プールインデックス内のクラス参照によって識別される型の次元の新しい配列を作成します(indexbyte1 << 8 | indexbyte2)。各次元のサイズはcount1、[ count2、など] によって識別されます。
新しい bb 1011 1011 2: インデックスバイト1、インデックスバイト2 → オブジェクト参照 定数プールインデックス内のクラス参照で識別される型の新しいオブジェクトを作成します(indexbyte1 << 8 | indexbyte2
新しい配列 紀元前 1011 1100 1: atype カウント → 配列参照 atypeで識別されるプリミティブ型の要素をcount個持つ新しい配列を作成する
いいえ 00 0000 0000 [変更なし] 何も操作しない
ポップ 57 0101 0111 価値→ スタックの一番上の値を捨てる
ポップ2 58 0101 1000 {値2, 値1} → スタックの上位2つの値を破棄します(doubleまたはlongの場合は1つの値)。
プットフィールド b5 1011 0101 2: インデックスバイト1、インデックスバイト2 オブジェクト参照、値 → オブジェクトobjectref内のフィールドをに設定します。フィールドは定数プール内のフィールド参照インデックスによって識別されます ( indexbyte1 << 8 | indexbyte2 )
静的にする b3 1011 0011 2: インデックスバイト1、インデックスバイト2 価値→ クラス内の静的フィールドをに設定します。フィールドは定数プール内のフィールド参照インデックスによって識別されます ( indexbyte1 << 8 | indexbyte2 )
ret a9 1010 1001 1: インデックス [変更なし] ローカル変数#indexから取得したアドレスから実行を継続します(jsr との非対称性は意図的です)
戻る b1 1011 0001 → [空] voidメソッドからの戻り
サロード 35 0011 0101 配列参照、インデックス → 値 配列からショートをロードする
サストア 56 0101 0110 配列参照、インデックス、値 → shortを配列に格納する
シプシュ 11 0001 0001 2: バイト1、バイト2 → 価値 整数値としてショートをスタックにプッシュする
スワップ 5階 0101 1111 値2、値1 → 値1、値2 スタック上のトップ2つのワードを交換します(value1とvalue2はdoubleまたはlongであってはならないことに注意してください)
テーブルスイッチ ああ 1010 1010 16+: [0~3 バイトのパディング]、defaultbyte1、defaultbyte2、defaultbyte3、defaultbyte4、lowbyte1、lowbyte2、lowbyte3、lowbyte4、highbyte1、highbyte2、highbyte3、highbyte4、ジャンプ オフセット... インデックス → テーブル内のオフセットインデックスのアドレスから実行を続行します
広い c4 1100 0100 3/5: オペコード、インデックスバイト1、インデックスバイト2またはiinc、インデックスバイト1、インデックスバイト2、カウントバイト1、カウントバイト2 [対応する指示と同じ] opcodeを実行します。opcodeiload、fload、aload、lload、dload、istore、fstore、astore、lstore、dstore、または ret のいずれかですが、インデックスは16 ビットであると想定します。または、iinc を実行します。インデックスは 16 ビットで、増分する定数は符号付き 16 ビットの short です。
(名前なし)cb-fd これらの値は現在オペコードに割り当てられておらず、将来の使用のために予約されています。

Java 7(メジャークラスバージョン51)では非推奨です。[ 2 ]これらは、それより新しいコンパイラから生成されたクラスファイルには表示されません。

参照

  • Jazelle DBX (Direct Bytecode eXecution) は、一部の ARM9 CPU 上で Java バイトコードをハードウェアで実行する機能です。
  • 共通中間言語(CIL) は、.NET Framework の CLR 上で実行される同様のバイトコード仕様です。

参考文献