код операции x86: sib byte - PullRequest
       25

код операции x86: sib byte

4 голосов
/ 13 августа 2010

Я сейчас пытаюсь написать дизассемблер.Я нашел следующий список кодов операций и их значения, поэтому я решил проанализировать его во время выполнения: http://mprolab.teipir.gr/vivlio80X86/pentium.txt

Но я застрял в коде операции 0x00: за ним следует регистр / modbyte.Разбор это не было большой проблемой для меня.Но у меня возникли проблемы с байтом Scale-Index-Byte: если вы на самом деле указываете esp как регистр индекса, это фактически означает, что индексный регистр отсутствует.То же самое относится и к базовому регистру с помощью ebp.Но я попробовал это с встроенным ассемблером c ++: можно скомпилировать: «add [ebp * 2 + ebp], cl»

Так как же использовать ebp в качестве базового регистра при использовании ebp в качестве основного регистрана самом деле означает вообще не использовать базовый регистр!?

1 Ответ

6 голосов
/ 13 августа 2010

Случай «отсутствующего EBP» применяется только в том случае, если поле ModR / M.Mod имеет двоичное значение 00.Если вам нужен EBP в качестве базы, ассемблер изменяет Mod на двоичный 01 и добавляет 8-битное смещение со значением ноль:

004C6D00 add [ebp + ebp * 2], cl

...