mrubyの命令
概要
mrubyでは32bitの命令列を用いる
末尾の7bitが命令の種類を指している
最大128種類の命令が実現できる
実際に用意されているのは予備を含めて81種類
末尾7bitを除いた残りの25bitがオペランドのために使用する
この使用の種類が4つある
タイプ1: オペランド3個
012345678 012345678 0123456 0123456
A (9bit) B(9bit) C(7bit) 命令(7bit)
使わないオペランドがあるときもある
ビットパターンが無駄になっているが、アクセスの簡便さと効率のために許容
ex
code:s
OP_MOVE A B // レジスタBの内容をレジスタAへコピー(Cは使っていない)
OP_SEND A B C // レジスタAのオブジェクトのシンボルテーブルのB番目で指定されたメソッドを呼び出す。A+1番目のレジスタからC個分がメソッド引数。戻り値はレジスタAに格納
タイプ2: オペランド3個
012345678 0123456789012345 0123456
A(9bit) Bx(16bit) 命令(7bit)
Bx: 符号なしオペランド
ex
code:s
OP_TGETIV A Bx // シンボルテーブルBx番目のシンボルで指定されるselfのインスタンス変数の値をレジスタAに格納
sBx: 符号ありオペランド
ex
code:s
OP_JMP sBx // 次に実行される命令のアドレスを現在のアドレスからsBx離れた位置に移動させる
タイプ3: オペランド1個
0123456789012345678901234 0123456
Ax(25bit) 命令(7bit)
このタイプはOP_ENTERのみ
code:s
OP_ENTER Ax // Axに指定されたビットパターンを見て、メソッドの引数をチェックする
25bitのうち23bitを5/5/1/5/5/1/1に分割して引数指定と解釈する
table:oo
bit 内容
5 必須引数の数
5 オプション引数の数
1 rest引数(*引数)の有無
5 末尾の必須引数の数
5 キーワード引数の数(未対応)
1 キーワードrest引数(**引数)の有無(未対応)
1 ブロック引数の有無
タイプ4: タイプ1の変形
012345678 01234567890123 01 0123456
A(9bit) Bz(14bit) Cz(2bit) 命令(7bit)
このタイプの命令はOP_LAMBDAのみ