4

私は Jack Crenshaw のコンパイラ チュートリアルに従っています (私のプロフィールを見ると、それが私の質問のすべてです笑) 変数が導入されるところまで来ました。彼は、68k ではすべてが「位置独立」である必要があるとコメントしています。つまり、「PC 相対」です。PC はプログラム カウンターで、x86 では EIP です。しかし、彼はMOVE X(PC),D0X が変数名であるような構文を使用します。私は少し先を読みましたが、.data で変数を宣言することについて後で何も述べていません。これはどのように作動しますか?これを x86 で機能させるには、X(PC) を何に置き換えMOV EAX, X(PC)ますか?

正直なところ、これで動作するコードが出力されるかどうかはまだわかりませんが、この時点までは、適切なヘッダーなどを追加するコードと、アセンブル、リンク、および実行するバッチ ファイルをコンパイラに追加しました。結果。

4

2 に答える 2

4

多くのプロセッサは、PC 相対または絶対アドレッシングをサポートしています。

ただし、X86 マシンでは次の制限があります。

  • ジャンプと呼び出しは常に PC 相対です (レジスタベースを除く)
  • 他のアドレスは常に絶対アドレスです (レジスタベースを除く)

PC 相対アドレッシングを実行できる C コンパイラは、次の方法でこれを実装します。

  CALL x
x:
  ; Now address "x" is on the stack
  POP EDI
  ; Now EDI contains address of "x"
  ; Now we can do (pseudo-)PC-Relative addressing:
  MOV EAX,[EDI+1234]

これは、メモリ内のコードのアドレスがコンパイル/リンク時に不明な場合 (Linux の動的ライブラリ (DLL) など) に使用されるため、変数のアドレス (ここではアドレス "x+1234" にあります) は不明です。まだ知られています。

于 2013-08-26T15:54:02.463 に答える