IA-32アーキテクチャでは、ジャンプ命令が符号付きオフセットを追加してEIPレジスタを変更するため(ここで間違いを犯していない場合)、IA-32アーキテクチャでは、場所0x7FFFFFFF(符号付き論理で最大の正数) から 0x80000000 (符号付き論理で最小の負数) は可能ですか? または、署名付きロジックの性質上、そのようなジャンプがあってはならないのでしょうか?
3 に答える
符号付きと符号なしは、同じビット パターンを解釈する 2 つの方法にすぎません。この解釈は、加算の実行方法を変更しません。7FFFFFFF + 1 は常に 80000000 ですが、これは符号付き (負の数) または符号なし (正の数) として解釈される可能性があります。
命令ポインターは常に符号なしとして解釈されるため (明らかに負のアドレスには意味がありません)、それがあなたの質問に答えます。
相対ジャンプは実際には署名されていません。ジャンプ命令からの番号は単に EIP に追加されます。したがって、32ビットアドレス空間のどこにでもジャンプできます。
例: EIP が 20 で、4 にジャンプしたい場合、jmp 0FFFFFFF0h を使用します。この大きな数は EIP に追加されますが、これは実質的に 16 を減算することと同じです。
7FFFFFFFh から 80000000h にジャンプするには、ジャンプ 1 を使用します。:-) ただし、アドレスが重複するため、実際には役に立ちません。
また、すべての加算および減算ロジックは符号に関係なく機能することに注意してください。相対ジャンプを含め、操作は常に同じです。
x86 では、アドレス指定モードが「フラット」であるため、アドレスは署名されていません。intels 開発者マニュアルのアドレッシング モード セクションでこれをカバーする必要があり、すべての無条件/条件付き相対ジャンプのセクションでも何かが言及されている可能性がありますが、整数オーバーフローが原因で動作します。