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


Макросредства ассемблера - часть 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, они в начале макроса сохраняются в стеке, а перед его завершением восстанавливаются. В качестве параметра макрокоманды можно использовать любое обозначение ассемблера, которое может интерпретироваться, как адрес символа.




- Начало -  - Назад -  - Вперед -