JMP absaddr
64 ビット モードでは、絶対アドレスへのフォームのジャンプはありません。ジャンプのオペランドは、常に に対する 32 ビットの相対変位rip
であり、符号が 64 ビットに拡張されます。
一貫性が見られない理由は、オフセットが現在の命令ポインターに依存している可能性があり、それを認識していない可能性があります。
jmp eax
もちろん、64ビットアーキテクチャではアドレスは常に64ビット幅であるため、これも許可されていません。シーケンスmov rax, addr + jmp rax
が可能です。次のようになります
48 c7 c0 35 08 40 00 mov rax, 0x00400835
ff e0 jmp rax
また
48 b8 35 08 40 00 00 00 00 00 mov rax, 0x0000000000400835
ff e0 jmp rax
これらの 16 進コードをどのようにして知りましたか? さて、私は自分のコンパイラに尋ねました。でコンパイルしgcc -c
、逆アセンブルしましobjdump
た。Intel 構文は必要ないので、あえて使用しませんでした。つまり、これは AT&T 構文です。
echo 'asm("mov $400835, %rax\n jmp *%rax\n");' > test.c
gcc -c test.c
objdump -d test.o