15

JMP 機械語命令の 16 進コード変換について疑問があります。「JMP 0x400835」など、ジャンプしたい絶対アドレスがあります。まず、これは許されますか?はいの場合、対応する 16 進コードは何ですか? そうでない場合は、最初にEAXなどのレジスタにアドレスを保存してから、「JMP EAX」を入力できますか? x86(64b) アーキテクチャに取り組んでいます。

gdb の diassem 出力から 16 進コードを出力しようとしましたが、一貫性がありません。つまり、16 進コードに宛先アドレスが表示されません。

私は 16 進コードと機械命令に慣れていないので、無知であることをご容赦ください。

4

2 に答える 2

35

JMP absaddr64 ビット モードでは、絶対アドレスへのフォームのジャンプはありません。ジャンプのオペランドは、常に に対する 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
于 2012-03-22T09:44:54.190 に答える