assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 82
Текст из файла (страница 82)
Разработка библиотек DLL для ассемблерных программ описана в [8].Таким образом, мы рассмотрели связь модулей на языках высокого уровня с модулями на ассемблере. Это обсуждение не могло быть полным из-за потенциальной глубины самой проблемы. Материал данного раздела можно рассматриватьлишь как введение (хотя и достаточно подробное) в проблему межъязыковых отношений. Главная цель этого первого шага — разобраться с принципами. Следующим шагом в направлении реализации связи с ассемблером будет изучение документации на конкретный язык высокого уровня для выяснения особенностейнастройки и требований конкретной среды программирования.Итоги8 Язык ассемблера содержит довольно мощные средства поддержки модульногоподхода в рамках структурного программирования. В языке ассемблера эта технология поддерживается в основном с помощью механизма процедур и, частично, механизма макроподстановок.Л Гибкость интерфейса между процедурами достигается за счет разнообразиявариантов передачи аргументов в процедуру и возвращения результатов.
Дляэтого могут использоваться регистры, общие области памяти, стек, директивыEXTRN и PUBLIC.и Компилятор MASM имеет мощное средство для работы с процедурами в видедиректив PROTO и INVOKE. Их использование существенно облегчает вызов процедур и передачу в них параметров.
Сочетание возможностей этих директивс возможностями директивы PROC позволяет организовывать корректный и более надежный вызов процедур, перекладывая заботу о формировании кодовпролога и эпилога на транслятор.9. Средства TASM поддерживают связи между языками. Ключевой момент приэтом — организация обмена данными. Обмен данными между процедурами наязыках высокого уровня и ассемблера производится через стек. Для доступак аргументам используются регистр ВР или (что более удобно) директива ARG.II Можно доверить компилятору самому формировать коды пролога и эпилога,указав язык в директиве MODEL.
Кроме того, указание языка позволяет задействовать символические имена аргументов, переданных процедуре в стеке, вместо прямого использования регистра ВР для доступа к ним. Тем самым повышаются мобильность разрабатываемых программ и устойчивость их к ошибкам.* Для возвращения результата в программу на языке высокого уровня необходимо использовать конкретные регистры. Через них можно передать как сами данные, так и указатели.и Довольно эффективным для организации связи С—ассемблер может быть подход, при котором ассемблерный код оформляется в виде функций библиотекDLL.Глава 16СозданиеWindows-приложенийна ассемблереI» Особенности разработки Windows-приложений!*• Каркасное Windows-приложение на языке C/C++I? Каркасное Windows-приложение на ассемблереI» Средства TASM для разработки Windows-приложений!>• Расширенное программирование на ассемблередля Win32 APII* Ресурсы Windows-приложений на языке ассемблера||>- Меню в Windows-приложенияхII* Перерисовка изображенияI* Использование окон диалогаI-- Работа с графикойПрограммирование для операционной системы Windows всегда было занятием неиз легких, и на эту тему написано немало книг.
Сказать что-то новое довольно трудно, но и обойти эту тему в книге, посвященной одному из языков программирования, на современном этапе развития вычислительной техники было бы не совсемправильно. Сегодня трудно найти компьютер, на котором бы не была установленаодна из версий Windows, если, конечно, на нем не стоит что-то из «мира» UNIX.Но в этом учебнике речь будет идти исключительно о программировании дляWindows на платформе Intel.В подавляющем большинстве книг о программировании для Windows изложение, как правило, ведется на базе языков C/C++, реже — на базе Pascal. А что же366Глава 16. Создание Windows-приложений на ассемблереассемблер — в стороне? Конечно, нет! Мы не раз обращали ваше внимание на правильное понимание места ассемблера в архитектуре компьютера.
Любая программа на языке самого высокого уровня по сути представляет собой последовательность машинных кодов. А раз так, то всегда остается теоретическая возможностьнаписать ту же программу, но уже на языке ассемблера. Чем можно обосноватьнеобходимость разработки Windows-приложений на языке ассемблера? Приведемследующие аргументы:язык ассемблера позволяет программисту полностью контролировать создаваемый им программный код и оптимизировать его по своему усмотрению;компиляторы языков высокого уровня помещают в загрузочный модуль программы избыточную информацию, поэтому эквивалентные исполняемые модули, исходный текст которых написан на ассемблере, имеют в несколько разменьший размер;ж при программировании на ассемблере сохраняется полный доступ k аппаратным ресурсам компьютера;8 приложение, написанное на ассемблере, как правило, быстрее загружаетсяв оперативную память компьютера;Ж приложение, написанное на ассемблере, обладает, как правило, более высокойскоростью работы и ответа на действия пользователя.Разумеется, эти аргументы не следует воспринимать, как некоторую рекламную кампанию в поддержку языка ассемблера.
Тем более что компиляторы языков высокого уровня постоянно совершенствуются и подчас способны создаватькод, весьма близкий по эффективности к ассемблерному. По этой причине приведенные аргументы не являются бесспорными. И все же нельзя забывать о том, чтосуществует бесконечное множество прикладных задач, ждущих своей очереди накомпьютерную реализацию. Далеко не все из этих задач требуют тяжеловесныхсредств разработки — многие из них могут быть изящно исполнены на языке ассемблера, не теряя привлекательности, например, оконных Windows-приложений.Перед началом обсуждения поясним, в чем состоит разница между программированием для DOS и для Windows. Операционные системы MS-DOS и Windowsподдерживают две совершенно разные идеологии программирования. В чем разница? Программа DOS после своего запуска должна быть постоянно активной.Если ей, к примеру, требуется получить очередную порцию данных с устройстваввода-вывода, то она сама должна выполнять соответствующие запросы к операционной системе.
При этом программа DOS работает по определенному алгоритму, она всегда знает, что и когда ей следует делать. В Windows все наоборот. Программа пассивна. После запуска она ждет, когда ей уделит внимание операционнаясистема. Операционная система делает это посылкой специально оформленныхгрупп данных, называемых сообщениями. Сообщения могут быть разного типа, онифункционируют в системе довольно хаотично, и приложение не знает, какого типа сообщение придет следующим. Отсюда следует, что логика построенияWindows-приложения должна обеспечивать корректную и предсказуемую работупри поступлении сообщений любого типа. Тут можно провести определенную аналогию между механизмом сообщений Windows и механизмом прерываний в архи-Программирование оконных Windows-приложений367тектуре IBM PC.
Для нормального функционирования своей программы программист должен уметь эффективно использовать функции интерфейса прикладногопрограммирования (Application Program Interface, API) операционной системы.Windows поддерживает два типа приложений.я Оконное приложение строится на базе специального набора функций API, составляющих графический интерфейс пользователя (Graphic User Interface,GUI).
Оконное приложение представляет собой программу, которая весь вывод на экран производит в графическом виде. Первым результатом работы оконного приложения является отображение на экране специального объекта — окна.После того как окно появилось на экране, вся работа приложения направленана то, чтобы поддерживать его в актуальном состоянии.ж Неоконное приложение, также называемое консольным, представляет собой программу, работающую в текстовом режиме. Работа консольного приложениянапоминает работу программы MS-DOS. Но это лишь внешнее впечатление.Поддержка работы консольного приложения обеспечивается специальнымифункциями Windows.Вся разница между двумя типами Windows-приложений состоит в том, с каким типом информации они работают. Основной тип приложений в Windows —оконные, поэтому с них мы и начнем знакомство с процессом разработки программдля этой операционной системы.Программирование оконныхWindows-приложенийЛюбое оконное Windows-приложение имеет типовую структуру, основу которойсоставляет так называемое каркасное приложение, содержащее минимально необходимый для функционирования полноценного Windows-приложения программный код.
Не случайно во всех источниках в качестве первого Windows-приложениярекомендуется изучать и исследовать работу некоторого каркасного приложения,так как именно оно отражает основные особенности взаимодействия программыс операционной системой Windows. Более того, написанное и однажды отлаженное каркасное Windows-приложение используется и в дальнейшем в качестве основы для написания любого другого значительно более сложного приложения.Изложение материала будем иллюстрировать программами на двух языках —C/C++ и ассемблере. Такой подход значительно облегчает понимание технологиинаписания Windows-приложений на ассемблере. На его основе можно даже выработать некую методику, которая позволит конвертировать многие полезные программы на C/C++ в функционально эквивалентные программы на ассемблере.Перед началом изложения отметим некоторые его характерные черты.« Теоретический и практический материал главы будет отражать особенностиразработки программ для 32-разрядных операционных систем Windows, к которым относятся Windows 95/98 и Windows NT/2000/XP.
Хотя архитектурыэтих систем в большей или меньшей степени различаются, их объединяет 32-разрядный программный интерфейс — Win32 API. Он представляет собой набор368Глава 16. Создание Windows-приложений на ассемблерефункций, к которым может обращаться приложение. Основная идея Win32API — обеспечение переносимости программ между различными программноаппаратными платформами.И Несмотря на то что изложение будет вестись довольно подробно, мы не сможем описать все детали процесса построения Windows-приложения. Но в этомнет ничего страшного, так как в настоящее время доступно довольно много источников, где это сделано с необходимой степенью детализации.
Неподготовленному читателю можно посоветовать подобрать другой источник, где начальный уровень программирования для Windows изложен с соответствующейстепенью детализации. При этом ему совсем не нужно влезать в дебри. Вполнедостаточно достичь уровня понимания логики работы каркасного Windowsприложения, и можно снова браться за данный учебник.* Для изучения материала этой главы и его практического использования в дальнейшей работе мало иметь только один пакет TASM. Кроме него также необходимы пакеты инструментальных средств разработки приложений на языкеC/C++, например от Microsoft или Borland.
В том и другом пакетах ;имеютсявсе необходимые средства для разработки Windows-приложений. Пакет TASM,в отличие от этих пакетов, не обладает такими средствами, поэтому программисту приходится заимствовать их в том или ином виде в пакетах C/C++.Каркасное Windows-приложение на C/C++Обсуждение вопросов программирования для Windows на ассемблере начнем с обсуждения программы на языке C/C++. Не нужно удивляться такому подходу —«цель оправдывает средства». Нам необходимо, во-первых, понять общие принципы построения оконных Windows-приложений.