以下のIntel命令でアドレス_0x600860
_はどのように計算されますか? _0x4003b8
_ + _0x2004a2
_ = _60085a
_なので、計算がどのように実行されるかわかりません。
0x4003b8 <puts@plt>: jmpq *0x2004a2(%rip) # 0x600860 <[email protected]>
Intelでは、JMP、CALLなどは、next命令のプログラムカウンタに関連しています。
あなたの場合の次の指示は0x4003be
、および0x4003be + 0x2004a2 == 0x600860
これは、メモリ間接のAT&T構文です [〜#〜] jmp [〜#〜] RIP相対アドレッシングモードを使用します。
ジャンプアドレスは、命令ポインタに対して指定されたメモリ位置からフェッチされます。最初に_0x4003be + 0x2004a2 == 0x600860
_を計算し、次に位置_0x600860
_からジャンプするアドレスをフェッチします。
他のアドレッシングモードも可能です。たとえば、ジャンプテーブルで使用できます。jmpq *(%rdi, %rax, 8)
、RDIのテーブルベースとRAXのインデックス。
ただし、静的データのRIP相対アドレス指定は一般的です。この場合、動的リンクによって設定されたGOT(グローバルオフセットテーブル)のエントリをアドレス指定しています。