Как интерпретировать код операции вручную? - PullRequest
12 голосов
/ 16 мая 2011
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?

Ответы [ 4 ]

28 голосов
/ 16 мая 2011

Здесь у нас есть трехбайтовая инструкция: 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 голосов
/ 16 мая 2011

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

1 голос
/ 09 ноября 2013

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

поэтому здесь mod =01, то для reg eax значение равно 000, а для (R / M) значение равно 101

, поэтому 8 битов поля R / M равны

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

1 голос
/ 16 мая 2011

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

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

...