私は現在、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
3180
、F020
およびF00C
はLDA
、IPT
およびHLT
命令です。
コードに見られるように、LDA
命令はラベルhello
を引数として使用します。これは、コンパイルされると、「インクリメントされた PC + 0x02」を意味する value になります (コードを見ると、呼び出し02
に関連する「Hello, world!」行の場所です。問題は:ではありません命令は、実行可能ファイルの最後に (0 で終わる) 文字列を追加する必要があることをコンパイラに伝えるだけなので、ラベル宣言の後に他の命令があった場合、そのオフセットは間違っています。LDA
.STR
hello
しかし、コンパイラが時間を移動できるようにする以外に、正しいオフセットを計算する方法が見つかりません。2回「コンパイル」する必要がありますか? 最初にデータ ラベル、次に実際の指示ですか?