これは、 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.0(double)をスタックに プッシュする | |
| dconst_1 | 0f | 0000 1111 | → 1.0 | 定数1.0(double)をスタックに プッシュする | |
| 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を実行します。opcodeはiload、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 上で実行される同様のバイトコード仕様です。
参考文献
- ^ 「Java®仮想マシン仕様 – Java SE 24エディション」 。 2025年7月26日閲覧。
- ^ 「第4章 クラスファイル形式 4.9.1 静的制約」 。 2025年7月26日閲覧。