Трудовая дисциплина Крис Касперски aka мыщъх Хакер, номер #088, стр. 088-114-1 Делаем из не пойми какого ассемблерного сорца нормальный и рабочий код В Сети лежит множество ассемблерных листингов, но большинство из них находится в сильно разобранном состоянии и… не транслируется! Как причесать код, внедрить его в свою программу, выбрать правильный транслятор и ключи командной строки – обо всем этом и поведает мыщъх в этой статье, заодно прогнав пару-другую оффтопиковых телег. Свою программистскую карьеру мыщъх начинал с микрокомпьютера "Правец-8D", оснащенного экзотической версией Бейсика и нехилым руководством с кучей конкретных примеров (правда, на болгарском языке). Процесс освоения языка происходил приблизительно так: набрал программу, запустил... Помедитировал над листингом. Попробовал что-нибудь изменить. Запустил. Посмотрел на реакцию. Осмыслил. Изменил еще раз. И вот так, шаг за шагом разобрался во всех операторах языка и научился писать эффективные программы, в которых нет ничего лишнего. Ассемблер на этот трюк не поддался, так как исходные тексты программ, нарытые в различных журналах и книгах, не транслировались, а те, что транслировались, не работали. Позже я узнал, что это были не программы, а всего лишь их фрагменты. Отсутствие законченного фундамента, на который было бы можно опереться, отбросило мыщъх'а далеко назад, и к ассемблеру он вернулся только с приобретением компьютеров Электроника БК (ака PDP-11) и Агат (ака Apple 2). Большое количество разнообразных программ существенно упрощало их изучение, а знакомство с монитором повергло мыщъха в настоящий культурный шок - ничего подобного на Правце не было. "Монитор" - это не "телевизор", а программа такая - прообраз отладчика. Переход на IBM PC оказался довольно болезненным, а x86-ассемблер не похожим ни на что изученное до него. Хоть общие параллели и имелись, освоить его тихим сапом у мыщъх'а не получилось. Пришлось брать штурмом. В debug.com. Дизассемблирование (командой u) чужих программ давало мнемоники инструкций, которые вводились в ассемблерном режиме (команда a), а затем изучалось воздействие на флаги, регистры и память. Этот увлекательный процесс растянулся на многие месяцы, но даже когда мыщъх вполне уверенно сочинял ассемблерные программы в тысячу строк, трансляция чужих ассемблерных программ по-прежнему представляла для него проблему. Поэтому мыщъх будет писать предельно доступно и без лишнего выпендрежа (зато с краткой биографией. - Прим. Горлума под 4 психоактивными веществами). [такие разные ассемблеры] Ассемблер - это не только язык, но еще и транслятор. То, что язык PDP-11 не пригоден для x86, - это понятно, но вот несовместимость ассемблерных трансляторов друг с другом для многих становится новостью. Что составляет фундамент ассемблера как языка? Мнемоники машинных команд (mov, nop, cmp) – это раз. Средства самого языка (метки, директивы, макросы) - это два! Формально за мнемоники отвечают Intel и AMD. Именно они дают символические имена машинным командам, регистрам, флагам и т. д. Большинство x86-ассемблеров придерживаются этой нотации (хоть она никем и не стандартизирована), однако "большинство" - это еще не все. В мире *nix широко распространен AT&T синтаксис, отличающийся не только мнемоникой, но даже порядком операндов! Здесь операнд-приемник расположен не слева, как у Intel, а справа!!! Регистры начинаются со знака процента, константы - со знака доллара, а инструкции имеют суффикс, соответствующий типу обрабатываемых данных. На языке Intel пересылка в регистр eax значения 666h выглядит так: "mov eax,666h", а на AT&T так: "movl $666h,%eax". Как говориться, почувствуете задницу. |