Ассемблер под Windows №25

Декодирование команд процессора


Доброго времени суток, уважаемые подписчики.


В сегодняшнем выпуске мы вернёмся к дизассемблеру, так как менеджер памяти находится в доработке (даже в разработке, так как всё ещё ищется оптимальный вариант). Чтоб не переписывать всё 25 раз (а только 5;) нужно сначала определить, что же мы всё-таки хотим писать. Я считаю, правильнее будет пока не забегать вперёд и определиться с данными декодировщика (команда, длинна, смещение и т.п.), причём вид хранения пока не имеет особого значения, главное решить вопрос о получении этих данных. Я опишу процесс декодирования потока как я его вижу, и буду ждать ваших отзывов на эту тему.
- Самые простые команды: Получив указатель на команду программа должна проверить не является ли команда однобайтной, для этого нам понадобится следующее: таблица однобайтных команд, процедура поиска байта в таблице байт. Всё это достаточно легко реализовать, поэтому идём дальше.
- Регистровые однобайтные: В этом случае статическая команда занимает 5 бит, следовательно нам нужно сделать то же, что и в первом пункте, но предварительно обнулив младшие 3 бита.
- Команда условного перехода: Их используется так много, что я думаю следует сделать отдельную проверку этой команды. Проверяются старшие 4 бита.
- Команды, код которых расширен в r/o: Здесь должна быть таблица байт, которые являются первым байтом команд, расширенных в r/o, после находки этого байта, должно быть проверено поле r/o, и уже на его основе будет установлено имя команды.
- расширенные команды: очень много команд (включая половину команд 386-го процессора) имеют в статической части команды "перфикс" OFh, найдя его программа должна заметить, что это расширенная команда и выполнить действия всех предыдущих пунктов, использую другие таблицы!
- Команды FPU: и последним действием, я считаю должна быть проверка принадлежности команды к командам FPU.
В принципе все эти проверки можно произвести пользуясь одной и той же процедурой. При входе процедура получает указатель на таблицу элементов (первое слово кол-во элементов, далее элементы одинаковой длинны(1-4 байт)), длину элемента(1-4) и значение для сравнения. Процедура поочерёдно сравнивает элементы с полученным значением и, в случае идентичности, возвращает индекс элемента(1-65535), если элемент с соответствующим значением не найден, то процедура возвращает 0. Так как единственный способ научиться что-либо делать - это практика, предлагаю вам написать эту процедуру. Будем использовать процедуру, занимающую меньше всего места. Следует учитывать, что регистры eax,ebx,edi,esi,ebp(,esp) не должны изменяться!


На сегодня это всё. Если есть какие вопросы, пишите. Пишите на Dark_Lord@RusFAQ.ru или Dark_Lord@land.ru.
Или свяжитесь со мной по ICQ, мой номер 126222874!

Сайт управляется системой uCoz