48 8b 05 cb 01 20 00 mov 0x2001cb (% rip),% rax
48 - это REX prefix
, который обычно используется для указания того, что операнды инструкции (регистры или память)местоположения) должен быть 64-битным вместо 32-битным (т.е. RAX вместо EAX в этой инструкции).Префиксы REX также используются в инструкциях, управляющих регистрами R8 - R15.
8b
- это инструкция MOV opcode
.Другие значения используются для других инструкций.Например, 2b означало бы SUB, а 8d означало бы LEA.
05
- это байт ModR/M
, который в 64-битном режиме обозначает RIP+disp32
адресацию памяти (вместо просто disp32
в32-битный режим).Это кодируется в битовых полях Mod
и R/M
байта.Битовое поле Reg
этого байта дополнительно указывает использовать регистр RAX для другого операнда.
cb, 01, 20 and 00
образует часть disp32
операнда памяти, и это смещение равно 2001CBH
.
Собрав все это вместе, мы получаем MOV RAX, [RIP+2001CBH]
.
Существует несколько способов декодирования инструкций:
- вручную с использованием руководств по процессорам от Intel или AMD
- с автономным дизассемблером, например,
ndisasm
, который поставляется вместе с NASM - с вашим любимым отладчиком;просто поместите байты интересующей инструкции где-нибудь в памяти программ (вы можете ввести их) и попросите дизассемблер показать вам разборку расположения этой инструкции