てきとうなさいと べぇたばん

コンピュータシステムの理論と実装 アセンブラ

アセンブラ

ついにコンピュータシステムの理論と実装も、後半を迎えることになった。ハードウェアの頂から、ソフトウェアへと向かう。その最初の一歩がアセンブラだ。

アセンブラとは、アセンブリ言語を機械語に変換するプログラムのことである。

実装

アセンブラの実装はどのような言語を使用して実装してもよいことになっているので、今回はPython3.4を使用した。多分、2系でも動くと思うがそこら辺はわからない。

モジュールとなっている部分は無難にクラスにしておいた。

方法

まず、シンボルのないアセンブリをアセンブルするところから始める。この場合は、シンボルテーブルは必要はないはずで、ParserとCodeモジュールさえあればA命令とC命令に対応することができる。

ところが、シンボルを含むアセンブラになると話は別。シンボルテーブルという、シンボルのアドレスを記録するモジュールが必要で、なおかつ、変数も追加でテーブルに入れる必要がある。こうなると、ちょっとこったことをする必要がある。

こったこととは、アセンブリファイルを2度に分けてすべてを読み込んで行くということだ。1度目は(Xxx)という擬似コマンドをみたらアドレスを格納する。A命令やC命令が出てきたらアドレスを1増やす。そうすることで、ジャンプ先がわかるのである。2度目はプログラムのパースである。1度目で行ったシンボルの探索から、再び@Xxxという形で出てきたらそのアドレスを格納する。シンボルテーブルに格納されていない@XxxというC命令が出てきた場合、それは変数であるので、シンボルテーブルへアドレス16番から格納する。

ソースコードはgithubへ

アセンブル

以下のコマンドでProg.hackという機械語がProg.asmと同じディレクトリにできている。

$ python3.4 assembler.py Prog.asm

所感

なんか、Python(LL言語)で作ったせいか、今までと比べて困難だとは思わなかった。インタプリタを作る際も、グローバル変数や関数などがあるためテーブルが必要で2パス必要だったし、その経験が活きているのだろうか。

次はVMかぁ

この次はVirtual Machineの話になる。どんどんソフトウェアの山を抽象化しながら駆け上がっていくことになる。たのしみだなぁ。