私は現在、カスタムasmのようなプログラミング言語 のコンパイラを作成していますが、データラベルの適切なPC相対アドレッシングの方法については本当に混乱しています。アセンブリ言語のコンパイラでのPC相対アドレッシング
main LDA RA hello
IPT #32
HLT
hello .STR "Hello, world!"
上記の擬似コードは、コンパイル後、次のヘクスで結果:
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
を引数として使用します。コンパイル時に値が02
になります。これは "Incremented PC + 0x02"を意味します(LDA
コールに対する相対的な "Hello、world!"行のコードを参照してください) 問題は次のとおりです。 .STR
は命令ではなく、コンパイラに実行可能ファイルの末尾に(0で終了する)文字列を追加する必要があるため、hello
ラベル宣言後に他の命令があった場合、そのオフセットは間違っています。
しかし、私は正しいオフセットを計算する方法を見つけることができません。コンパイラが時間を遡って実行できるようにすること以外は、2回コンパイルする必要がありますか?まず、データラベルの場合は実際の手順?
'hello'の宣言に対するオフセットは、' .STR'変数の後の命令によっては変更されません。 – kdopen