第三世代OSASKの仮想CPUの仕様
- (by K, 2013.02.27)
- (osask.netに書こうと思ったんだけどパスワードを忘れて新規ページが作れない。メモを見つけるまでこっちに書いておく)
仕様
- 整数レジスタ 256bit 16本(64本にするかも)
- アドレスレジスタ 16本(64本にするかも)
- フラグレジスタはない
- 割り込み命令も持たない
- ただし割り込み要求が来ているかどうかを調べるポーリング命令はある
- 割り込みが来ていれば分岐する
- MOV系の命令のみ、メモリオペランドがある
- MOV系の命令のみ、即値を指定できる
- JMP命令はなく、インストラクションポインタへのMOVで代用する
- ほとんどの演算命令は三項形式である。(例)reg0=reg1+reg2;
- CMPとSETccが合成されたような命令がある。
- CMPcc(reg0, reg1, reg2);
- reg1とreg2を比較してccが真ならreg0は-1になる、偽なら0になる。
- つまり整数レジスタをフラグレジスタの代用にしているともいえる。
- 条件分岐命令は用意されていない。代わりに条件プリフィクスはある。ARMを想起すると分かりやすい。
- 条件プリフィクスはコンディションを指定する代わりに整数レジスタを指定する。整数レジスタのbit0が1であれば後続の命令は実行される。
補足
- レジスタ本数が異様に多いのは、命令セット上、演算系の命令で定数を指定できないためである。そのため常に0を入れておくレジスタや常に1を入れておくレジスタがほしくなるだろう。そういう定数のために使われるレジスタを考えたら、16本では不足することが予想される。
- レジスタのbit長が256bitもあるが、それぞれの命令には(整数演算であっても)有効数字というものがあり、もしこれが16bitを指定していれば、下位16bitが正しく計算されることを保障し、より上位については未定義になる。これによりプログラムは必要な有効数字で計算をすればよく、過剰な演算量になることはない。
- 整数レジスタは、AXがALとAHに分割されるみたいな機能はない。ARMと同じである。