* ES-VMバイトコード暫定仕様#1
-(by [[K]], 2020.07.17)

** (0)
-(註)ここは確定情報ではないので何度も修正します。

** (1) 基本構造
-1つの関数は以下の2ブロックに分かれています。
--宣言ブロック
--コードブロック

** (2) 宣言ブロックについて
-ここでローカル変数、使用する定数、関数の引数などの様々な情報を記述します。
|RIGHT:0x1|宣言ブロックを終了して、コードブロックへ移行します。|
|RIGHT:0x2|変数の基本ビット数を変更します。後続の引数の4倍が設定されます(2なら8bit、8なら32bit、16なら64bitなど)。|
----
-デフォルト設定:
--基本ビット数:32bit
|オペランド番号||
|RIGHT:0x00-0x0f|基本ビット数の整数レジスタ|
|RIGHT:0x10-0x1f|偶数:ポインタレジスタ、奇数:アクセス権レジスタ|
|RIGHT:0x20-0x27|整数定数: 0, 1, 2, 3, 4, 5, 6, 7|
|RIGHT:0x28-0x2f|整数定数: 8, 15, 16, 31, 32, 63, 64, 127|
|RIGHT:0x30-0x37|整数定数: 128, 255, 256, 511, 512, 1023, 1024, 2047|
|RIGHT:0x38-0x3f|整数定数: 2048, 4095, 4096, 8191, 8192, 0x3fff, 0x4000, 0x7fff|

** (3) コードブロック
|RIGHT:0x1||ローカルラベル宣言。||
|RIGHT:0x2|a,b|代入命令。 a=b||
|RIGHT:0x3|a|ローカルラベルへのgoto。|aはオペランド番号ではない。|
|RIGHT:0x4||プリフィクス。||
|RIGHT:0x10|a,b|OR演算。 a|=b||
|RIGHT:0x11|a,b|XOR演算。 a^=b||
|RIGHT:0x12|a,b|AND演算。 a&=b||
|RIGHT:0x14|a,b|加算命令。 a+=b|プリフィクス4をつけると、a=b+cにできる。|
|RIGHT:0x15|a,b|減算命令。 a-=b||
|RIGHT:0x16|a,b|乗算命令。 a*=b||
|RIGHT:0x21|a,b,c|条件分岐。if(a!=b)goto c|cはオペランド番号ではない。ローカルラベル番号の相対値。|
|RIGHT:0x3f||関数終了。||

** コンパクトオペランド案
** (4) コンパクトオペランド案
-たとえば、代入命令の最初のオペランドに定数は来ない。だからそれにナンバーをふらずにコンパクトにしたオペランド番号を使わせることはできる。
-ビット演算や加算命令や乗算命令は、可換なので、1番最後以外に定数が来ないなどの制約を設けることができる。
-まあこれは面倒になるのでフロントエンドコードかな

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS