daisuzz.log

"コンピュータシステムの理論と実装 第6章 アセンブラ" を読んだ

「コンピュータシステムの理論と実装」を読んだメモを書いていきます。

前回は↓

iikanji.hatenablog.jp

メモ

シンボルテーブル

  • シンボルとメモリアドレスの組が書かれたテーブル

アセンブリ言語

シンボル

  • メモリアドレスを参照する記号
  • goto 7goto weightと表記した場合weightはシンボルとなる
  • 変数やラベルとして利用する
  • 変数やラベルが作られた段階でシンボルテーブルに変換情報を追加
  • Hackでは@sum(LOOP)のように使われている

アセンブラ

  • アセンブリ言語機械語に変換する
  • 生成した機械語はメモリに読み込まれてハードウェアが実行する
  • アセンブラの処理の流れ
    • アセンブリ構文解析して、各領域ごとに分割する
    • 各領域ごとに対応するバイナリを生成する
    • シンボルによる参照を実際のメモリアドレス(数値)に置き換える
    • 領域ごとに生成したバイナリを組み合わせて機械語を生成する

実装

自分の好きな言語で書けるようなので、Kotlinでアセンブラを実装しました。 ソースコードは以下。 github.com

感想

  • Kotlin(Java)のファイル入出力周りの実装は毎回ググらないと思い出せないので大変だった(Kotlinのファイル入出力のきれいな書きかたを知りたい)
  • Kotlinのsubstring系のメソッドがとても便利なことを知った(substringBefore, substringAfter, substringBeforeLastなど)
  • シンボルテーブルの作成を行なう際に(Xxx)のシンボルのアドレスの処理でハマってしまった(疑似コードはバイナリを生成しないので、疑似コードの行はROMアドレスにカウントしないことを忘れていた)
  • 書籍に書かれていたHackの仕様は条件分岐が多かったりmutableな設計になっているので、immutableに直してみると設計の練習にもなりそう

次章はこちら

iikanji.hatenablog.jp