assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 91
Текст из файла (страница 91)
Например, возможна ситуация, когда несколько классов окон применяют одну и ту же оконнуюфункцию для обработки сообщений, поступающих в созданные на базе этих классов окна. Имеет смысл сохранять не только названные регистры, используемыесамой системой Windows, но и другие (за исключением ЕАХ), если они задействованы в оконной функции. Исходя из требования рекурсивности, все переменные, используемые в оконной функции, должны быть локальными. Чтобыудовлетворить требование сохранения регистров, лучше применить (строка 166листинга 16.4) соответствующее средство транслятора ассемблера — директиву USES(см. также главы 10 и 15).
При этом транслятор вставляет в начало и конец оконной функции соответствующую последовательность команд ассемблера PUSH. Выможете убедиться в этом, посмотрев файл листинга (файл .1st) программы из листинга 16.4 после ее трансляции.Центральным местом оконной функции является синтаксическая конструкция,в задачу которой входит распознавание поступившего сообщения по его типу(параметр message) и передача управления на ту ветвь кода оконной функции, которая продолжает далее работу с параметрами сообщения.
В языке C/C++ (см.листинг 16.1) для этого используется оператор switch (переключатель). В языкеассемблера такого средства нет, поэтому его приходиться моделировать (см. главу 11). В листинге 16.4 строки 168-174 показывают, как это можно сделать с помощью команды СМР, а также команд условного (JE) и безусловного (JMP) переходов.Соответствие символических имен константам, обозначающим тип сообщенийWindows, приведено во включаемом файле windowsA.h. Совершенно необязательно анализировать типы всех возможных сообщений, параметры которых передаются в оконную функцию. Структуру, подобную строкам 168-174, и вообще структуру всей оконной функции можно сравнить с ситом, а сообщения — с зернамиразной величины.
Отверстия в сите непростые — каждое из них пропускает зерносвоего размера. Зерна (сообщения) в сите (оконной функции) не задерживаются,попав в него, они через одно из отверстий обязательно уходят. Уходят куда? Этоопять-таки определяется особой структурой нашего сита. Представьте, что к каждому отверстию припаяна трубка, которая определяет, куда данное зернышко попадет для дальнейшей обработки. Таким образом, каждому сообщению, попадающему в оконную функцию, соответствует ветвь в коде процедуры, которая начинаетобработку этого сообщения. В ходе этой обработки, возможно, понадобится вызовдругих функций или применение синтаксических конструкций, подобных описанному ситу, для дальнейшей более тонкой селекции сообщений, но уже одного типа(по полям IParam или wParam).
Для наглядности аналогию структуры оконной функции с ситом можно упрощенно представить в виде схемы (рис. 16.1).Представленная схема показывает, что оконная функция, обрабатывающая сообщения, имеет одну точку входа и множество точек выхода. Выход осуществляется из той ветви оконной функции, где обрабатывалось сообщение. Сообщения,Средства TASM для разработки Windows-приложений401Среда WindowsСообщениеВсё——остальныесообщенияWM_PAINT-WM_COMMAND-Q(J|T.wParamСреда Windows0000 0Рис. 16.1. Абстрактное представление структуры оконной функции Windowsдля которых не предусмотрена отдельная обработка, должны обрабатываться функцией DefWindowProc (строки 219-227).
Эта процедура по отношению к переданнымей сообщениям предпринимает действия по умолчанию. В принципе, ей можнопередавать на обработку все сообщения, что в контексте рассмотренной ранее абстракции означает сито, содержащее одно отверстие, в которое проваливаются всепоступающие сообщения.По завершении работы оконная функция формирует значение в регистре ЕАХ.Если сообщение обрабатывалось в оконной функции, то в ЕАХ необходимо поместить нулевое значение. Если обработка осуществлялась по умолчанию, то естьфункцией DefWindowProc, то в ЕАХ уже сформировано возвращаемое значение,и именно его нужно возвратить в качестве результата работы оконной функции.В нашем примере оконная функция обрабатывает три сообщения: создание окнаWM_CREATE, перерисовку области окна WM_PAINT, закрытие окна WM_DESTROY.Более подробно с условиями возникновения и обработкой этих и других сообщений можно познакомиться в литературе по Windows, где эти вопросы освещены более полно.Средства TASM для разработкиWindows-приложенийРанее мы подробно разобрались с тем, что собой представляет простое Windowsприложение, написанное на языке ассемблера.
Излагая материал, мы упоминалиимена файлов, которые нужны для получения работоспособного исполняемогомодуля программы. Для устранения возможных неясностей соберем и систематизируем эту информацию.402Глава 16. Создание Windows-приложений на ассемблереПри разработке Windows-приложений на языке ассемблера с помощью Win32API вам нужен один из пакетов ассемблера — не обойтись без пакета TASM версии 5.0. Современные 32-разрядные операционные системы Windows используютформат РЕ исполняемого файла.
В состав пакета TASM 5.0 входят два компилятора ассемблера — 16- и 32-разрядный. Они имеют имена исполняемых файлов, соответственно, tasm.exe и tasm32.exe. То же касается и редакторов связей — tlink.exeи tlink32.exe. Получить файл формата РЕ можно только при совместном использовании файлов tasm32.exe и tlink32.exe. Для удобства работы, подобно тому, как мыэто делали для 16-разрядных программ в главе 6, скопируйте все файлы 32-разрядной версии в отдельный каталог и назовите его, например, Work32. Сюда женеобходимо поместить файлы windowsA.inc и import32.lib, находящиеся среди файлов, прилагаемых к книге.Для создания программы нужны еще два файла: файл определений компоновщика и файл описания ресурсов.
Файл описания ресурсов будет рассмотрен в следующем разделе. Что касается файла определений компоновщика, то его содержимое довольно подробно описывается в различных источниках, и его роль ничем неотличается от роли аналогичного файла при разработке Windows-приложений надругих языках. Назначение файла определений компоновщика состоит в том, чтобы предоставить редактору связей информацию о способе загрузки программы.Несмотря на то что в архитектуре Win32 нет особого смысла использовать данныйфайл, редактор tlink32.exe требует указания этого файла среди файлов, подаваемых ему в качестве входных.
Вы можете без проблем задействовать готовый вариант этого файла, находящийся среди файлов, прилагаемых к книге.Перечислим необходимые для разработки Windows-приложения файлы.» Файл с исходным текстом программы (.asm). Формируется программистом.Ш Включаемый файл с описаниями структур данных и констант Win32 (.inc или.ash). Файл формируется программистом по мере расширения используемыхим средств Win32. Источником информации для этого файла служат включаемые файлы (.h) из пакета компилятора C/C++, например VC++ версии 4.0и выше.я Файл с библиотекой импорта import32.lib.
Этот файл требуется компоновщикудля разрешения внешних ссылок на функции Win32 API. Вы можете создатьэтот файл сами. Такая необходимость может возникнуть, если вам понадобятсяфункции из библиотек DLL, информация о которых отсутствует в существующем варианте файла import32.lib. Для этого существует специальная утилитаimplib.exe, поставляемая в пакете TASM 5.O. Командная строка для ее запускаимеет видimplib имя_файла_11 bПолучить информацию о местонахождении конкретной функции Win32 APIдовольно просто. Многие справочные руководства по Windows при описанииконкретной функции приводят и информацию о библиотеке DLL, где эта функция содержится.Файл с описанием ресурсов, используемых в приложении.Другие файлы. Например, в рассмотренной нами программе каркасного приложения (см. листинг 16.4) используются звуковые файлы (.wav).Средства TASM для разработки Windows-приложений403т Файлы tasm32, tlink32.exe и, возможно, некоторые другие вспомогательные файлы из пакета TASM 5.O.
Следите внимательно за сообщениями. В том случае,если какого-либо файла будет недоставать, его нужно просто найти в каталоге\Ып пакета TASM 5.0 и скопировать в свой рабочий каталог. Непосредственнов каталоге \trin работать не рекомендуется, иначе он моментально превратитсяв слабоструктурируемое нагромождение файлов.II Компилятор ресурсов brc32.exe или brcc32.exe. Компиляторы взяты из пакетаC/C++ фирмы Borland.
Но если вы работаете с пакетом VC++, то вам можетпонадобиться компилятор ресурсов, входящий в этот пакет. Он называетсягс.ехе.т Файл makefile и утилита make.exe. Эти файлы призваны облегчить процесс сборки приложения в единый исполняемый модуль.Приведенный список файлов, необходимых для сборки Windows-приложения,довольно велик. Ранее процесс получения исполняемого файла у нас был простыми вполне управлялся из командной строки (без использования, например, makeфайлов). Более сложные приложения требуют учета взаимосвязей между несколькими файлами. Данные файлы, в свою очередь, создаются или обрабатываютсяразными программными средствами, которые иногда требуют задания режимовработы многочисленными параметрами.
Запоминать их и постоянно вводить вручную тяжело, и такая работа вряд ли может быть признана эффективной. Для облегчения процесса получения исполняемого файла используйте возможности, предоставляемые make-файлами.Make-файл для программиста — существенное облегчение в его работе. Тщательно разработав один раз make-файл для создания исполняемого файла своегоприложения, вы впоследствии избавите себя от рутинной работы по формированию необходимых для этого командных строк. Второй положительный эффект отиспользования make-файлов — упрощается работа автора по описанию процессаполучения исполняемого модуля.