assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 99
Текст из файла (страница 99)
Это отладочный моментработы, и, учитывая учебный характер разрабатываемого приложения, он не убраниз его конечной версии.Макрокоманда show_eax также используется для отладки и является аналогоммакрокоманды show, описанной в главе 14. Попытка запустить макрокоманду showв нашем приложении ни к чему хорошему не приведет, поэтому для динамического контроля за работой программы макрокоманда show_eax может оказаться оченьполезной. Кстати, проблема отладки Windows-приложений довольно актуальна,и для ее решения подчас приходится применять самые нетрадиционные подходы,но это уже тема для отдельного разговора.Активизация окна диалогаДля того чтобы отобразить окно диалога на экране и выполнить с его помощьюнекоторую работу, используется функция DialogBoxParamA. Эта функция имеет следующий формат (в нотации C/C++):int DialogBoxParam (HINSTANCE h l n s t a n c e , / / д е с к р и п т о р приложенияLPCT5TR IpTemplateName, / / у к а з а т е л ь на строку с заголовком окнаHWND hWndParent,//дескриптор окнаDLGPROC IpDialogFunc,/ / у к а з а т е л ь на диалоговую процедуруLPARAM dwlnitParam) / / з н а ч е н и е , передаваемое в диалоговую функцию//через IParamВ программе prg!6_4.asm (см.
листинг 16.13) обращение к этой функции производится трижды при выборе соответствующих пунктов меню (строки 271,296 и 344в теле процедуры MenuProc). С ее помощью в диалоговую процедуру передается32-разрядное значение, которое извлекается посредством параметра IParam.Программирование консольных Windows-приложений435По окончании работы окно диалога должно быть закрыто функцией EndDialog,имеющей форматBOOL EndDialog (HWND hDlg, //дескриптор окна диалогаint nResult); //возвращаемое значениеОбычно закрытие окна производится щелчком на кнопке ОК или Cancel.Большой размер исходного текста приложения prg!6_4.asm может кого-то испугать.
Он может быть существенно сокращен за счет различных средств ассемблера, в том числе макрокоманд и процедур. Если с их помощью реорганизоватьисходный текст, то он станет гораздо читабельнее и удобнее для использования,почти как аналогичный текст на языке C/C++. Однако в отличие от текста наC/C++ текст на ассемблере — готовая машинная программа, в которую ничего лишнего не добавляется и код которой полностью контролируется. Более того, с этимтекстом можно проводить весь комплекс мероприятий по его оптимизации. В нашем примере намеренно ничего не сделано в плане улучшения внешнего вида исходного текста, чтобы не навязывать читателю свои подходы к этому процессу,тем более что это могло бы ввести его в заблуждение.
Текст программы в настоящем виде более всего отражает суть процессов, происходящих в системе Windowsво время исполнения приложения, и механизм взаимодействия приложения с системой.Нами остались не разработанными варианты реакции приложения на выборпользователем пунктов меню Графика > Эффекты > Павлин и Графика > Эффекты >Кружева. Их реализация требует использования команд сопроцессора и поэтомубудет рассмотрена в следующей главе.В начале главы отмечалось, что Windows поддерживает работу двух типов приложений — оконных, в полной мере использующих все достоинства графическогоинтерфейса, и консольных, работающих в текстовом режиме. Большая часть данной главы была посвящена разработке программ с оконным интерфейсом.
Заключительную часть главы посвятим рассмотрению основ программирования консольных приложений.Программирование консольныхWindows-приложенийЯзык ассемблера — язык системных программистов, исследователей принциповработы операционных систем, программ и аппаратных средств. Здесь не всегданужны красивые графические оболочки, а наоборот, велика потребность в удобных средствах для работы с текстовой информацией. Операционная системаWindows обеспечивает встроенную поддержку консолей, которые, по определению,являются интерфейсами ввода-вывода для приложений, работающих в текстовомрежиме. Понятие «консоль» существует в вычислительной технике давно. В общем случае под «консолью» подразумевают текстовый терминал для управлениякомпьютером.
Видимая часть такого терминала — клавиатура (для ввода управляющих воздействий) и монитор (как средство отображения-реакции вычислительной системы). В Windows консоль представляет собой приложение, которое позволяет взаимодействовать с операционной системой посредством ввода текстовых436Глава 16. Создание Windows-приложений на ассемблерекоманд. Такой способ управления компьютером позволяет решать в основном административные задачи.
Приложение, с помощью которого поддерживается этотрежим, называется консольным. Видимая часть консольных приложений называется окном консольного приложения.Написание консольных приложений на ассемблере — задача более актуальная,чем написание оконных. Причина простая — малыми затратами нам становятсядоступны практически все возможности Win32 API. Программист может запустить одновременно нескольких консольных приложений и при этом работать с мышьюи клавиатурой в стиле Windows. Далее мы рассмотрим порядок действий для запуска консольного Windows-приложения и организацию обмена данными с ним.API Win32 предоставляет два разных уровня работы с консолью — высокийи низкий. Выбор нужного уровня зависит от того, какая степень гибкости и полноты контроля требуется приложению для обеспечения своей работы с консолью.Функции высокого уровня обеспечивают простоту процесса ввода-вывода за счетиспользования стандартных дескрипторов ввода-вывода, но при этом невозможендоступ к входному и экранным буферам консоли.
Функции низкого уровня требуют учета большего количества деталей и написания большего объема кода, но этокомпенсируется большей гибкостью.Консоль состоит из одного входного и нескольких экранных буферов. Входнойбуфер представляет собой очередь, каждая запись которой содержит информациюотносительно отдельного входного события консоли. Экранный буфер — двухмерный массив, содержащий символы, выводимые в окно консоли, и данные об ихцвете.Очередь входного буфера содержит информацию о следующих событиях:и нажатии и отпускании клавиш;я манипуляциях мышью — движение, нажатие и отпускание кнопок;II изменении размера активного экранного буфера, состоянии прокрутки.С каждой консолью связаны две кодовые таблицы — по одной для ввода и вывода. Консоль использует входную кодовую таблицу для трансляции ввода с клавиатуры в соответствующие символьные значения.
Аналогичным образом используется кодовая таблица вывода — для трансляции символьных значений, формируемых различными функциями вывода, в символы, отображаемые в окне консоли.Для работы с кодовыми таблицами приложение может задействовать пары функций: SetConsoleCP и GetConsoleCP — для входных кодовых таблиц и SetConsoteOutputCPи GetConsoleOutputCP — для выходных кодовых таблиц. Идентификаторы кодовыхтаблиц, доступные на данном компьютере, сохраняются в системном реестре следующим ключом:HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Nls\\CodePageДля поддержки консольных приложений Win32 API содержит более сорокафункций, предназначенных для интеграции в среду Windows программ, работающих в текстовом режиме. Данные функции обеспечивают поддержку отмеченныхранее двух уровней доступа к консоли — высокого и низкого.
Консольные функции ввода высокого уровня позволяют приложению извлечь данные, полученныепри вводе с клавиатуры и сохраненные во входном буфере консоли. Консольныефункции вывода высокого уровня позволяют приложению записать данные в уст-Программирование консольных Windows-приложений437ройство стандартного вывода или в устройство ошибки с тем, чтобы отобразитьэтот текст в экранном буфере консоли. Функции высокого уровня также поддерживают переназначение стандартных дескрипторов ввода-вывода и управлениережимами работы консоли.
Консольные функции низкого уровня позволяют приложениям получить детальную информацию о вводе с клавиатуры, событиях нажатия и отпускания кнопок мыши и о манипуляциях пользователя с окном консоли. Все это обеспечивает высокую степень контроля над выводом данных на экран.Высокоуровневый и низкоуровневый консольный ввод-вывод не являются взаимоисключающими, и приложение может использовать любую комбинацию этихфункций.Минимальная программаконсольного приложенияМинимальная программа консольного приложения на ассемблере выглядит так,как показано в листинге 16.14.Листинг 16.14. Фрагменты приложения prg16_5.asm;prg!6_5.asm;Пример минимальной программы консольного Windows-приложения.486.model flat,STDCALL;модель памяти flatinclude WindowConA.inc;0бъявление внешними используемых в данной программе функций Win32 (ASCII):extrn AllocConsoleiPROCextrn SetConsoleTitleA:PROCextrn ExitProcess:PROC.dataTitleTextdb 'Win32-console application',0.codestart proc near;точка входа в программу:;запрос консолиcallAllocConsoleпроверить успех запроса консолиtesteax.eaxjz exit; неудача;выведем заголовок окна консоли SetConsoleTitie:pushoffset TitleTextcallSetConsoleTitleA;проверить успех вывода заголовкаtesteax.eaxjz exit;неудача;работаем ...exit:;выход из приложения;готовим вызов VOID ExitProcess(UINT uExitCode)push0callExitProcessstartendpend startЕсли убрать комментарии, то кода будет совсем немного.