2011-01-18 9 views
0

8ビットまたは16ビットのオフセットを使用するジャンプの場合、IA-32アーキテクチャでは、EIPレジスタにそのオフセットを追加すると、オフセットにも一致するビットを持たないEIPのビットに影響する可能性がありますそれともオフセットのビット数のオフセットにマッチするEIPレジスタの一部の追加に似ていますか?ジャンプ命令での8ビットまたは16ビットオフセットの加算はどのように行われますか?

答えて

1

add eip,xxxのような操作について言えば、それは32ビットの追加であり、1つのオペランドがより狭くなることを心配する必要はありません。

更新 - これは実際には相対JMP命令に関する事実を見逃していました。これに対する答えは、相対ジャンプオフセットオペランドのサイズについて心配する必要はなく、ジャンプが適切に機能するということです。ここで

は、現在のIntelのドキュメントです:

http://www.intel.com/products/processor/manuals/

+0

私はJMP命令についてはADDではありません。 – Pooria

+0

なので、0x8888のような16ビットのオフセットでジャンプしてEIPレジスタに追加するのは、32ビットの0x00008888オフセットでジャンプしてEIPに追加するのとまったく同じですか? – Pooria

+1

さて、0x8888は負の数なので、0xffff8888の32ビットの相対ジャンプを行うようになりますが、それはあなたが作成しようとしているポイントではないと思います。 0x44の相対ジャンプは、0x0044と0x00000044のいずれかと同じです。あなたが大きなジャンプとプロテクトモードの操作に入ると、他にも多くの問題がありますが、ここではそれらについて心配する必要はありません。 –

0

ショートジャンプはEIPと8ビットまたは16ビット(または32ibt)との間にのみ追加されている即値を締結しました。新しいEIPが正しいコードアドレスで開始されない場合、例外が発生します。命令セット・リファレンス*

近くとショートジャンプ:インテルから

。 がジャンプすると、プロセッサは ターゲットオペランドで指定された アドレス(現在のコード セグメント内)にジャンプします。ターゲット・オペランド は、絶対オフセットを指定 (その コードセグメントのベースからのオフセットである)または相対(EIPレジスタ内の命令 ポインタの現在の値に署名された変位相対) オフセット。 A付近の は、8ビットの相対オフセットにジャンプします。 (rel8)は、ショートジャンプと呼ばれます。 およびショートジャンプでCSレジスタが変更されません。絶対オフセットは、 汎用レジスタまたはメモリ ロケーション(r/m16またはr/m32)に間接的に指定された です。オペランドサイズの属性 は、対象オペランドのサイズ( ビット)を決定します。絶対オフセットは をEIPレジスタに直接ロードします。 オペランドサイズ属性が16の場合、 EIPレジスタの上位2バイト がクリアされ、最大 命令ポインタサイズは16ビットになります。 A 相対オフセット(rel8、rel16、または rel32)は、アセンブリコードの ラベルとして一般的に指定されますが、 マシンコードレベルでは、 符号付き8,16,32ビット即値としてエンコードされます 値。この値は、EIPレジスタの の値に加算されます。 (ここで EIPレジスタには、 命令の次の命令のアドレス が含まれています)。相対的な のオフセットを使用する場合、 のオペランドと、オペランドサイズの アトリビュート(近接相対ジャンプの場合) は、対象のオペランド(8,16、または32ビット)のサイズを決定します。

関連する問題