前方参照とパス

ソースファイルのより後の方で定義されている名前を、より前の方から参照することを「前方参照」と呼びます。前方参照は普通のプログラムでよく起こる現象です。

次に前方参照の例を示します。

    JMP    A
    JMP    B
A    LABEL    NEAR
B    LABEL    FAR

基本的に、LASM はソースファイルを前から順に読み出しつつ機械語コードへ変換して行きます。しかし前方参照が存在するために、ソースファイルを前からひととおり読み出すだけでは十分ではありません。前方参照を考慮したアセンブルには、論理的に次の 3 段階が必要です。

1 段階

ソースファイルで定義されているすべての名前について、その種類やタイプを調査します。たとえば「A は NEAR タイプのラベルである」とか「X は定数 10 である」といった情報が得られます。

2 段階

各コードとデータのサイズを計算し、すべてのラベルの位置を決定します。コードサイズの計算には、第 1 段階で得た情報が必要になることがあります。

3 段階

第 1 段階、第 2 段階の情報に基づいて、機械語コードを決定します。

以上の論理的な 3 段階を物理的な 1 回のソースファイル読み出しで行うことは無理があり、LASM はソースファイル読み出しを 2 回以上繰り返して行います。この読み出しのことを「パス」といい、最初の読み出しを「パス 1」、2 回目の読み出しのことを「パス 2」のように呼びます。

パス 1 では、LASM は論理的な第 1 段階と第 2 段階をまとめて行います。第 2 段階の作業は、第 1 段階の情報がそろっていないと完全に行えない場合がありますが、このようなときは適当な仮定を行ってラベル位置を決めてしまいます。

パス 2 では、パス 1 における仮定のラベル位置が正しかったかどうか検証しつつ、論理的な第 3 段階を行います。

パス 1 におけるラベル位置の仮定がすべて正しかった場合は、これでアセンブルを終了することができますが、そうでない場合(フェーズエラーの場合)はさらにパス 3 を行って第 3 段階をやり直します。

このようにしてすべてのラベルの位置が確定するまで、LASM は繰り返しパスを行います(マルチパス方式)。

ほとんどの場合、ソースファイルの書き方さえ工夫すれば、アセンブルはパス 2 で終らせることが可能であり、その方がアセンブル時間が短縮されます(アセンブルオプション/O によりジャンプ命令の最適化を指定した場合は、パスの回数が増える傾向があり、この限りではありません)。

アセンブルをパス 2 までで終らせるためには、次の点に注意しながらソースファイルを作成してください。

なお、アセンブルオプション/P を指定すれば、発生したフェーズエラーの情報を得ることができます。

[目次]