4

x86-64 での JMP の最初の形式は次のとおりです。

Opcode    Instruction  Description
EB cb     JMP rel8     Jump short, RIP = RIP + 8-bit displacement sign

たとえば、JMP rel8=-2ですeb fefe1 バイトの符号付き 2s-compliment -2 です。

Intel 構文でこの rel8 即時を表現するにはどうすればよいですか?

私は次のことを試しました:

test.s:

.intel_syntax noprefix
.global _start
_start:
    jmp -2

コンパイル:

$ gcc -nostdlib test.s
$ objdump -d -M intel

しかし、私は得る:

   e9 00 00 00 00           jmp    5 <_start+0x5>

eb fe希望どおりではありません。

(より一般的には、Intel の構文はどこに文書化されていますか? Intel のマニュアルでそれについて何も見つけることができませんでした。Intel のマニュアルではオペランドをエンコードする方法について説明していますが、アセンブリ言語の構文については説明していません。)

アップデート:

解決策は次のとおりです。

.intel_syntax noprefix
.global _start
_start:
    jmp .

.現在の命令のアドレスを表す必要があります。それを組み立てて分解すると、次のようになります。

4000d4: eb fe      jmp    4000d4 <_start>

eb fe望んだ通りに。RIP 相対アドレッシングは次の命令に関するものであるため、アセンブラは現在の命令のサイズを調整する必要があります。

4

1 に答える 1

4

(G)AS.は、他のほとんどのアセンブラとは異なり、現在のアドレス (現在の命令のアドレス) を示すために使用されているようです。

ドキュメントのここにそれを文書化する小さなページがあります

于 2013-11-03T10:26:12.463 に答える