メインコンテンツまでスキップ

命令の分類

JAL では iloadinvokevirtual など,JVM 命令の名前を使います。このページは用途別の案内です。個々の命令のスタック変化と使用例は,Jaspera の「命令」パネルで検索できます。

定数を積む

命令積む値
aconst_nullnull
iconst_m1iconst_0iconst_5−1〜5 の int
bipush n−128〜127 の整数を int として積む
sipush n−32768〜32767 の整数を int として積む
lconst_0lconst_10 または 1 の long
fconst_0fconst_20〜2 の float
dconst_0dconst_10 または 1 の double
ldc文字列などの定数プールの値

bipush で積んだ値も,スタック上では byte ではなく int です。クラスファイルには定数プールのインデックス幅による ldc_w と,longdouble 用の ldc2_w もあります。

値の型と命令名

接頭辞主に扱う型
iintiloadistoreiadd
llonglloadlstoreladd
ffloatfloadfstorefadd
ddoubledloaddstoredadd
aオブジェクト・配列の参照aloadastoreareturn

ロードとストアには iload 2 のような通常形と,スロット 0〜3 を指定する iload_2 などの短縮形があります。参照を足し算する aadd のような命令はありません。

計算する

addsubmuldivremneg に型の接頭辞を付けます。isub は二つの整数の差,ddiv は二つの double の商を求めます。

整数の除算は小数部分を 0 に向かって切り捨てます。idivldiv で 0 除算すると ArithmeticException になります。浮動小数点の除算は同じ扱いではなく,無限大や NaN になる場合があります。

iinc スロット 増分 はローカル変数の int を直接増減し,スタックを変えません。ビット演算には iandiorixor など,型変換には i2ld2i などがあります。

スタック・配列・呼び出し

目的命令と説明
複製・交換・破棄dupswappop など。カテゴリによる制約あり
オブジェクト生成new とコンストラクタ呼び出し
配列生成newarrayanewarraymultianewarray
配列アクセスialoadiastoreaaloadaastore など
フィールドgetstaticputstaticgetfieldputfield
メソッド呼び出しinvokestaticinvokevirtualinvokespecialinvokeinterfaceinvokedynamic
分岐if*gototableswitchlookupswitch
例外を投げるathrow

オブジェクトと配列メソッド呼び出し制御フローに具体例があります。

メソッドから戻る

戻り型命令
Vreturn
IZBCSireturn
Jlreturn
Ffreturn
Ddreturn
クラス型・配列型areturn

戻り命令はフレームを終了します。単なるラベルへのジャンプとは異なります。命令の厳密な動作・制約・例外は JVM 仕様 第6章 を参照してください。