В системе команд микропроцессора имеются специальные команды enter и leave. Их использование позволяет облегчить написание кода пролога и эпилога в процедурах ассемблера, например:
;старый код пролога:
push bp
mov bp, sp
; новый код пролога:
enter 0,0
; … … …
; старый код эпилога:
mov sp, bp
pop bp
;новый код эпилога:
leave
Транслятор ассемблера предоставляет средства в виде директив, которые еще больше упрощают работу программиста по формированию кодов пролога и эпилога. Одной из них является директива arg.
Применение директив arg и local приводит к генерации команд enter и leave при входе и выходе из процедуры. Поочередное комментирование этих директив показывает, что они влияют только на формирование операнда команды enter. При использовании local он равен числу байт, необходимых для размещения в стеке локальных переменных. Это так называемый кадр стека. Если строку с директивой local закомментировать, то команда enter все равно формируется, но с нулевым значением первого операнда. Это говорит о том, что пролог процедуры формируется в любом случае, но директива local позволяет еще и сформировать кадр стека для хранения локальных переменных процедуры. Соответственно, во всех вариантах генерации команды enter в конце процедуры формируется команда leave.
Отметим, что эти средства можно использовать не только для связи Pascal - ассемблер, но и для организации других - межъязыковых связей, в том числе ассемблер - ассемблер.
Итоги
hЯзык ассемблера содержит достаточно мощные средства поддержки структурного программирования. В языке ассемблера эта технология поддерживается в основном с помощью механизма процедур и частично с использованием макрокоманд.
hГибкость интерфейса между процедурами достигается за счет разнообразия вариантов передачи аргументов в процедуру и возвращения результатов. Для этого могут использоваться регистры, общие области памяти, стек, директивы extrn и public.
hСредства TASM поддерживают связи между языками. Ключевой момент при этом - организация обмена данными. Обмен данными между процедурами на языках высокого уровня и ассемблера производится через стек. Для доступа к аргументам используется регистр bp или (что более удобно) директива arg.
Тема 15. Создание Windows-приложения на ассемблере Каркасное Windows-приложение на языке С/С++.
Мы начинаем с программы на языке С/С++. Во-первых, нам необходимо понять общие принципы построения оконных приложений Windows. Во-вторых мы разберемся с тем, какие средства ассемблера при этом используются.
Приступая к разработке первого Windows-приложения, важно понимать, что сам язык программирования мало влияет на его общую структуру. Это обстоятельство и позволит нам чуть позже с относительной легкостью изменить инструментальное средство разработки Windows-приложения с С/С++ на ассемблер.
Выполнение любого оконного Windows-приложения начинается с главной функции. Она содержит код, осуществляющую настройку приложения в среде операционной системы Windows. Видимым для пользователя результатом работы главной функции является появление на экране графического объекта в виде окна. Последним действием кода главной функции является создание цикла обработки сообщений. Обработка поступающих приложению сообщений осуществляется специальной функцией, называемой оконной. Тело оконной функции имеет определенную структуру. Таким образом, Windows-приложение, как минимум, должно состоять из трех перечисленных элементов. В листинге 1.1 приведен вариант минимального приложения на языке С/С++.
Листинг 1.1. Каркасное Windows-приложение на языке С/С++
Разберем долее подробно суть действии, выполняемых каждым из трех элементов Windows-приложения. В листинге 1.1 видно, что минимальное приложение на языке С/С++ состоит из 2-х функции: главной-WinMain и оконной-WindowProc. Цель WinMain- сообщить системе о новом для нее приложения, его свойствах и особенностях.
Оконная функция получает все сообщения, предназначенные данному окну, и обрабатывает их.
Видимая часть работы каркасного приложения заключается в создании нового окна на экране. Оно отвечает всем требованиям стандартного окна приложения Windows.
В процессе формирования объектного модуля компилятор преобразует исходный текст на языке С/С++ в эквивалентный текст на языке ассемблера. В контексте нашего обсуждения это достаточно ценная информация.
Полученный текст на ассемблере ценен тем, что в нем каждой строке исходного текста программы на языке С/С++ сопоставляется текст на ассемблере. В листинге 1.2 приведен текст.