Иллюстрированный самоучитель по Assembler

Макросредства ассемблера

В программе проиллюстрировано использование в качестве фактического аргумента макрокоманды различных конструкций языка: непосредственного обозначения символа (что, наверное, лишено смысла), прямого обращения к различным участкам памяти по абсолютным адресам через регистры ES и DS, адресации с использованием символического обозначения поля данных. На рис. 2.18 приведен вывод программы.

Иллюстрированный самоучитель по Assembler › Основы программирования › Макросредства ассемблера
Рис. 2.18. Вывод программы 2.1.

Как уже отмечалось, при загрузке программы в память в регистры DS и ES заносится сегментный адрес префикса программы, поэтому адресация через ES позволяет прочитать содержимое PSP. Префикс содержит, главным образом, данные, необходимые системе для обслуживания текущей программы, но, кроме того, и несколько команд. В частности, префикс начинается с команды CD 20h, которая уже давно не используется, но в префиксе присутствует ради обеспечения совместимости со старыми версиями DOS. Первый байт этой команды, если его рассматривать, как код символа, соответствует элементу двойной горизонтальной рамки (длинный знак равенства).

Занеся в регистр DS число 40h, мы настроили его на начало области данных BIOS, которая начинается с абсолютного адреса 400h, занимает 256 байт и содержит разнообразные данные, используемые BIOS в процессе обслуживания аппаратуры компьютера. Так, например, по адресу 0 от начала этой области хранится базовый адрес первого последовательного порта; по адресу 8 – адрес первого параллельного порта, а по адресу 491i – код текущего видеорежима. При работе в DOS видеоадаптер обычно настраивается на режим 3 (80x25 символов, 16 цветов). Будучи выведен на экран, код 3 образует изображение червонного туза.

В тех случаях, когда макрокоманды составляются для конкретной программы, они включаются в текст программы так, как это было сделано в примере 2.1. Однако часто программист оформляет в виде макрокоманд стандартные процедуры общего назначения, например, программную задержку или вывод на экран строки текста. В этом случае тексты макроопределений целесообразно поместить в макробиблиотеку.

Макробиблиотека представляет собой файл с текстами макроопределений. Макроопределения записываются в этот файл точно в таком же виде, как и в текст программы. Ниже приведен текст файла макробиблиотеки с произвольным именем MYMACRO.MAC, содержащей две макрокоманды.

;Макрокоманда endpr завершения программы
endpr macro; Макрокоманда без параметров
mov AX,4C00h
int 2 In
endm; Конец макрокоманды
;Макрокоманда delay настраиваемой программной задержки
delay macro time; Параметр – число шагов
locallabel1, Iabel2; Локальные метки
push CX; Сохраним внешний счетчик
mov CX,time; Получим фактический параметр
Iabel2: push CX; Сохраним его в стеке
mov CX, 0; Пусть будет 64К шагов
label1: loop lanel1; Внутренний цикл
pop CX; Извлечем внешний счетчик
loop Iabel2; Внешний цикл
pop CX; Восстановим CX программы
endm; Конец макрокоманды

Для того чтобы транслятору были доступны макрокоманды из файла MYMACRO.MAC, его следует на этапе трансляции подсоединить к исходному тексту программы директивой ассемблера include:

include my macro, mac

Все макрокоманды, включенные в этот файл, можно использовать в любом месте программы.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.