DVMのインストラクションのニモニックです。
byteは1バイトの正の整数、 shortは2バイトの正の整数(ビッグエンディアン)、 cpはコンスタントプールのインデックスを指し、 実際にはshortと同じです。
該当のインストラクションの意味を示します。
インストラクション実行時のスタックの変化を示します。
[ ]内には、スタックの上位にある値の型を表記しています。 右端がスタックのトップです。 DVMにはbooleanやfunctionという型はなく、 実際にはどちらもintなのですが、わかりやすくするため boolean, functionと書いています。
交換則が効かない演算子等では、順番に意味があるので、 [int1 int2]のように記述し、結果の方を[ (int / int2) ]のように 記述しています。結果の型はCの演算子に準ずるので、 [ (int1 > int1) ]の型はbooleanです。
命令 | オペランドの型 | 意味 | スタック |
---|---|---|---|
push_int_1byte | byte | オペランドとして与えられる1バイトの整数をスタックにプッシュする。 | [] → [ int ] |
push_int_2byte | short | オペランドとして与えられる2バイトの整数をスタックにプッシュする。 | [] → [ int ] |
push_int | cp | コンスタントプールのintの定数をスタックにプッシュする。 | [] → [ int ] |
push_double_0 | doubleの定数0をスタックにプッシュする。 | [] → [ double ] | |
push_double_1 | doubleの定数1をスタックにプッシュする。 | [] → [ double ] | |
push_double | cp | コンスタントプールのdoubleの定数をスタックにプッシュする。 | [] → [ double ] |
push_string | cp | コンスタントプールのstringの定数をスタックにプッシュする。 | [] → [ string ] |
push_null | nullをスタックにプッシュする。 | [] → [ object ] | |
push_stack_int | short | スタック上の、 baseからオペランド分だけ離れた個所のint値をスタックにプッシュする。 | [] → [ int ] |
push_stack_double | short | スタック上の、 baseからオペランド分だけ離れた個所のdouble値をスタックにプッシュする。 | [] → [ double ] |
push_stack_object | short | スタック上の、 baseからオペランド分だけ離れた個所のobject値をスタックにプッシュする。 | [] → [ object ] |
pop_stack_int | short | スタック上の、 baseからオペランド分だけ離れた個所に、 スタックトップのint値をポップする。 | [ int ] → [] |
pop_stack_double | short | スタック上の、 baseからオペランド分だけ離れた個所に、 スタックトップのdouble値をポップする。 | [ double ] → [] |
pop_stack_object | short | スタック上の、 baseからオペランド分だけ離れた個所に、 スタックトップのobject値をポップする。 | [ object ] → [] |
push_static_int | short | オペランドで示されるインデックスの int型静的変数をスタックにプッシュする。 | [] → [ int ] |
push_static_double | short | オペランドで示されるインデックスの double型静的変数をスタックにプッシュする。 | [] → [ double ] |
push_static_object | short | オペランドで示されるインデックスの object型静的変数をスタックにプッシュする。 | [] → [ object ] |
pop_static_int | short | スタックトップの値をオペランドで示される インデックスのint型静的変数にポップする。 | [ int ] → [] |
pop_static_double | short | スタックトップの値をオペランドで示される インデックスのdouble型静的変数にポップする。 | [ double ] → [] |
pop_static_object | short | スタックトップの値をオペランドで示される インデックスのobject型静的変数にポップする。 | [ object ] → [] |
push_array_int | スタック上の配列と添字から、配列の要素(int型)を取得し、 それをスタックに積む。 | [array int] → [int] | |
push_array_double | スタック上の配列と添字から、配列の要素(double型)を取得し、 それをスタックに積む。 | [array int] → [double] | |
push_array_object | スタック上の配列と添字から、配列の要素(object型)を取得し、 それをスタックに積む。 | [array int] → [object] | |
pop_array_int | スタック上の値(int1)を、配列arrayの添字int2の要素に代入する。 | [int1 array int2] → [] | |
pop_array_double | スタック上の値(double)を、配列arrayの添字intの要素に代入する。 | [double array int] → [] | |
pop_array_object | スタック上の値(object)を、配列arrayの添字intの要素に代入する。 | [object array int] → [] | |
add_int | int同士の加算を行ない、結果をスタックにプッシュする。 | [ int int ] → [ int ] | |
add_double | double同士の加算を行ない、結果をスタックにプッシュする。 | [ double double ] → [ double ] | |
add_string | stringの連結を行ない、結果をスタックにプッシュする。 | [ string1 string2 ] → [ (string1+string2) ] | |
sub_int | int同士の減算を行ない、結果をスタックにプッシュする。 | [ int1 int2 ] → [ (int1-int2) ] | |
sub_double | double同士の減算を行ない、結果をスタックにプッシュする。 | [ double1 double2 ] → [ (double1-double2) ] | |
mul_int | int同士の乗算を行ない、結果をスタックにプッシュする。 | [ int int ] → [ int ] | |
mul_double | double同士の乗算を行ない、結果をスタックにプッシュする。 | [ double double ] → [ double ] | |
div_int | int同士の除算を行ない、結果をスタックにプッシュする (結果はint型)。 | [ int1 int2 ] → [ (int1/int2) ] | |
div_double | double同士の除算を行ない、結果をスタックにプッシュする。 | [ double1 double2 ] → [ (double1/double2) ] | |
mod_int | intの剰余を取得し、結果をスタックにプッシュする。 | [ int1 int2 ] → [ (int1%int2) ] | |
mod_double | doubleの剰余を取得し、結果をスタックにプッシュする。 | [ double1 double2 ] → [ (fmod(double1, double2)) ] | |
minus_int | スタックトップのint値の符号を反転させる。 | [ int ] → [ int ] | |
minus_double | スタックトップのdouble値の符号を反転させる。 | [ double ] → [ double ] | |
increment | スタックトップのint値をインクリメントする。 | [ int ] → [ int ] | |
decrement | スタックトップのint値をデクリメントする。 | [ int ] → [ int ] | |
cast_int_to_double | スタックトップのint値をdoubleにキャストする。 | [ int ] → [ double ] | |
cast_double_to_int | スタックトップのdouble値をintにキャストする。 | [ double ] → [ int ] | |
cast_boolean_to_string | スタックトップのboolean値を文字列(trueまたはfalse)に変換する。 | [ boolean ] → [ string ] | |
cast_int_to_string | スタックトップのint値を文字列に変換する。 | [ int ] → [ string ] | |
cast_double_to_string | スタックトップのdouble値を文字列に変換する。 | [ double ] → [ string ] | |
eq_int | int同士の比較(==)を行ない、結果をスタックに積む。 | [ int int ] → [ boolean ] | |
eq_double | double同士の比較(==)を行ない、結果をスタックに積む。 | [ double double ] → [ boolean ] | |
eq_object | object同士の比較(参照の比較で==)を行ない、結果をスタックに積む。 | [ object object ] → [ boolean ] | |
eq_string | string同士の比較(内容の比較で==)を行ない、結果をスタックに積む。 | [ string string ] → [ boolean ] | |
gt_int | int同士の比較(>)を行ない、結果をスタックに積む。 | [ int1 int2 ] → [ (int1 > int2) ] | |
gt_double | double同士の比較(>)を行ない、結果をスタックに積む。 | [ double1 double2 ] → [ (double1 > double2) ] | |
gt_string | 文字列同士の比較(>/辞書順)を行ない、結果をスタックに積む。 | [ string1 string2 ] → [ (wcscmp(string1, string2) > 0) ] | |
ge_int | int同士の比較(>=)を行ない、結果をスタックに積む。 | [ int1 int2 ] → [ (int1 >= int2) ] | |
ge_double | double同士の比較(>=)を行ない、結果をスタックに積む。 | [ double1 double2 ] → [ (double1 >= double2) ] | |
ge_string | 文字列同士の比較(>=/辞書順)を行ない、結果をスタックに積む。 | [ string1 string2 ] → [ (wcscmp(string1, string2) >= 0) ] | |
lt_int | int同士の比較(<)を行ない、結果をスタックに積む。 | [ int1 int2 ] → [ (int1 < int2) ] | |
lt_double | double同士の比較(<)を行ない、結果をスタックに積む。 | [ double1 double2 ] → [ (double1 < double2) ] | |
lt_string | 文字列同士の比較(</辞書順)を行ない、結果をスタックに積む。 | [ string1 string2 ] → [ (wcscmp(string1, string2) < 0) ] | |
le_int | int同士の比較(<=)を行ない、結果をスタックに積む。 | [ int1 int2 ] → [ (int1 <= int2) ] | |
le_double | double同士の比較(<=)を行ない、結果をスタックに積む。 | [ double1 double2 ] → [ (double1 <= double2) ] | |
le_string | 文字列同士の比較(<=/辞書順)を行ない、結果をスタックに積む。 | [ string1 string2 ] → [ (wcscmp(string1, string2) <= 0) ] | |
ne_int | int同士の比較(!=)を行ない、結果をスタックに積む。 | [ int int ] → [ boolean ] | |
ne_double | double同士の比較(!=)を行ない、結果をスタックに積む。 | [ double double ] → [ boolean ] | |
ne_object | object同士の比較(参照の比較で!=)を行ない、結果をスタックに積む。 | [ object object ] → [ boolean ] | |
ne_string | string同士の比較(内容の比較で!=)を行ない、結果をスタックに積む。 | [ string string ] → [ boolean ] | |
logical_and | 論理ANDを取り結果をスタックに積む。 | [ boolean boolean ] → [ boolean ] | |
logical_or | 論理ORを取り結果をスタックに積む。 | [ boolean boolean ] → [ boolean ] | |
logical_not | スタックトップの値に対し論理NOTを取る。 | [ boolean ] → [ boolean ] | |
pop | スタックトップの値をひとつ捨てる 。 | [ T ] → [] | |
duplicate | スタックトップの値をひとつ複製する。 | [ T ] → [ T T ] | |
jump | short | オペランドで与えられたアドレスにジャンプする。 | [] → [] |
jump_if_true | short | スタックトップの値がtrueであれば、 オペランドで与えられたアドレスにジャンプする。 | [ boolean ] → [] |
jump_if_false | short | スタックトップの値がfalseであれば、 オペランドで与えられたアドレスにジャンプする。 | [ boolean ] → [] |
push_function | short | オペランドで与えられた 関数のインデックスをスタックにプッシュする (実際の動作はpush_int_2byteと同じ)。 | [] → [ function ] |
invoke | スタックトップの関数を呼び出す。 | [ function ] → [ こちらを参照 ] | |
return | スタックトップの値を戻り値として、 関数からreturnする。 | [ 戻り値 ] → [ こちらを参照 ] | |
new_array | byte, short | オペランドのshortで示される型の配列を、 byte次元だけ、スタックで指定されるサイズ分生成し、スタックに積む。 | [size1 size2 ...] → [array] |
new_array_literal_int | short | スタックに積まれた、オペランドで与えられる数だけのint型要素から、 配列を生成しスタックに積む。 | [int1 int2 int3 ...] → [array] |
new_array_literal_double | short | スタックに積まれた、オペランドで与えられる数だけのdouble型要素から、 配列を生成しスタックに積む。 | [double1 double2 double3 ...] → [array] |
new_array_literal_object | short | スタックに積まれた、オペランドで与えられる数だけのobject型要素から、 配列を生成しスタックに積む。 | [object1 object2 object3 ...] → [array] |