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

命令の分類

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

定数を積む​

命令積む値
aconst_nullnull
iconst_m1,iconst_0〜iconst_5−1〜5 の int
bipush n−128〜127 の整数を int として積む
sipush n−32768〜32767 の整数を int として積む
lconst_0,lconst_10 または 1 の long
fconst_0〜fconst_20〜2 の float
dconst_0,dconst_10 または 1 の double
ldc文字列などの定数プールの値

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

値の型と命令名​

接頭辞主に扱う型例
iintiload,istore,iadd
llonglload,lstore,ladd
ffloatfload,fstore,fadd
ddoubledload,dstore,dadd
aオブジェクト・配列の参照aload,astore,areturn

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

計算する​

add,sub,mul,div,rem,neg に型の接頭辞を付けます。isub は二つの整数の差,ddiv は二つの double の商を求めます。

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

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

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

目的命令と説明
複製・交換・破棄dup,swap,pop など。カテゴリによる制約あり
オブジェクト生成new とコンストラクタ呼び出し
配列生成newarray,anewarray,multianewarray
配列アクセスiaload,iastore,aaload,aastore など
フィールドgetstatic,putstatic,getfield,putfield
メソッド呼び出しinvokestatic,invokevirtual,invokespecial,invokeinterface,invokedynamic
分岐if*,goto,tableswitch,lookupswitch
例外を投げるathrow

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

メソッドから戻る​

戻り型命令
Vreturn
I,Z,B,C,Sireturn
Jlreturn
Ffreturn
Ddreturn
クラス型・配列型areturn

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