Макросредства ассемблера - часть 5
Подпрограммы служат для сокращения объема программы, повышения ее наглядности и упрощения перестройки алгоритма выполнения всего программного комплекса путем изменения состава и порядка вызываемых подпрограмм. При этом активное использование подпрограмм может уменьшить размер всей программы в десятки раз.
Смысл использования макрокоманд совсем иной. Макрокоманды позволяют упростить процесс написания программы и, можно сказать, являются средством автоматизации программирования. При этом язык макрокоманд предоставляет большие возможности по изменению текста макрорасширения в зависимости от указываемых в макрокоманде параметров. Проиллюстрируем эти возможности на простом примере макрокоманды вывода на экран символа. Такой макрокомандой можно пользоваться в процессе отладки сложных программ, чтобы получать информацию о содержимом любых ячеек памяти. Пример оформлен в виде законченной программы, которая носит чисто демонстрационный характер.
;Пример 2-1. Использование макрокоманды
sym macroc ;Имя и формальный аргумент
push AX ;Сохраним используемые
push DX ;в макроопределении регистры
mov АН, 02h ;Функция DOS вывода символа
mov DL,c ;Заберем символ
int 21h ;Вызов DOS
pop DX ;Восстановим
pop AX ;регистры
endm ;Конец макроопределения
code segment
assume cs:code
main proc
sym 'w' ;Символ указан непосредственно
sym ES : 0 ;Вывод первого байта PSP
sym CS:msg ;Вывод первой буквы из msg
lea BX,msg-t-l ;Адрес второй буквы из msg
sym [BX] ;Вывод второй буквы
mov AX, 40h ;Настроим DS
mov DS,AX ;на начало памяти
sym DS:49h ;Вывод номера видеорежима
mov AX,4C00h ;Завершение программы
int 21h
main endp
msg db 'OK'
code ends
Тексты макроопределений обычно размещаются в самом начале программы, что дает возможность вызывать макрокоманды из любых точек программы. Содержательная часть макроса sym состоит в вызове функции 02h DOS, которая выводит на экран символ из регистра DL. Поскольку макрос использует регистры АХ и DX, они в начале макроса сохраняются в стеке, а перед его завершением восстанавливаются. В качестве параметра макрокоманды можно использовать любое обозначение ассемблера, которое может интерпретироваться, как адрес символа.
