Ответ 1
Нет никакого перехода формы 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
Как я узнал эти шестнадцатеричные коды? Ну, я спросил своего компилятора. Я скомпилирован с 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