2011-01-17 4 views
0

私は心に問題があります。ジャンプ命令はEIPレジスタに符号付きオフセットを追加して変更するためです(IA-32アーキテクチャでは間違いがない限り) 0x7FFFFFFF(符号付き論理で最大の正数)から0x80000000(符号付き論理では負の数が最小)まで可能ですか?あるいは、サインされたロジックの性質上、そのようなジャンプがあってはならないでしょうか?ジャンプする場合がありますか?

答えて

5

符号付きと符号なしは、同じビットパターンを解釈する2つの方法です。この解釈は、加算の実行方法を変更しません。 7FFFFFFF + 1は常に80000000ですが、これは符号付き(負の数)または符号なし(正の数)として解釈できます。

命令ポインタは常に符号なし(明らかに否定的なアドレスは意味を持たない)と解釈されるので、あなたの質問に答えます。

+0

0x7FFFFFFFを符号付き(+2147483647)として扱っていても、0x7FFFFFFF + 1は常に0x80000000であることを繰り返すだけで、この加算を行うとオーバーフローして-2147483648(0x80000000) – user470379

2

実際には相対ジャンプは署名されていません。ジャンプ命令からの番号は単にEIPに追加されます。したがって、32ビットのアドレス空間のどこにでもジャンプすることができます。

例:EIPが20で、4にジャンプする場合は、jmp 0FFFFFFF0hを使用します。この大きな数はEIPに追加され、実際には16を引くと同じです。

7FFFFFFFhから80000000hにジャンプするには、ジャンプ1を使用します。:-)しかし、あなたのアドレスは重複するので、プラクティスでは役に立たない。

また、加算と減算のロジックはすべて符号に関係なく機能します。相対ジャンプを含む操作は常に同じです。

1

「フラット」アドレッシングモードのため、アドレスはx86では署名がありません。 intelデベロッパーマニュアルのアドレッシングモードセクションでこれを扱い、すべての非/条件付き相対ジャンプのセクションにも言及するかもしれませんが、整数オーバーフローのために動作するでしょう。

関連する問題