0

私は現在、asm のようなカスタム プログラミング言語用のコンパイラを作成していますが、データ ラベルに対して適切な PC 相対アドレス指定を行う方法について、本当に混乱しています。

main    LDA RA hello
        IPT #32
        HLT

hello   .STR "Hello, world!"

上記の疑似コードは、コンパイル後に次の 16 進数になります。

31 80 F0 20 F0 0C 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 00

3180F020およびF00CLDAIPTおよびHLT命令です。

コードに見られるように、LDA命令はラベルhelloを引数として使用します。これは、コンパイルされると、「インクリメントされた PC + 0x02」を意味する value になります (コードを見ると、呼び出し02に関連する「Hello, world!」行の場所です。問題は:ではありません命令は、実行可能ファイルの最後に (0 で終わる) 文字列を追加する必要があることをコンパイラに伝えるだけなので、ラベル宣言の後に他の命令があった場合、そのオフセットは間違っています。LDA.STRhello

しかし、コンパイラが時間を移動できるようにする以外に、正しいオフセットを計算する方法が見つかりません。2回「コンパイル」する必要がありますか? 最初にデータ ラベル、次に実際の指示ですか?

4

1 に答える 1