DVMインストラクションリファレンス(ver.0.1)

凡例

命令

DVMのインストラクションのニモニックです。

オペランドの型

byteは1バイトの正の整数、 shortは2バイトの正の整数(ビッグエンディアン)、 cpはコンスタントプールのインデックスを指し、 実際にはshortと同じです。

意味

該当のインストラクションの意味を示します。

スタック

インストラクション実行時のスタックの変化を示します。

[ ]内には、スタックの上位にある値の型を表記しています。 右端がスタックのトップです。 DVMにはbooleanやfunctionという型はなく、 実際にはどちらもintなのですが、わかりやすくするため boolean, functionと書いています。

交換則が効かない演算子等では、順番に意味があるので、 [int1 int2]のように記述し、結果の方を[ (int / int2) ]のように 記述しています。結果の型はCの演算子に準ずるので、 [ (int1 > int1) ]の型はbooleanです。

インストラクション一覧

命令オペランドの型意味スタック
push_int_1bytebyte オペランドとして与えられる1バイトの整数をスタックにプッシュする。 [] → [ int ]
push_int_2byteshort オペランドとして与えられる2バイトの整数をスタックにプッシュする。 [] → [ int ]
push_intcp コンスタントプールのintの定数をスタックにプッシュする。 [] → [ int ]
push_double_0  doubleの定数0をスタックにプッシュする。 [] → [ double ]
push_double_1  doubleの定数1をスタックにプッシュする。 [] → [ double ]
push_doublecp コンスタントプールのdoubleの定数をスタックにプッシュする。 [] → [ double ]
push_stringcp コンスタントプールのstringの定数をスタックにプッシュする。 [] → [ string ]
push_null  nullをスタックにプッシュする(未使用)。 [] → [ object ]
push_stack_intshort スタック上の、 baseからオペランド分だけ離れた個所のint値をスタックにプッシュする。 [] → [ int ]
push_stack_doubleshort スタック上の、 baseからオペランド分だけ離れた個所のdouble値をスタックにプッシュする。 [] → [ double ]
push_stack_stringshort スタック上の、 baseからオペランド分だけ離れた個所のstring値をスタックにプッシュする。 [] → [ string ]
pop_stack_intshort スタック上の、 baseからオペランド分だけ離れた個所に、 スタックトップのint値をポップする。 [ int ] → []
pop_stack_doubleshort スタック上の、 baseからオペランド分だけ離れた個所に、 スタックトップのdouble値をポップする。 [ double ] → []
pop_stack_stringshort スタック上の、 baseからオペランド分だけ離れた個所に、 スタックトップのstring値をポップする。 [ string ] → []
push_static_intshort オペランドで示されるインデックスの int型静的変数をスタックにプッシュする。 [] → [ int ]
push_static_doubleshort オペランドで示されるインデックスの double型静的変数をスタックにプッシュする。 [] → [ double ]
push_static_stringshort オペランドで示されるインデックスの string型静的変数をスタックにプッシュする。 [] → [ string ]
pop_static_intshort スタックトップの値をオペランドで示される インデックスのint型静的変数にポップする。 [ int ] → []
pop_static_doubleshort スタックトップの値をオペランドで示される インデックスのdouble型静的変数にポップする。 [ double ] → []
pop_static_stringshort スタックトップの値をオペランドで示される インデックスのstring型静的変数にポップする。 [ string ] → []
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_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_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 ]
jumpshort オペランドで与えられたアドレスにジャンプする。 [] → []
jump_if_trueshort スタックトップの値がtrueであれば、 オペランドで与えられたアドレスにジャンプする。 [ boolean ] → []
jump_if_falseshort スタックトップの値がfalseであれば、 オペランドで与えられたアドレスにジャンプする。 [ boolean ] → []
push_functionshort オペランドで与えられた 関数のインデックスをスタックにプッシュする (実際の動作はpush_int_2byteと同じ)。 [] → [ function ]
invoke  スタックトップの関数を呼び出す。 [ function ] → [ こちらを参照 ]
return  スタックトップの値を戻り値として、 関数からreturnする。 [ 戻り値 ] → [ こちらを参照 ]

ひとつ上のページに戻る | トップページに戻る