Obj файлы на топчане или...

>>> Врезка "не ассемблируется aam 16"


После выхода первой статьи этого цикла, на хакерском форуме читатель с ником realstudent задал предметный вопрос из которого выяснилось, что во-первых, у него не ассемблируется инструкция "aam 16" (но это мелочи, сейчас докурим и ее обломаем), и, во-вторых, "секреты ассемблирования дизассемблерных листингов" (в девичестве) превратились в "сношение с идой". Вот такая трава растет на широте Москвы!

А само сообщение (и ответ на него) выглядели так:

> есть древнее приложение - программер микрухи через LPT

> (очень напрягает он своей работой) но без сырцов,

> и твоя статья пришлась очень в тему. а тема такая:

> решил восстановить его и дописать если возможно.

> пользовался IDA 5.x (лицензионная, ясное дело!) и

> MASM 9.0 (тоже лицензионный, с митино).

> все ошибки убил кроме одной и в чем ее смысл

> никак не могу понять (в асме я нормально разбираюсь,

> смотрел другие  исходникик на koders.com - все у людей также,

> был на microsoft.com - но так и не понял к чему эта ошибка здесь).

> не ассемблируется строка "aam 16"

> - error A2008: syntax error : integer (блин

это последняя ошибка!)

> по мануалам от Intel'а команда поддерживает аргумент

> (в смысле команда правильная), а вверху листинга у меня торчит:

>..686p

> ;.mmx

> ..model large, C

без измен, мужик! только без измен! это она по спецификациям ассемблируется, но только разработчики ассемблера спецификации читают по диагонали, и у них на этот счет имеется свое, особое мнение, которое умом не понять, а в свете того, что Microsoft озаботилась разработкой собственного процессора, сдается мне, что x86 коллектив разработчиков не осилил, что совсем не удивительно, если вернутся на десяток лет назад и вспомнить, что Microsoft не могла разобраться в разработанных ею же спецификациях на расширенную память и драйвера забивали косяки только так.

но это была лирика. что же касается сути проблемы, то она обходится методом "ну и не ассемблируется... ну и хрен с ней...". вставляем директиву DB и записываем инструкцию непосредственно в машинных кодах.

в данном случае это выглядит так: "DB 0DBh, 10h", где DBh – опкод команды AAM, а 10h — непосредственный операнд. та же самая история наблюдается и с командой AAD (да и не только ей), опкод которой D5h и в машинной форме она вызывается так: "DB D5h, XXh".



Содержание раздела