x86-64 での JMP の最初の形式は次のとおりです。
Opcode Instruction Description
EB cb JMP rel8 Jump short, RIP = RIP + 8-bit displacement sign
たとえば、JMP rel8=-2
ですeb fe
。 fe
1 バイトの符号付き 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 相対アドレッシングは次の命令に関するものであるため、アセンブラは現在の命令のサイズを調整する必要があります。