Win32 в машинных кодах


           

M следует байт, значение которого


Если MOD=01, за байтом ModR/ M следует байт, значение которого добавляется к значению соответствующего регистра и таким образом вычисляется адрес операнда. При MOD=10 за ModR/M следуют уже 4 байта; значение этого числа тоже суммируются со значением соответствующего регистра для вычисления адреса.
Присутствие байта ModR/M обычно требует также наличия битов d и w. Рассмотрим еще одну команду:
100010 d w
При d=0 данные перемещаются из регистра, закодированного в REG, в регистр или память, определяемые по R/M. При d=1 наоборот - из R/M в REG. Составим, например, инструкцию для копирования данных из EAX в EBX. Сначала "составим" байт ModR/M: оба операнда в регистрах, поэтому MOD=11; 1-й операнд в EAX - REG=000; 2-й операнд в EBX - R/M=011; итого - 11000011 (C3). Опкод: полные регистры - w=1; копирование от REG к R/M - d=0. Итоговая инструкция - 10001001 11000011 (89 C3).
Теперь фишка: 1-й операнд в EBX (REG=011), 2-й - в EAX (MOD=11, R/M=000), бит d установим (1). Итог: 10001011 11011000 (8B D8) - но эта инструкция делает абсолютно то же самое, что и предыдущая! На ассемблере обе инструкции записываются одинаково: MOV EBX, EAX. Аналогичные примеры можно привести с инструкциями (A1 78 56 34 12) и (8B 05 78 56 34 12), (89 D7) и (8B FA) и т.д. Проверьте! Да и сами вы теперь сможете составить кучу таких же. А что делают инструкции (88 E4) и (8A C9)?
Это характерная особенность работы с машинными кодами. Подобные этим трюки могут использоваться для создания защит и антиотладочных приемов. Между тем даже ассемблер генерирует для подобных команд лишь один вид кода, тем самым значительно вас обкрадывая, не говоря уже о компиляторах с языков высокого уровня.
Только не надо пугаться и думать, что при программировании в машинных кодах все время придется делать выбор из сотен возможных вариантов. На самом деле в Win32-программировании постоянно будут встречаться одни и те же инструкции, так что мы их помимо своей воли выучим наизусть. Хотя в этой статье оказалось много разнообразного материала, вы можете считать его одой свободе и богатству выбора, которую несут с собой машинные коды. В будущих статьях мы непременно сможем убедиться, насколько простым может быть программирование под Windows в машинных кодах, особенно если вы сумели уловить логику построения инструкций.

Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий