pp.108-109
ファーストパス:
行番号の順に1行ずつ最初から最後までアセンブリプログラム全体を見てゆきます。行番号は0から始めて、A命令またはC命令の見つかったときに1増やしますが、コメントまたはラベル宣言のときには増やしません。ラベル宣言(xxx)
の見つかるたびに、新たなエントリをシンボルテーブルに追加します。これによって、シンボルxxx
と(現在の行番号+1)とが関連づけられます。この(現在の行番号+1)が、プログラムにおける次回命令のROMアドレスであるということです。
ファーストパスのときは、プログラムのラベルシンボルとそれぞれの値とをすべてシンボルテーブルに追加します。図6.1ではファーストパスの結果として、LOOP
、STOP
という2つのシンボルがシンボルテーブルに追加されました。ファーストパスのときはコードは一切生成しません。
セカンドパス
再度プログラム全体を最初から見てゆきながら、次の手順で各行の構文解析をします。シンボル参照を持つA命令(@xxx
という形をしていて、xxx
の部分が数値ではなく記号である命令のこと)の見つかるたびに、シンボルテーブルにxxx
がないかどうかを検索します。目的のシンボルが見つかった場合は、そのシンボルを数値に置き換えて命令の変換を実行します。シンボルが見つからなかった場合は、新たな変数を設けなければなりません。そのための手順として、(i)シンボルテーブルに{xxx:値}
というエントリ(値
は、変数用に指定されたRAM空間にある空きアドレスのこと。アドレスの若い順に埋めてゆく)を追加し、(ii)追加したアドレスを使って命令の変換を実行します。Hackプラットフォームの場合、変数を格納するためのRAM空間は、16から始まって、新たな変数がコードに見つかるたびに1ずつ増えます。図6.1では、セカンドパスの結果として、i
、sum
という2つのシンボルがシンボルテーブルに追加されました。