OSECPUのバイトコードの詳細仕様
(0) はじめに
(1) 整数レジスタ
- OSECPUは32bitの signed int な整数レジスタを64本持っています。
- R00~R3F と表記します。
- R00やR01など番号の若いレジスタは、実際のCPUの実レジスタに割り当てるように推奨されているので、R00への代入やR00の値の参照は、R20に対する操作と比べて数倍高速になることが多いです。
- 結局どうなるかは処理系依存で、保障はされていません。
- ということで、特にこだわりがないのならR00やR01を使いましょう。
- ちなみにx86版では、R00~R02までが実レジスタに割り当てられていて、残りはメモリを使ってレジスタをエミュレーションしています。
- これらのレジスタはすべて対等で汎用的に使われるというわけではなく、ある程度の使い方が決まっています。これに逆らってはいけないということはないですが、ライブラリなどで食い違うといろいろ面倒かもしれません。
- R00~R1F (32本) : 最も汎用的な整数レジスタで、通常は関数ごとにローカルとして扱えます。つまり関数を呼び出しても破壊されたりはしません。
- R20~R27 ( 8本) : 汎用ですが、関数ごとにローカルというわけではなく、グローバル変数的に使うことを想定しています。関数呼び出しによって変更される可能性もあります。
- R28~R2F ( 8本) : これも汎用ですが、関数ごとにローカルではなく、グローバル変数的に使われます。主にOSが用途を決定しています。これに対してR20~R27はアプリが自由に用途を決定できます。
- R30~R3B (12本) : 基本的にはこれらも汎用なのですが、関数の引数を渡したり、返値を入れたりするためにも使われるレジスタで、値が破壊されやすいです。ASKAでは複雑な数式を計算しなければいけなくなると、R3BやR3Aをテンポラリとして勝手に使い、値を破壊してしまうこともあります。R39やR38まで手をつけることだってあります。しかし最悪でもR30までで、R2Fに手出しすることはありません。
- R3C~R3E ( 3本) : 将来の拡張のためにリザーブされています。
- R3F ( 1本) : 後で説明する特別な用途のための整数レジスタです。汎用には使えません。
(2) フラグレジスタ
- x86でもARMでも、さらに6502やZ80でも、みんなフラグレジスタというものを持っていました。
こめんと欄