Дневники чайника. Чтива 0, виток0
Знакомство с MASM32 и Win32-программированием
Мне приходит довольно много писем с просьбами рассказать о MASM’е больше. И я решил слегка переделать эту главу.
Кроме того, я уже написал справочные статьи для тех, кто не застал времена MS-DOS. Если интересно, загляните в следующий виток
Как получаются программы?
До сих пор мы писали все примеры в Hiew’e, но этот способ крайне извращенный. Я использовал его только для того, чтобы вы увидели настоящий Асм. Вначале очень трудно отличить высокоуровневые наслоения от самого языка Ассемблер, и некоторое время я сам путал команды процессора и директивы.
Но теперь, когда вы видели язык во всей его наготе, можно слегка приодеть его.
Нормальные программы пишут в обычном текстовом виде, а не как мы раньше (каждую строку сразу транслировали в машинную команду). Такой текстовый вид называется исходным, а файлы — исходниками, или сырцами (от английского source).
Текст исходника можно писать где угодно, хоть в Ворде (при установленном фильтре простого текста). На вкус, на цвет. Я пишу в RadAsm’e. Это целая среда для разработки приложений, очень удобно. Однако на первых порах рекомендую писать просто в редакторе Far’а, можно подключить к нему специальный плагин Colorer. Этот плаг подсвечивает синтаксис многих языков программирования. Но всё это не обязательно. Тут каждый сам себе берлогу выстилает.
Когда исходный текст набран и сохранён, его можно компилировать.
За процесс получения готовой программы отвечает компилятор, и состоит этот процесс из двух основных этапов.
- Исходный текст преобразуется в промежуточный файл. Это делает транслятор (в случае с MASM’ом он называется ml.exe).
- Затем создаётся готовый исполняемый модуль в определённом формате. То есть программа. Это делает линковщик (в случае с MASM’ом он называется link.exe).
Значит, для того чтобы делать программы, нужно иметь текстовый редактор и компилятор, который состоит из двух основных частей — транслятор и линковщик.
Всё остальное не обязательно, однако реальные программы Win32 используют внешние функции, стандартные константы и переменные, ресурсы и много другое. Всё это требует дополнительных файлов, которые мы и видим в.
MASM32 SDK
Это очень распространённый пакет, собранный Стивеном Хатчисоном (Hutch).
Важно понять, что MASM32 вовсе не компилятор, а сборник для программирования под Win32, в который входит 32-битный компилятор MASM.
Сегодня (С наступающим, 2012-м, годом!) я использую пакет MASM32 версии 10.
Описывать всё, что входит в пакет MASM32 SDK, — не вижу смысла. Лучше сосредоточиться на самом компиляторе.
Матрос, мы сегодня выходим из гравитационного пояса Солнечной системы. Перед гиперскачком нужно проверить и настроить всё оборудование.
Из чего состоит компилятор MASM?
Основных файлов всего два:
ml.exe — транслятор. Он преобразует исходный текст в obj-файл (объектного формата COFF или OMF),
link.exe — линковщик. Создаёт готовый исполняемый exe или dll модуль (в формате для DOS, Windows. ).
Эти файлы включены в основной состав MS Visual Studio (и в .NET).
При желании можно скачать в открытом доступе самые новые версии вместе с Visual Studio Express (или в обновлениях) на сайте MS.
Правда, я не вижу в этом особого смысла (в следующем витке описана причина).
Установка и настройка MASM32
Ну, для начала хорошо бы его иметь. Можно скачать с wasm.ru или с сайта автора.
1. Перед установкой отключите чрезмерно бдительные антивирусы (Каспер в первую очередь).
2. Устанавливать пакет советую на тот диск, где будут ваши исходники.
Теперь полезно прописать в системе путь к файлам компилятора.
В Win7 это можно сделать так:
В меню «пуск» правый клик на «Компьютер» > Свойства > Дополнительные параметры системы > закладка «Дополнительно» > Переменные среды.
Здесь в списке системных переменных нужно изменить значение переменной «PATH». Дописать в конце строки:
(не пропустите точку с запятой и вместо «D» укажите букву диска на котором установлен MASM32).
Поскольку редактор исходных файлов Quick Editor я не использую (уж больно он убогий), на этом можно считать подготовку MASM32 к работе завершенной.
Было бы неплохо знать, как вообще проходит процесс написания программы. Здесь я могу рассуждать только теоретически, так как сам не написал еще ни одной серьёзной программы. :))) Однако кое-что об этом знаю и с радостью поделюсь своими представлениями.
Реальный процесс разработки программы
Знающие люди говорят, что это творческий процесс. Из чего можно сделать вывод, что дело это крайне личное.
Но общие правила здесь тоже имеются.
- Постановка задачи
- Создание алгоритма (в той или иной степени)
- Кодирование на конкретном языке
- Попытка компиляции. Если счетчик ошибок не ноль, прыг на шаг 3 или даже 2
- Удивление, что оно хоть как-то заработало
- Если счетчик найденных ошибок не ноль, то прыг на шаг 1
- Я пока так оставлю, а потом ещё доделаю
- Если обстоятельства (обычно лень) не позволяют продолжить — проект умирает. Или на шаг 1
Примерно так я делал небольшую программку для личного пользования.
Научить вас ставить задачи я даже пытаться не буду, сам не умею.
Создавать алгоритмы вас научит Кнут, это его стихия, а я могу только восхищаться.
Дональд Эрвин Кнут — Великий Автор, его трёхтомник можно взять на сайте int3.net (после регистрации). Мне кажется, человек, который не читал Кнута, программистом себя называть не имеет права (сам я, кстати, тоже не читал :).
А если серьёзно, то абсолютное большинство существующих учебников и литературы о программировании не может выжить и семи лет, потому что такие книги ориентированы на изучение возможностей того или иного языка (как мои статьи). Кнут же на протяжении полувека(!) учит создавать реальные программы, а не оболочки для простого ввода/вывода. Думаю, вы поняли, что его книгу хорошо бы купить. Цена, правда, хорошая, но трёхтомник того стоит.
Итак, вернёмся к бренной жизни.
Кодирование на конкретном языке — вот о чем мы тут толкуем. Правда не надо забывать, что программа ещё должна работать под конкретной системой.
Win32
Многие считают, что мир форточек устроен по законам Майкрософт, но это лишь очень поверхностный взгляд. Как бы ни старались специалисты этой конторы, они тоже вынуждены подчиняться правилам Intel. Так что главное отличие DOS-среды от Windows — это то, что последняя опирается на защищённый режим процессора (Protected Mode — PM).
Кардинальное отличие PM от Real Mode — новый (довольно хитрый) механизм работы с памятью, и он сильно изменил жизнь программистов.
Win32 использует страничную адресацию памяти, которая является надстройкой над сегментной адресацией защищённого режима.
Несмотря на то, что работа с памятью в PM устроена сложно и запутанно, внешне всё выглядит элементарно. По крайней мере в Windows адресацию сделали довольно удобной.
В данном случае советую всем начать именно с внешнего осмотра. Ну если, конечно, вы самые смелые, самые умные и уже готовы разбирать всё по винтикам изнутри, тогда берите учебник по i80386 процессору и читайте про селекторы, таблицы дискрипторов, разбирайтесь, как в PM при страничной адресации формируется физический адрес из линейного. Лучше, конечно, начать с рассылки Broken Sword’a.
Но что-то мне подсказывает, что вам пока рано браться даже за популярное изложение особенностей PM :).
Сам я уже год как пытаюсь подступиться к этой теме, просветление уже где-то рядом.
Внешний осмотр Win32.
Что же мы имеем после загрузки форточек:
- Каждая программа загружается в собственное изолированное виртуальное адресное пространство (Виртуальное Пространство Процесса).
- Адреса в таком ВПП могут быть от 00000000 до FFFFFFFF (4Gb), будем называть их виртуальными.
- При загрузке и далее при выполнении в эту виртуальность проецируется всё необходимое для работы программы (код и данные операционной системы, динамические части самой программы, файлы и т.п.).
- Программа, кроме собственных вычислений, практически ничего самостоятельно сделать не может. Ей приходится просить ОС вывести что-либо или предоставить в её ВПП. Для этого она вызывает нужные API-функции.
- Файлы с машинным кодом и данными у Win32-программ устроены в соответствии с PE-форматом, который довольно сильно связан с особенностями защищённого режима процессора.
Исполняемые файлы PE-формата делятся на секции. Должна быть минимум одна секция (секция кода), но файл может иметь и другие секции для разных целей (данные, ресурсы, служебные секции и т.д.).
А ещё нужно знать, что в защищённом режиме существуют 4 уровня привилегий. Нулевой самый сильный, 3-й самый слабый. Эти уровни называют кольцами (ring0,1,2,3).
Win32 использует только ring0 для ядра и драйверов и ring3 для прикладных программ.
Таких поверхностных данных вполне достаточно, чтобы мы могли дальше разумно изучать программирование на Ассемблере, и приступить к программированию WinAPI.
По крайней мере сам я о защищённом режиме и о том, как его используют форточки знаю немногим больше :(.
Так что будем учиться вместе.
Первый пример Windows-программы
Давайте рассмотрим, как может выглядеть маленькая программа для Win32, написанная под MASM.
Языка Ассемблер здесь нет! Этот текст будет преобразован в запускаемый файл формата PE (Portable Executable — портируемый exe-формат). То есть стандартную программу для форточек.
Попробуйте набрать в файл «prax05.asm» все эти строки, большая часть которых, кстати сказать, — директивы MASM’a.
. Хотя это как раз можно и не набирать, ещё успеете натыкаться :), возьмите мой файл.
Компилировать программу новичку проще всего так (читатели меня всё-таки убедили =):
1. Открыть редактор исходных файлов «Quick Editor» (икона «MASM32 Editor» на рабочем столе).
2. Открыть или набрать в нём пример.
3. После всех изменений обязательно нужно сохранить пример и обязательно на тот диск где установлен MASM32.
4. Для самой компиляции нужно выполнить пункт меню Project > Build All.
5. Должно появиться консольное окошко с отчётом компилятора (если консоли нет, значит, по какой-то причине компиляции не было).
Запустить пример можно из того же Quick Editor’a кнопкой «Run File» или пунктом меню Project > Run Program.
Если вы планируете работать с компилятором на разных дисках, то самый грубый, но быстрый и универсальный, способ решить проблему компиляции – тупо скопировать папку MASM32 в корень всех дисков, где будет проходить компиляция программ.
Хочу предостеречь юные умы от выражений типа «иконка открывает MASM».
В корне неправильные слова влекут неправильные выводы и действия.
Ещё раз обращаю ваше внимание: MASM – это компилятор, он состоит из двух частей (ml.exe и link.exe). Обе части не имеют другого способа общения с пользователем кроме как через командную строку. А иконка на рабочем столе открывает программу-посредник под названием «Quick Editor», которая для компиляции всего лишь запускает файл build.bat.
И тут мы переходим к следующему уровню пользования компилятором.
Другой способ компиляции программ — использовать файл build.bat без посредника (описание в следующем витке).
В командной строке ОСи (В Far’e внизу или в «Пуск > Все программы > Стандартные > Командная строка») набираем следующее:
! Разумеется, текущей папкой должна быть папка с исходником.
! Имя файла в командной строке пишите без расширения.
! Расширение у файла должно быть asm.
! файл должен быть на диске с пакетом MASM32 в корне.
После нажатия Enter вызовется бат-файл. Его задача превратить текстовый файл (исходник) в готовую программу (бинарник). Для этого он выполняет ml.exe с параметрами
Если в исходнике нет явных ошибок, появится файл prax05.obj. И далее выполнится link.exe, который и создаст готовую Win-программу.
На выходе мы имеем два файла. Один — объектный, он нам не пригодится, это для нас промежуточный файл. Второй — exe, сами знаете, что с ним делать.
Ошибки будут — это я гарантирую. Опечатки обычно быстро находятся, так как компилятор сообщает тип ошибки и строку, которая её вызывает.
Однако это далеко не всегда означает, что ошибка именно в этой строке. Тут нужно головой думать. Подозреваю, что она у вас работает хорошо, раз мы с вами добрались до Windows. Но если у вас недостаточно знаний пользователя и из-за этого не собирается даже пример prax05.asm, — не расстраивайтесь. Прочитайте главу следующего витка. Должно помочь и уж, по крайней мере, поднимет ваш «уровень юзера». Да, да, у вас всё получится.
Поздравляю, матрос! Мы в гиперпространстве.
Полноценная программа для Windows. Её уже не исследуешь в CodeView. Для отладки форточных программ мы запаслись OllyDbg.
Хорошо бы настроить и его (цвета, шрифты, размер и пути в ini-файле). Это у вас займёт некоторое время, ко всему надо привыкнуть. Я всё-таки надеюсь, вас не испугает такая небольшая программка весом в 2Mb, ведь вы наверняка настраивали и более навороченные приложения. Кроме того, недавно хорошие ребята, потрудившись наславу, сделали русский help, который можно взять тут.
Спасибо: deNULL, HyPeR, name, Wenden.
И ещё есть вводная статья Bit-hack’a http://cracklab.ru/art/ollydbg.php, за что ему тоже огромное спасибо.
Exe-файл формата PE содержит кучу всякой ерунды, которая, впрочем, необходима для запуска Win32-программы. Сложного там ничего нет, позже вы скорее всего познакомитесь с устройством PE-формата, а сейчас нужно понять лишь одно. На начало исполняемого кода программы в памяти указывает Entry Point (EP — точки входа). В разных программах она может указывать на разные адреса. Но в простых примерах, собранных build.bat’ом, адрес первой команды будет 401000h. Значение EntryPoint в таком случае будет = 1000h, плюс Image base 400000h = 401000h.
Про PE-формат мы, наверное, ещё поговорим, и даже очень плотно, ну а сейчас.
Откройте prax05.exe в OllyDbg. Для этого достаточно загрузить Olly и открыть программу как обычный документ в форточках. После работы Win-загрузчика Олли покажет вам первую инструкцию в окне кода (ориентируясь именно на EP). Исследовать этот пример вам пока не надо, через регистры здесь слишком трудно разобраться.
- В верхней левой части — вся программа, которая выводит на экран сообщение типа Message Box. Вы видите, нет ни одной строчки из исходного файла prax05.asm, потому что это уже Ассемблер!
- Вверху справа — регистры процессора (заметьте, EBX стоит четвёртым, рядом с регистрами-указателями, и флаги выглядят по-другому). Как я уже сказал, регистры селекторов (сегментные регистры ES-GS) нас не волнуют, даже не обращайте на них внимание.
- Внизу слева — байты памяти (Olly сразу же показывает секцию данных программы).
- Внизу справа отображается содержимое стека (о нём следующая глава).
Нужно заметить, несмотря на то, что Ollydbg выглядит как обычная программа, это всё-таки отладчик и у него есть свои ограничения. Рекомендую, например, закрывать его каждый раз, как вам понадобится загрузить новую программу.
Мы узнаем, как работает этот пример, но прежде остановимся на исходнике.
Весь код из исходника, кроме двух строк, будет во всех программах Win32 под MASM’ом, поэтому вы должны знать, что он означает. Но не воспринимайте это слишком серьёзно. Там будет много длинно-умных слов. За такими словами очень часто прячется дребедень.
Хочу, чтобы вы поняли одну простую вещь. Совсем скоро вы будете знать команды Асма, и если вы поймёте основы программирования, а затем познаете интерес математики :), то каждый из вас сможет написать собственный компилятор для программ Ассемблера, возможно, не хуже MASM’a или FASM’a. Вы сможете сами придумывать всякие директивы, псевдокоманды, макросы, плагины и новые удобные фишки. Но команды процессора — совсем другое дело. Кроме того, что они в процессоре и изменить их нельзя (уточнение), большинство из команд имеет под собой математическое основание, заложенное в структуру цифровых технологий. Поэтому приоритет нужно отдавать в пользу команд процессора. А директивы MASM’a и все страшные слова за ними воспринимайте поверхностно. Я бы вообще не объяснял их (как Калашников в первых уроках), если б не знал, как сильно отвлекает внимание новичка непонятная строка в исходнике.
Теперь можно приступать к разбору этих самых директив.
Писать каждый раз такой код заново не надо. Это каркас программы для форточек. Мало того, к этому каркасу будут добавляться такие же постоянно повторяющиеся вещи. Создали один раз файл-заготовку — и далее можно вписывать туда только полезный код.
Я уже не раз говорил, что после точки с запятой идёт комментарий. Значит, MASM такую информацию не воспринимает. Можно писать всё что хочется.
Это директива, указывающая компилятору, что в программе будут использоваться команды процессора i80x386.
В exe эта информация записывается в самом начале после заголовка PE. Если интересно, найдите в exe-файле буквы PE. Потом идут два нулевых байта, так как заголовок PE — это dword (4 байта). В следующем слове (двух байтах) как раз и будет информация о командах процессора, которые используются программой. Всё, от 386-го до сегодняшних 32-битных Intel-совместимых процессоров, обозначается кодом 014Сh. Для нас такая информация бесполезна, а вот директива «.386» обязывает нас не использовать новые команды, иначе программа не соберётся, пока мы не исправим эту директиву на «.486» или «.586» :).
Директива «.model» задаёт модель памяти flat для нашей программы. Модель flat лучше переводить: сплошная модель, а не плоская, как многие пишут.
Stdcall — это «уговор» о том, кто будет чистить параметры (функция, которую вызвали, или сам вызывающий). Мы всегда будем использовать вариант «функция чистит свои параметры». Он и называется stdcall. Однако такое объяснение далеко не полное, и я вернусь к параметру stdcall при объяснении вызова функций. К этому моменту вы уже будете знать, что такое стек.
От директивы .model явным образом зависит скомпилированный код в объектном файле и также зависит формат получившегося исполняемого файла.
Это просто. Всё уже объяснено в комментарии. В этой строке включается чувствительность к ПРОПИСНЫМ или строчным символам. То есть «МЕТКА» и «метка», «Имя» и «имя» будут уже не одно и то же!
На exe это никак не отражается.
Include — директива для подключения файлов (их расширение не обязательно должно быть inc). В подключаемых файлах может быть всё то же самое, что и в основном файле. То есть исходный код программы, данные, макросы (тоже код), комментарии и т.д. Причём вы можете вставлять инклуды, например, в середине кода, а продолжать программу уже в том файле.
В этих трёх inc-файлах в текстовом виде содержатся описания констант, структур и прототипов функций Windows. Далее я всё объясню, и вы поймёте, что это очень просто — как словарь или каталог товаров.
Вы можете перенести нужные описания в наш файл, и подключать inc’и не придётся, только это неудобно.
Includelib — директива для подключения файлов импорта. Я сам только что в первый раз задумался: а что в lib-файлах? Думаю, что вам сегодня объяснять это не нужно. Просто там информация о системных библиотеках, на основе которой будет сформирован вызов API-функций в нашей программе.
В exe-файл в данном случае из inc’ов не попадёт ни строчки кода, но компилятору они нужны для преобразования двух полезных строк (invoke) в машинный код. А из lib-файлов будут взяты две строки кода и данные, которые в exe запишутся в директорию импорта (всё тот же PE-формат).
Вот это очень интересная строка. Тоже директива.
Чтобы разделить код и разного рода данные, в exe-файлах существуют секции.
У каждой секции свои атрибуты и они тоже напрямую связаны с защищённым режимом. Это позволяет стабилизировать работу программ и упорядочить процесс написания. Считается, что машинный код менять не нужно, значит, для него подойдёт атрибут read only (только чтение). А данные (как теперь считается) выполнять не нужно, значит, можно в секции данных выключить атрибут исполняемого кода. Слава Богу, что всё это только теоретически (пока). Любая секция может содержать и код, и данные, и соответствующие атрибуты. Так что сейчас можно воспринимать секции только как полезную для программистов вещь.
Итак, секция данных объявляется директивой «.data», и это выставляет в ней нужные для данных атрибуты.
Так же, как мы вписывали строки текста в конце файла (после кода программы), эта секция по умолчанию будет размещаться в exe-файле после кода.
Здесь от MASM’a только db. Перед ним идут названия переменных. После db идёт содержание переменной, то есть текстовые или цифровые данные. Если данные текстовые, то они помещаются в кавычках или апострофах. А если данные просто байты, то так и пишут через запятую.
Добавьте в этой секции вот такую строку:
Теперь соберите файл ещё раз (старые obj и exe будут стёрты build.bat’om).
Несмотря на то, что переменная LaLa в коде не использовалась, в готовой программе будут эти байты:
Найдите их, загрузив пример в отладчик OllyDbg.
Я уже говорил, что обычно мы будем заканчивать строку текста нулевым байтом. Теперь вы видите, как это пишется в синтаксисе MASM’а.
В файле будет одно и то же: байты символов и 00.
А Str1, Str2 — это имена переменных, они могут быть любые, лишь бы не нарушали правил, описанных в help-файлах MASM’a.
Осталось объяснить, что такое db — одна из ряда однотипных директив инициализации данных и их резервирования. Длинные слова, мало что значат.
DB — сокращение от Data in Bytes (данные в байтах). Есть ещё DW (Data in Words), и DD (Data in Dwords), и ещё несколько аналогичных, побольше. Суть только в том, что запятая в DB разделяет байт, а в DD запятая разделяет 4 байта. Пример.
В исходнике так:
В исходнике так:
вызовет ошибку при сборке файла — размер в последней запятой не тот.
Вот и все основные премудрости представления целочисленных данных без знака (то есть положительных целых чисел) в MASM’e. Хотя нет, забыл сказать, что можно ещё объявлять резерв. Данные, которые на момент старта программы ещё не появились. Для чего это делается?
Допустим, в программе много промежуточных данных. Вписывая их в секцию неинициализированных данных (.data?), мы экономим в размере файла. Пока программа не стартовала, никаких данных в этой секции нет, а вот во время загрузки OS выделяет память сразу под все данные.
На первых порах можно спокойно писать все данные в секцию .data. Файл от этого больше не станет, а наоборот, будет только меньше. В PE-формате есть много всяких тонкостей, одна из них — это выравнивание секций. В большинстве программ в конце каждой секции есть нули, посмотрите в Hiew’e, и вы увидите, сколько места пропадает. Если я ничего не путаю, то секция должна быть кратна 512 байтам (200h). Значит, если у вас нет данных на эту сумму, то лучше не заводить новую секцию «.data?» а писать всё в «.data».
Здесь закончилась секция данных.
. и началась секция кода.
Это единственная секция, без которой программу не собрать. Но я ещё раз повторяю: «.code» вовсе не означает, что данных сюда класть нельзя. Правда, если данные изменяются и они в секции кода — это вызовет проблему (не те атрибуты секции). Хотя руками можно всё :).
Вот мы и добрались до нашей первой метки. Метки в exe-файл не идут. Первая метка начинает код программы. Можно написать хоть «tuki_puki:», лишь бы в конце кода было «end tuki_puki». Что и сообщит MASM’у, где кончилась программа, а самое главное — где она началась.
Далее мы всё время будем использовать метки. Они начинают строки, к которым нам нужно прыгать. При сборке программы компилятор подставляет адреса команд в памяти вместо обращений к меткам. Это гораздо удобнее, чем писать:
Такая команда будет ошибочна, так как, я уже сказал, EP будет указывать на разные адреса в разных программах. Пока что адрес в памяти для первой инструкции будет 401000, а если код программы усложнится, то адрес может стать другим. Если вы запишете:
то больше об адресах беспокоиться не надо. В exe окажется правильная маш.команда, а на Асме она будет выглядеть «JMP 00401000» или куда укажет метка.
В этих двух строчках и скрывается сама программа.
Первая строка вызывает API-функцию MessageBox и передаёт ей необходимые параметры.
Вторая строка выполняет действие, похожее на int 20 в DOS. Это завершающий код с параметром NULL.
На самом деле в коде будет не NULL, а нулевой байт (00h). Это значит, что и здесь можно писать:
Подробный разбор содержания этих двух строк будет уже в следующей Чтиве. Она была написана год назад, я тогда в первый раз увидел в WinXP код программы на Асме, поэтому дотошно описывал всё новое (но с таким количеством ошибок! :/).
Найдя оператор END в этом случае, компилятор MASM’a сочтёт, что метка «start» будет точкой входа в программу. Потому что больше заканчивать в этом файле нечего. Именно со строки
END первая метка
начнётся трансляция полезного кода в файл :).
В любой программе под форточки используется стек, и в следующей главе я расскажу о нём.
Вернуться на главную
— Фирма Интел после всем известной ошибки Пентимума разработала специальную утилиту для «конечных» пользователей, благодаря которой можно изменять код микропрограммного блока управления в процессорах «выше» Пентиума. То есть у нас с вами теоретически есть возможность менять свойства инструкций процессора.
Некоторую информацию вы можете получить в популярной статье iXbt, а также здесь.
Язык Ассемблера. Компилятор FASM.
Язык ассемблера — машинно-ориентированный язык низкого уровня с командами, обычно соответствующими командам машины, предназначен для системного программирования. Примеры его использования: драйвер, ядро операционной систем, а также написание критических участков кода (где важна максимальная скорость выполнения). На этом языке пишут вирусы и эксплойты (специальные программы, созданные для эксплуатации уязвимостей в ПО).
Преимущества знания ассемблера:
· Глубокое понимание работы компьютера и операционной системы.
· Максимальная гибкость при работе с аппаратными ресурсами.
· Оптимизация программ по скорости выполнения.
· Оптимизация программ по размеру кода.
· Дизассемблирование и отладка.
1 — Глубокое понимание работы компьютера и операционной системы
Даже если пишется программа на языке высокого уровня, знание ассемблера поможет понять, как будет выполняться программа, как хранятся переменные, как вызываются функции. А это позволит избежать многих ошибок. Большинство специалистов знают программирование только на уровне языка, т.е. знают что надо написать, чтобы получить какой-то результат, а как он был получен не имеют представления. Человек, владеющий ассемблером, будет лучше программировать и на других языках.
2 — Максимальная гибкость при работе с аппаратными ресурсами
Используя ассемблер, можно делать с компьютером все что угодно. А языки высокого уровня ограничены компилятором и используемыми библиотеками. Такие современные языки, как Java и C# вообще не позволяют работать с аппаратными ресурсами и операционной системой напрямую.
3 — Оптимизация программ по скорости выполнения.
Современные компиляторы достаточно хорошо оптимизируют код, поэтому писать на ассемблере все подряд не имеет смысла. Однако, если пишется программа для шифрования или архивации больших файлов, то применение ассемблера позволит в несколько раз увеличить скорость выполнения программы. Причем достаточно реализовать на ассемблере небольшой критически важный участок программы, который производит вычисления или сложные преобразования, а интерфейс может быть написан на языке высокого уровня.
4 — Оптимизация программ по размеру кода
Программа на ассемблере, как правило, значительно меньше аналогичной программы на другом языке программирования. Для современных персональных компьютеров и серверов с терабайтными дисками и гигабайтами памяти это вряд ли играет большую роль. Но для микроконтроллеров, где всего несколько килобайт памяти, маленький размер программы очень важен. Чем меньше программа, тем меньше памяти требуется, и тем проще и дешевле будет используемая микросхема.
5 — Дизассемблирование и отладка
Дизассемблирование — процесс и/или способ получения исходного текста программы на ассемблере из программы в машинных кодах. Целью дизассемблирования обычно является изменение чужих программ (чаще всего это взлом защиты). Если вы попытаетесь просмотреть в текстовом редакторе файлы с расширением .ехе , то увидите непонятную смесь символов. Это инструкции для процессора. Компьютер читает и исполняет их. Но иногда человек тоже хочет понять, что записано в этих файлах. Тогда он выполняет дизассемблирование. Дизассемблирование превращает исполняемый файл в текст программы на ассемблере. Если вы знаете ассемблер, у вас появляется часть прочесть текст программы и внести в него изменения.
Ассемблер очень может помочь и при отладке. Иногда случаются ошибки и в компиляторах. Вроде бы корректно написанный код выполняется вовсе не так, как предполагалось. Чтобы обнаружить такую ошибку надо посмотреть во что скомпилировался код, а разобраться в этом без ассемблера невозможно.
Учиться программировать начнем с процессора Intel 8086. Будем писать программы под DOS. Практическая ценность от программирования под DOS в наше время не очень большая, если вы, конечно, не собираетесь тесно работать с этой операционной системой. Но она позволит быстро освоить основы ассемблера, а потом мы уже перейдем к программированию под 32-битные системы.
Для программирования на ассемблере прежде всего необходим компилятор. Наиболее известные компиляторы это TASM, MASM и FASM. Мы будем использовать FASM. Это довольно новый, удобный, быстро развивающийся компилятор ассемблера, написанный на себе самом. Его преимущества — это поддержка сложных макросов и мультиплатформенность. Есть версии под DOS, Windows и Linux.
С его помощью можно сгенерировать файл любого формата, не обязательно исполняемый файл, так что FASM — это превосходный инструмент для экспериментов и исследований.
Последнюю версию FASM’a можно скачать с официального сайта http://www.flatassembler.net/. Для установки содержимое архива надо распаковать в какую-нибудь папку. Например, папка C:\FASM.
Для отладки написанных программ будем использовать старый добрый Turbo Debugger из пакета TASM. Архив также надо распаковать в какую-нибудь папку. Например, папка
C:\TD.
Особенности разработки программ в MASM
Для успешной работы с ассемблером MASM корпорации Microsoft в современных операционных средах (WindowsNT\2000\XP) необходимо иметь версию 6.13 этого пакета или выше. В него входят следующие основные программы:
— ml.exe— ассемблер и компоновщик (Masm and Link);
— cv.exe— отладчик (CodeView);
— lib.exe, implib.exe, nmake.exe, cref.exe, h2inc.exe, exehdr.exe, cvpack.exe, helpmake.exe, rm.exe, undeL.exe, exp.exe— вспомогательные утилиты.
В пакете MASM изначально предпринимались попытки совместить удобство средств программирования, свойственных языкам высокого уровня, с традиционными средствами машинно-ориентированных языков. Например, буква «М» в названии пакета означает слово «macro», то есть возможность создания макроопределений (или макросов), представляющих собой именованные группы команд. Их можно вставлять в программу в любом месте, указав только имя группы. Когда-то такая возможность действительно была отличительным свойством этого пакета, но сейчас этим никого не удивишь — макросредства есть во всех ассемблерах для платформы Intel (например, TASM), но, тем не менее, название осталось.
С помощью пакета MASM разработка программ выполняется традиционным для ассемблерного программирования способом — запуском отдельных программ трансляции, компоновки и отладки. Для этого используются программы masm.exe, mL.exe, link.exe и cv.exe. Во избежание путаницы необходимо отметить, что трансляция исходного файла может производиться двумя программами: masm.exe и mL.exe. В чем разница? До выхода MASM версии 5.1 включительно программа masm.exe была самостоятельным транслятором ассемблера. Начиная с MASM версии 6.0 трансляция ассемблерного файла обычно выполняется программой mL.exe, которая кроме трансляции файла вызывает компоновщик link.exe. Это изменение сделано с целью унификации вызовов компиляторов командной строки для всех поддерживаемых этой фирмой языков программирования. К примеру, компиляцию программы на языке С из командной строки выполняет программа cl.exe. Ее задачи — компиляция исходной программы на языках C/C++ и, при отсутствии синтаксических ошибок, компоновка и формирование исполняемого модуля. Аналогичные задачи решает и программаmL.exe. Хотя в пакете MASM 6.13 допустимо использование программы masm.exe, нужно иметь в виду, что запуск link.exe в этом случае также должен выполняться отдельно. Наличие программы masm.exe в пакете MASM6.13 можно объяснить соображениями совместимости с предыдущими версиями пакета, поэтому особого смысла в ее использовании нет.
Далее приведены форматы командных строк для запуска программ ml.exe, Masm.exe и link.exe, а описание их ключей можно найти в приложении В(http:// www.piter.com/download).
Командная строка mL.exe имеет вид
ml [ключи] исх_файл_1 [[ключи] исх_файл_2] . [/link ключи_linк]
Ключи командной строки для ml.exe чувствительны к регистру.
Командная строка masm.exe имеет вид
masm [ключи] исх_файл [, [объектный_файл] [, [файл_листинга]
Компоновщик компонует (объединяет) объектные файлы и библиотеки в исполняемый файл или динамически компонуемую библиотеку (DLL). Командная строка link.exe имеет вид
link[ключи] объект_файлы [,[исполн_файл] [,[файл_карты] [,[файлы_библиотек] [.,def-файл]]][;]
Так же как и в случае пакета TASM, для эффективной работы с MASM нужно провести некоторую дополнительную работу. Исполняемые файлы пакета MASM 6.13 находятся в двух каталогах: ..\BIN и ..\BINR. Для удобства работы их лучше объединить в одном каталоге, к примеру, в каталоге ..\WORK. После этого остается поместить туда исходный файл. Пример командной строки для получения пригодного к отладке исполняемого модуля может быть следующим:
ML.EXE /Zi /Fl Prg_6_l.asm
Если нет синтаксических ошибок, то можно запускать отладчик: CV.EXE PRG_6_1.EXE
Итоги
Структура программы на ассемблере отражает особенности архитектуры процессора. Для процессоров Intel типичная программа состоит из трех сегментов: кода, стека и данных. Но это не обязательное условие; например, если программа не использует стек и для ее работы не требуется определения данных, то она может состоять всего лишь на одного сегмента кода.
— Программа на ассемблере работает на уровне аппаратных средств, входящих в программную модель процессора, которая описана в главе 2.
— При разработке алгоритма работы программы и его реализации на ассемблере программист сам должен беспокоиться о размещении данных в памяти, об эффективном использовании ограниченного количества регистров, об организации связи с операционной системой и другими программами. Специфика разработки программы на ассемблере состоит в том, что программист должен уделять внимание не только и не столько особенностям моделирования предметной области, сколько тому, как при этом наиболее эффективно и корректно использовать ресурсы процессора.
— В результате работы транслятора создаются файл объектного модуля и файл листинга программы, содержащий разнообразную информацию о программе: объектный код, сообщения о синтаксических ошибках, таблицу СИМВОЛОВ и т. д. Имея небольшой опыт, из файла листинга можно извлечь массу полезной информации.
— После получения корректного объектного модуля программу необходимо скомпоновать. Для этого применяется утилита-компоновщик, одним из ОСНОВНЫХ назначений которой является разрешение внешних ссылок. Если целевая программа состоит из нескольких отдельно оттранслированных модулей и в них есть взаимные ссылки на переменные или модули, то компоновщик разрешает их, формируя тем самым правильные перемещаемые адреса.
— Результатом работы компоновщика является исполняемый (загрузочный) модуль, имеющий расширение .ехе. Его уже можно запускать в надежде, что он правильно вы полнит задуманные программистом действия. Но чаше всего при первых запусках программы этого не случается, что говорит о наличии в программе логических ошибок, поиск которых без специальных средств может быть долгим. Для поиска и устранения логических ошибок предназначен специальный вид программного обеспечения — отладчики. С их помощью в большинстве случаев довольно быстро удается снять большинство программных проблем подобного рода.
Контрольные вопросы
1. Жизненный цикл программы – этапы;
2. каждой тетраде можно поставить в соответствие одну…
3. для преобразования кода символа шестнадцатеричной цифры в соответствующее двоичное число есть два пути: …
4. Алгоритм преобразования должен различать прописные и строчные буквенные символы шестнадцатеричных цифр и корректировать значение ASCII-кода на величину…
5. после записи значения шестнадцатеричной цифры следует символ «h» — зачем?
6. общая схема процесса разработки программы на ассемблере — рис.;
7. На этапе трансляции решается несколько задач: …;
8. Итог работы ассемблера — два файла:…;
9. При использовании пакета TASM получение объектного модуля исходного файла производится программой (ассемблером)…;
10. Перед работой с программой tasm.exe желательно провести некоторые подготовительные операции. После установки пакета TASM в каталоге \TASM\BIN…;
11. Для устранения ошибок нужно…;
12. файл листинг – для чего?
13. исходный файл наассемблере в общем случае может содержать конструкции следующих типов:…;
14. После устранения ошибок и получения объектного модуля можно приступать к следующему этапу — созданию исполняемого (загрузочного) модуля, или, как еще называют этот процесс, к… — зачем?
15. Результатом работы компоновщика является создание загрузочного файла с расширением …;
16. Отладка программы – назначение?
17. Отладчики бывают двух типов:…;
18. Отладчик позволяет решить две главные задачи:…;
19. Как произвести запуск отладчика?
20. Управление работой отладчика ведется с помощью системы меню. Имеются два тина таких меню:…;
21. Запустить программу в отладчике можно в одном из четырех режимов:;
22. Режим безусловного выполнения программы целесообразно применять…, и как;
23. Режим выполнения программы до текущего положения курсора целесообразно применять…, и как;
24. В режиме выполнения программы с установкой точек прерывания целесообразно применять…, и как;
25. Режим выполнения программы по шагам применяется для детального целесообразно применять…, и как;
26. Окно CPUотражает состояние процессора и состоит из пяти подчиненных окон…;
27. Особенности разработки программ в MASM — в него входят следующие основные программы:….
Темы и вопросы для самостоятельного обучения
Вопросы для самостоятельного изучения
Не нашли то, что искали? Воспользуйтесь поиском:
Лучшие изречения: Сдача сессии и защита диплома — страшная бессонница, которая потом кажется страшным сном. 8774 — | 7145 — или читать все.
188.64.174.135 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.
Отключите adBlock!
и обновите страницу (F5)
очень нужно
Assembler
Глава #13 — Программирование в MASM
Программирование в MASM Компиляторы языка Assembler несколько отличаются друг от друга т.к не существует единого стандарта. Обычно для Intel совместимых процессоров используется синтаксис команд, указанный в документации от Intel и AMD (называемый Intel), сами же команды и их использование описаны в документации с официальных сайтов производителей процессоров. Но, кроме команд, в исходном коде программы также встречаются специальные символы и директивы, указывающие компилятору как нужно компилировать программу. Обычно, именно эти элементы программы отличаются для разных компиляторов. Для программирования на Assembler’е под Windows чаще всего используется компилятор MASM, поэтому желательно знать особенности программирования на нем. Многие другие компиляторы пытаются быть совместимыми с MASM, поэтому данный материал частично пригоден и для их использования. Об использовании чисел можно посмотреть в главе #2, о работе с памятью в главе #4 и компилирование программы показано в главе #8. Повторно этот и другие, уже изложенные материалы рассмотрены не будут. Данная глава посвящена, в основном, макросредствам компилятора MASM, его элементам хранения данных и улучшения читаемости исходного кода. |
|
|
|
|
|