Skip to content

boletales/symasm_public

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

これはなに

  • 嘘のアセンブリに対する、嘘のコード生成ライブラリ
  • purescript製

嘘のアセンブリってなんだ

  • 0番地から始まる1MBのメモリ空間をもつ仮想機械用の仮想アセンブリ
  • 仮想機械の各メモリ番地には32bit符号付き整数が格納される
  • 仮想機械のメモリ番地0はプログラムカウンタである
  • 仮想機械は標準入出力として32bit整数を出し入れする
  • アセンブリ中で、即値は[数値]、アドレスに対する参照は@[アドレス]、参照に対する参照は@[参照]と表される
  • @は何個つけてもよい(ゆとり仕様)
  • 命令は以下の通り(以下、[値]は即値ないし参照を指すものとする)
    • _ ←なにもしない
    • ! [値] ←引数を標準出力に書き込む
    • ? [参照] ←標準入力を1文字よみとり、参照先に書き込む
    • : [参照] [値] ←参照先に値を書き込む
    • ~ [参照] [値] ←参照先に値のbitwise notを書き込む
      • or - or * or / or % [参照] [値] [値] ←四則演算
    • & or | [参照] [値] [値] ←bitwise and/or
    • { or } [参照] [値] [値] ←左右のシフト演算
    • < or > or = [参照] [値] [値] ←2値の比較でその等式/不等式が成立していれば1, さもなくば0
  • /data/*/cmds.sasm に例を載せた

どんな手法でコード生成してるの

  • メモリの先頭20番地ぐらいまでをレジスタとしてつかうことにした
  • それ以降のメモリ番地を互い違いにヒープ・スタックに割り当てた
    • アドレスの演算が非常に大変であり、こんなことをすべきではない
  • 二段階の抽象レイヤーを用意した
    • 一段階目:制御構造・式・変数・関数・コールスタックについての抽象化
      • このレイヤーのコンパイルは、上から順に抽象化した各処理を書き下し、生成されたコード長の情報を用いてifやwhile・関数呼び出しのジャンプ先を適切に設定することで行った
      • ifやwhileといった制御構造を追加した
      • 式の概念を導入し、評価してスタックに積むことができるようにした
      • コールスタックを用意し、フレームを積んだりreturnしたりできるようにした
      • 変数についてある程度の抽象化を行い、「n番目のstatic変数」「n番目のスタック変数」「番地nのヒープ変数」「レジスタx」という形で指定できるようにした
  • 二段階目:関数名・変数名・型・モジュールについての抽象化
    • このレイヤーのコンパイルは、変数をかき集めて適切な番号を振り、関数の依存関係を整理することで行った
    • 型クラスの魔法でDSLっぽいことをできるようにした

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published