Я использую дизассемблер (SmartDec: http://decompilation.info/) и многие инструкции в сгенерированная разборка выглядит примерно так:
mov rax, [rip + 0x32b5]:64
Я не знаком с :64
частью этой инструкции. Что это означает?
Другие примеры:
cmp [rcx + r8 * 0x8]:64, 0x0
mov eax, [rip + 0x592a]:32
jmp [rip + 0x6bad]:64
Этот дизассемблер не показывает соответствующий машинный код, поэтому я воспользовался шестнадцатеричным редактором и посмотрел адрес, по которому, по его словам, находилась эта инструкция:
1665: mov rax, [rip + 0x19a4]:64
Вот что там было, 16 байт, в Little Endian:
54 00 00 49 89 E8 FF 15 DC 5F 00 00 E9 57 FF FF
a4
или19
байт в машинном коде. Возможно, ваш дизассемблер на самом деле не имеет в виду RIP+, и на самом деле он означает, что абсолютный адрес0x19a4
адресован относительно RIP. Но в любом случае54
не является опкодом дляmov
.49 89 ...
– это REX.W=1mov r/m64, r64
(хранилище), если только эти байты являются частью (а не началом) другой инструкции. Я бы рекомендовал использовать другой дизассемблер (например,objdump -drwC -Mintel
) для сравнения в будущем. - person Peter Cordes   schedule 30.12.2017