Как интерпретировать код операции вручную?

77f4bcbc 8945fc          mov     dword ptr [ebp-4],eax

И вот правило:

88  /r   MOV r/m8,r8       2/2           Move byte register to r/m byte
89  /r   MOV r/m16,r16     2/2           Move word register to r/m word
89  /r   MOV r/m32,r32     2/2           Move dword register to r/m dword

Как интерпретировать 8945fc - mov dword ptr [ebp-4],eax?

Ответ 1

Здесь мы имеем трехбайтную инструкцию: 89 45 fc. Первый байт - это байтовый код операции. Посмотрев его в таблице, мы видим, что это инструкция MOV, и он принимает байты Mod R/M. Байт Mod R/M имеет следующий макет:

 7  6   5  4  3   2  1  0
+-----+---------+---------+
| Mod |   Reg   |   R/M   | 
+-----+---------+---------+

Посмотрим на второй байт инструкции. 0x45 - 01.000.101 в двоичном формате. Таким образом, Mod - 01, Reg - 000, а R/M - 101.

Взгляд в ссылке, например. здесь, мы видим, что комбинация Mod = 01 и R/M = 101 соответствует операнду [EBP + sbyte]. "Sbyte" - это 8-разрядное смещение, которое закодировано в третьем байте: 0xFC. Поскольку смещение подписано, оно должно интерпретироваться как такое число, то есть -4.

Замечание "/r" рядом с инструкцией говорит нам, что регистр (второй) операнд задается регистром Reg инструкции. Reg = 000 - al/ax/eax. Предполагая 32-битный режим по умолчанию, это будет означать eax.

Соблюдая все вышесказанное, получим

MOV [EBP-4], EAX

Ответ 2

89 - это код операции
 45 кодирует источник и назначение
 fc - смещение (-4)

Ответ 3

Если вы хотите написать свой собственный дизассемблер, здесь - это то, что вам нужно.

Для краткого резюме посмотрите здесь

Ответ 4

найдите mov dword ptr [ebp-4], eax, у вас есть 8 бит кода. Вы можете легко получить его вот процедура первые шесть бит даны или должны быть сохранены в памяти для команды mov, а затем добавить в LSB бит назначения (D), где d = 1, когда в пункте назначения находится регистр или d = 0, когда регистр находится в источнике. Здесь регистр eax находится в исходной стороне, поэтому следует добавить 0, а затем последний бит, который называется бит слова (бит W), добавляется в сторону LSB после бита адресата, где W бит = 1, когда имеется регистр 16/32 бит или 0, когда есть 8-битный регистр, поэтому теперь согласно команде "mov dword ptr [ebp-4], eax"
бит d = 0 и w бит = 1 теперь вы получаете 8 бит кода операции то вам нужно найти поле MOD (R/M). для этого вам нужно выяснить 3 вещи. 1) значение мод 2) значение регистра 3) Значение R/M вот формат + ----- + --------- + --------- + | Мод | Reg | R/M | + ----- + --------- + --------- + как упоминалось выше затем проверьте команду mov dword ptr [ebp-4], eax есть 8-битное смещение в соответствии с -4, тогда значение мод = 01 МОДНЫЕ ЗНАЧЕНИЯ: 00 без смещения 01 для 8-битного смещения 10 для 16-битного смещения 11 для регистрации для регистрации передачи

так что здесь мод = 01 тогда для reg eax значение 000 и для (R/M) значение равно 101

так что поле бит R/M 8 бит

01000101 надеюсь, что это описание поможет