私はアセンブリのテストのために勉強していますが、「位置独立コード」の主題で、相対ジャンプと絶対ジャンプの違いがわかりにくいと感じています。ジャンプの種類をどうやって見分けるのですか?
相対ジャンプとは何か(現在の行からのオフセット)を理解しています。しかし、絶対的なジャンプはどのように見えるでしょうか? それはいつ起こりますか?
私はアセンブリのテストのために勉強していますが、「位置独立コード」の主題で、相対ジャンプと絶対ジャンプの違いがわかりにくいと感じています。ジャンプの種類をどうやって見分けるのですか?
相対ジャンプとは何か(現在の行からのオフセット)を理解しています。しかし、絶対的なジャンプはどのように見えるでしょうか? それはいつ起こりますか?
単純に見えるものjmp label
はすべて相対的です。
絶対ジャンプは次のようになります
jmp register
jmp [address]
jmp segment:absoluteaddr
jmp far [address]
遠方ジャンプは絶対的であり、間接的ジャンプは絶対的であり、組み合わせ (遠方、間接) も絶対的です。ファージャンプは必要な場合にのみ発生します (変更する必要がcs
あり、それは ではありませんcall
)。間接ジャンプは、関数ポインタ、分岐テーブル (ステートメントに使用される場合もありますswitch
)、動的ディスパッチ (仮想メソッド)、およびインポートされた関数 (通常はそれらを呼び出しますが、テール コールである可能性があります) に使用されます。
私が思い出したことから、コードが位置に依存しない場合に使用される相対ジャンプ(コードは特定のメモリ範囲にロードされることを期待していません。たとえば、動的にロードされるdllライブラリ)。したがって、このコードのすべてのブランチは、ジャンプ先の正確なアドレスを知っていると仮定することはできませんが、ブランチ IP とターゲット IP の間の相対オフセットを知っていると想定できます)。
絶対ジャンプはターゲットの正確なアドレスを取得し、コードに静的アドレス空間がある場合に使用されます。
それが役に立てば幸い、