ES-VMバイトコード用のコンパイラ #1

  • (by K, 2020.06.29)

(1)

  • 最初にWindows用、x86(32bit)用のコンパイラをできるだけ手抜きで書いてみよう。
  • 性能はそれなりにしかならないけど、でもとにかく早く作れる。
  • そして後日、本気でまともなやつを作ればいい。
  • まず原則として、コンパイラの中で方針が一貫していれば、他に規定される規約はない。だから自由に作れる。

(2)

  • 関数呼び出し規約など
    • evdecl
      • esvm間で普通に用いられる呼び出し規約(コンパイラで決めていい)
      • 基本としてはreturn値以外は一切の実レジスタを破壊しない。voidなら何も破壊しない。
      • return値が一つの実レジスタで表現できないビット幅の場合、追加の第一引数としてポインタを要求する。そのポインタを使って結果を返す。
    • cdecl
      • Windowsのx86(32bit)の標準的な呼び出し規約に準ずる

(3) サンプルコード

  • chars
    evdecl void chars()
    {
      int8 i;
      i = 0x20;
    lp:
      putchar(i);
      i++;
      if (i != 0x7e) goto lp;
      return;
    }
    
    // バイトコードで書くと・・・
    (00:reg0, 01:0x20, 02:0x7e, 03:$0, 04:0x01)
    [...] [17 01 00] [01] [17 00 03] [05 7000] [14 04 00] [21 02 00 00] [ret]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-07-01 (水) 00:55:33 (1d)