Shiba VM
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Full Name | Short Name | Comment |
| Stack Register Pointer | SRP | スタックレジスタポインタ。 スタックレジスタの先頭アドレス。 言い換えるとSR00の場所。 |
| Stack Pointer | SP | スタックポインタ。現在のスタック位置。 |
| Program Counter | PC | プログラムカウンタ。現在実行しているバイトコードのポインタ。 |
| Program Function | PF | プログラムの関数オブジェクトのポインタ。デバッグ用。 |
| Program Line | PL | プログラムのソースコードの行数。デバッグ用。 |
| Link Register | LR | リンクレジスタ。戻り先のバイトコードのポインタ。 |
| Function Register | FR | 関数レジスタ。全部で16個。FR00 - FR16。 |
| 戻り値あり | 非staticなメンバ関数 | 最大引数 |
| x | x | 16 |
| x | o | 15 |
| o | x | 15 |
| o | o | 14 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | - | ! - | | ! | |
| 命令 | 書式 | コメント |
| ロード | ||
| LDSRZR | LDSRZR SReg | 指定したスタックレジスタをゼロクリアする。 |
| LDSRBT | LDSRBT SReg | 指定したスタックレジスタにtrueを代入する。 |
| LDSRC1 | LDSRC4 SReg ConstantTableIndex(u16) | ConstantTableの値を指定したスタックレジスタにロード |
| LDSRC2 | ||
| LDSRC4 | ||
| LDSRC8 | ||
| LDSRSR | LDSRSR SReg1 SReg2 | SReg2の値をSReg1にロード |
| LDSRSP | LDSRSP SReg1 StackPointerOffset(u16) | StackPointerから相対アドレス分移動したアドレスをReg1にロード |
| LDSRP1 | LDSRP1 SReg1 SReg2 | SReg2の値をアドレスとみなし,SReg2が指す値を取得する |
| LDSRP2 | ||
| LDSRP4 | ||
| LDSRP8 | ||
| LDSROJ | LDSROJ SReg1 SReg2 | SReg2の値をobject型とみなし,SReg2が指すobjectの実体のアドレスのアドレスを取得する |
| LDFRSR | LDFRSR FReg SReg | SRegの値をFRegにロード |
| 算術演算 | ||
| ADDxxx | ADDI32 SReg1 SReg2 SReg3 | SReg1 = SReg2 + SReg3 |
| SUBxxx | SUBI32 SReg1 SReg2 SReg3 | SReg1 = SReg2 - SReg3 |
| MULxxx | MULS32 SReg1 SReg2 SReg3 | SReg1 = SReg2 * SReg3 |
| DIVxxx | MULS32 SReg1 SReg2 SReg3 | SReg1 = SReg2 / SReg3 |
| MODxxx | MODS32 SReg1 SReg2 SReg3 | SReg1 = SReg2 % SReg3 |
| 比較演算 | ||
| LTxxx | LTS32 SReg1 SReg2 SReg3 | SReg1 = SReg2 < SReg3 |
| LExxx | LES32 SReg1 SReg2 SReg3 | SReg1 = SReg2 <= SReg3 |
| EQxxx | EQI32 SReg1 SReg2 SReg3 | SReg1 = SReg2 == SReg3 |
| NExxx | NEI32 SReg1 SReg2 SReg3 | SReg1 = SReg2 != SReg3 |
| 関数あれこれ | ||
| FENTER | FENTER AllocSRegNum CopyFRegNum | Function Enter. まずスタックに現在のSPR,LR,PL,PFをつみ,SPを変更する。 AllocSRegNumで指定された数,スタックレジスタを確保し,SPRに設定する。SPを変更する。 CopyFRegNumで指定された数,スタックレジスタにFRに内容をコピーする。 |
| FLEAVE | FLEAVE FreeSRegNum | Function Leave. FreeSRegNumで指定された数,スタックレジスタを解放しSPを変更する。 PF,PL,LR,SPR,をスタックから取り出し設定する。SPも変更する。 PCにLRを代入する。 |
| CALL | CALL SymbolTableIndex(u16) | LRにPCを代入する。 SymbolTableIndexが示す関数の先頭バイトコードをPCに設定する。 |
| CALLVF | CALLVF SReg1 ConstantTableIndex(u16) | Call Virtual Function. SReg1が指すオブジェクトの仮想関数の先頭バイトコードを求め,PCに代入する。 ConstantTableIndexが示す先にはSymbolTableIndex(u16)が2つ連続して存在する。 1つめは仮想関数の親となるSSObjectTypeが格納されているSymbolTableのIndex。 2つめは仮想関数自体のSSFunctionが格納されているSymbolTableのIndex。 |
| スタック | ||
| PUSH | PUSH SReg ConstantTableIndex(u16) | ConstantTableIndexが指す定数サイズ(u32)減算し,指定のSRegに演算後のSPを設定する。 |
| POP | POP ConstantTableIndex(u16) | ConstantTableIndexが指す定数サイズ(u32)分,SPを加算する。 |
| オブジェクト | ||
| OBJNEW | OBJNEW SReg SymbolIndex | Object New. 指定のSymbolIndexが指すObjectTypeのインスタンスを作成し,ハンドルをSReg1に代入する。 |
| OBJDEL | OBJDEL SReg | Object Delete. 指定のSRegが指すオブジェクトに対してdeleteする。 |
| OBJRFI | OBJRFI SReg | Object Reference Increment. 指定のSRegが指すオブジェクトのリファレンスカウンタをインクリメントする。 |
| OBJRFD | OBJRFD SReg | Object Reference Decrement. 指定のSRegが指すオブジェクトのリファレンスカウンタをデクリメントし,SRegに0を代入する。 |
| デバッグ | ||
| DLINE | DLINE ConstantValue(u24) | Debug Line. デバッグ情報のプログラム行数を代入するための命令。 PLにConstantValueを代入する。 |
| DFUNC | DFUNC SymbolTableIndex(u16) | Debug Function. デバッグ情報の関数オブジェクトを代入するための命令。 PFにSymbolTableIndexが示すアドレスを代入する。 |