18

次のオペコードを使用して短いジャンプを行いたいとします。

EB CB または JMP rel8

「ジャンプ ショート、RIP = RIP + 64 ビットに拡張された 8 ビットの変位符号」

(ここで、CB は、EIPレジスタの方向に関連する相対オフセットを表すバイト符号付きの値です)

この短いジャンプの実行時間 (参照方向) の EIP は 2 バイト命令のベースであるため、オフセットは常にオフセット + 2になる可能性がありますが、加数は常に発生します。

eb 30 = jmp 0x00000032 (+30)

eb e2 = jmp 0xffffffe4 (-30)

fe + 2 は00またはEIPであるため、EIP は意図的に同じ方向にすることができます。

eb fe = jmp 0x00000000

数値が負であるにもかかわらず、オーバーオフセットが分岐して発生したことは驚くべきことです。しかし、インテルでは言及がありません (おそらく 3000 ページのため)。

インテル® 64 および IA-32 アーキテクチャー・ソフトウェア・デベロッパーズ・マニュアル: Vol. 2A 3-423

ジャンプ範囲が現在のEIP 値から-128 ~ +127 に制限されているニア ジャンプ。

次に、次の 3 つの可能性を考えます。

  1. は実行時の EIPの前後の値であるため、+2 です。
  2. コード化された値は、2 のコンポーネントでエンコードされた符号付き数値ではありません。
  3. 説明書に載ってるけどバカだから見てない
4

3 に答える 3

19

ショートジャンプであろうとなかろうと、それは常にdestination - (source + sizeof(instruction)).

すなわちdst - end_of_jmp

あなたの場合(ショートジャンプ)sizeof(instruction)は2です。

この追加の背後にある理由は、CPU が命令フェッチ ステージを実行すると、命令ポインターが既に分岐後に来る命令を指しているという事実によるものです。rel8 または rel32 ブランチの変位は、その EIP/RIP 値に関連しています。

于 2013-02-15T07:13:23.837 に答える
18

これrel8は、次の命令のメモリアドレスに関連しています。これは、2つの実行可能ファイルを作成し、それらを逆アセンブルすることで簡単に確認できます。

@label:
    jmp @label
    nop

これは次のように分解されます(ndisasmを使用すると、16ビット、32ビット、および64ビットのコードで同じです):

EBFE jmp short 0x0
90   nop

次に、別の実行可能ファイル:

    jmp @label
@label:
    nop

EB00 jmp short 0x2
90   nop

したがって、rel8は常に。の後の次の命令を基準にしてエンコードされjmpます。ただし、逆アセンブラ(少なくともndisasmおよびudcli)は、jmp命令自体に関連して表示します。それはおそらくいくつかの混乱を引き起こす可能性があります。

于 2013-02-15T10:55:57.293 に答える
6

jump short は、ジャンプ命令の最後(2 バイトの長さ) に関連する EIP を取り、符号拡張されて EIP に追加される 1 バイトのオペランドを取ります。

于 2013-02-15T07:15:27.800 に答える