Лабораторная работа № 4
Технология создания ассемблерных программ.
Цель работы
- освоить технику создания программ в SDK MASM32;
- изучить использование шаблонов ассемблерных программ;
- экспериментально изучить работу макрогенератора;
- изучить технику создания и применения макросов.
- научиться наблюдать за результатами работы макрогенератора, встроенного в ml.exe.
Краткие сведения из теории
На что опирается программирование на ассемблере
Программировать на ассемблере – значит писать программы практически на уровне машинных команд. Ассемблеры – это такие языки программирования, в которых каждой машинной команде процессора сопоставляется один оператор. (Примечание. В ассемблеры также включаются всякие дополнительные средства для облегчения программирования, но главная их особенность именно эта – одна процессорная команда может изображаться одним оператором). Для превращения исходного текста в исполняемый exe-модуль применяются компилятор (переводчик текста в машинный код) и компоновщик (он связывает вместе отдельные функциональные секции машинного кода и создает ехе-модуль). Язык ассемблерного программирования, включающий возможность описания и использования макроподстановок (макросов), традиционно называют «макроассемблер». Среди макроассемблеров самым проработанным и удобным заслуженно считается Microsoft Macroassembler, сокращенно – MASM (МАСМ). Его 32-разрядная разновидность называется MASM32.
Корпорация Microsoft включает в пакеты Visual C++ и Visual Studio компилятор макроассемблера ML.EXE и компоновщик LINK.EXE, которые являются необходимыми компонентами среды разработки программных приложений (IDE). Эти качественные программные компоненты можно использовать и сами по себе, вне упомянутых сред программирования. Корпорация Microsoft не рассматривает их как отдельные товарные продукты на рынке программного обеспечения и не препятствует их свободному бесплатному использованию кем угодно.
Многие энтузиасты создают собственные пакеты для программирования на макроассемблере, базирующиеся на использовании ML.EXE и LINK.EXE. Наиболее успешной следует считать деятельность группы Стива Хатчисона (Австралия), которые бесплатно распространяют и поддерживают пакет МАСМ, доступный в Сети по адресу http://www.МАСМ.com/masmdl.htm для скачивания как минимум с семи зеркальных серверов.
Пакет МАСМ содержит множество ресурсов, которые дополняют ML.EXE и LINK.EXE до работоспособного набора поддержки разработчиков ассемблерных программ (Software Developer’s Kit, SDK).
И, наконец, существует множество фирм, инициативных групп и отдельных программистов, которые создают и даже нередко сопровождают всякие дополнительные программные средства для программирования на всевозможных ассемблерах – и МАСМ, и nasm и fasm и всяких иных. В конце концов, фирма Intel открыто публикует сведения об архитектуре и системе команд своих процессоров, и на этой базе даже одному человеку под силу написать «свой ассемблер», примеров чему мы находим в Интернете множество.
Говоря здесь о «дополнительных программных средствах», мы имеем в виду (по версии сайта http://www.wasm.ru/) такой (неполный) список классов программ:
– образовательные программы;
– SDK и IDE;
– редакторы ресурсов;
– дизассемблеры;
– отладчики;
– модификаторы;
– инсталляторы;
– распаковщики;
– упаковщики;
– средства криптографии;
– средства работы с реестром;
– редакторы байт-кода…
Столь обширный перечень одних только классов программ говорит о том, что при разработке системных программ на ассемблере программисты встречаются с огромным множеством особых, нестандартных, специфических ситуаций, для преодоления которых и создаются эти инструменты.
Состав пакета МАСМ
В курсе программирования студенты знакомятся с интегрированными средами разработки программных приложений (Integrated Development Environment, IDE). Примерами их могут быть QT Creator, Delphi, Kylix, Visual Studio. Все эти среды позволяют создавать приложения, пользуясь языками программирования высокого уровня – С, С++, Object Pascal.
MASM32 – это не среда разработки. Это набор ресурсов, предназначенный для низкоуровневого программирования (то есть на уровне машинных команд процессора). Такие продукты на английском называются «набор разработчика программ» (Software Developer’s Kit).
MASM32 состоит, во-первых, из программ служебного назначения. Самые главные из них – это компилятор ML.EXE и компоновщик LINK.EXE. Без этих двух программ ассемблерную программу изготовить вообще невозможно. Кроме того, для изготовления работоспособных под Windows программ нужен еще ряд ресурсов – библиотек и включаемых файлов:
\masm32\include\windows.inc
\masm32\include\masm32.inc
\masm32\include\gdi32.inc
\masm32\include\user32.inc
\masm32\include\kernel32.inc
\masm32\include\Comctl32.inc
\masm32\include\comdlg32.inc
\masm32\include\shell32.inc
\masm32\include\oleaut32.inc
\masm32\include\ole32.inc
\masm32\include\msvcrt.inc
\masm32\include\dialogs.inc
\masm32\macros\macros.asm
\masm32\lib\masm32.lib
\masm32\lib\gdi32.lib
\masm32\lib\user32.lib
\masm32\lib\kernel32.lib
\masm32\lib\Comctl32.lib
\masm32\lib\comdlg32.lib
\masm32\lib\shell32.lib
\masm32\lib\oleaut32.lib
\masm32\lib\ole32.lib
\masm32\lib\msvcrt.lib.
Они все обычно подключаются к разрабатываемой программе одной строкой-директивой.
По большому счету, их и достаточно. Всё остальное, что есть в МАСМе, направлено на облегчение работы с ним. Всякого рода примеры, шаблоны, библиотеки, файлы помощи… Слабой попыткой создать что-то типа «среды разработки» следует считать наличие в МАСМе программы qeditor.exe. Это текстовый редактор, но с возможностью вызывать из меню различные пакетные файлы из папки \masm32\bin. В МАСМе есть еще разные ехе-утилиты. Есть совершенно необходимые – например, компилятор ресурсов rc.exe. Есть просто полезные, к примеру, dumpbin.exe.
Как показывает практика, программирование на ассемблере при установленном на компьютере SDK MASM32 вполне успешно ведется с применением следующего дополнительного софта:
· Текстового редактора Notepad++;
· Файлового менеджера Total Commander;
· Отладчика OllyDbg;
· Байтового редактора HexWorkshop.
Большую роль при программировании на ассемблере играет системная консоль Windows – CMD.EXE. Хотя на ассемблере можно писать и приложения с GUI, но подавляющая часть ассемблерных программ – всё-таки консольные. Им просто не нужен графический интерфейс, за ним теряется суть выполняемых в программе действий.
Для удобного вызова программ и пакетов, которые входят в МАСМ, придется произвести кое-какие перенастройки в операционной системе.
Первое, что нужно будет сделать – это дописать в системную переменную path пути доступа к нескольким папкам SDK MASM32: bin, lib, macros. Цель этого действия – сделать возможным запуск программ МАСМ32 из любой папки, а не только той, в которой они физически размещены. Дело в том, что если командная строка или пакетный файл делают попытку доступа к некоему файлу, то он (искомый файл) сначала ищется в текущей активной папке. Если он там не находится, то ОС обращается к системной строковой переменной path. Эта строка состоит из списка путей к папкам, разделенных символом «;». Оттуда извлекаются по очереди эти пути и система ищет искомый файл в каждой папке по очередному пути. Если где-то искомый файл находится – поиск завершен успешно. Если система перебрала все пути в path и файл НЕ обнаружен, то фиксируется ситуация «файл не найден» с выводом соответствующего сообщения.
Отсюда, кстати, следует, что сообщение «файл не найден» не означает, что такого файла на компьютере нет вовсе. Это только означает, что его нет в текущей папке и папках из path.
Если мы хотим, чтобы, к примеру, компилятор ML.EXE мог быть вызван из вашей рабочей папки, нужно, чтобы путь d:\masm32\bin попал в строку path, потому что компилятор находится именно в ней.
Второе, что надо будет сделать – это назначить Notepad++ обработчиком не только txt-файлов, но и файлов типа asm (исходные файлы программ на ассемблере).
Физически пакет МАСМ разворачивается в папку MASM32 корневой папки указанного пользователем диска, традиционно это D:\ MASM32. Следует сказать, что как установленное приложение МАСМ в реестре не регистрируется. То есть пакет работоспособен сразу после установки всех его файлов.
Рисунок 4.1 –Корневая папка пакета МАСМ
Папки имеют назначение: bin – основные исполняемые файлы пакета (*.bat, *.exe и *.dll); help – chm-файлы электронной помощи по основным компонентам пакета; include и lib – включаемые inc-файлы и файлы библиотек *.lib. И то, и другое обеспечивает интерфейс создаваемых ассемблерных программ с ОС Windows; macros – набор заготовок и шаблонов макросов для широкого круга практических задач.; tutorial – большое количество готовых примеров asm-программ на самые разные темы. Пригодны как для изучения программирования на МАСМ, так и в качестве заготовок для собственных разработок.
Папка m32lib заслуживает того, чтобы о ней сказать отдельно. Это папка, в которой сложены ИСХОДНЫЕ ТЕКСТЫ процедур, применяемых в пакете. Полезность этой папки при обучении ассемблеру переоценить просто невозможно. Поэтому в будущем, когда вы при разборе очередного примера встретите вызов незнакомой функции, то сразу ищите в m32lib asm-файл с аналогичным именем, открывайте его, читайте и все тайны вам откроются.