В данном случае в исходный текст программы перед началом компиляции TASM вместо строки include iomac.inc вставит строки из файла iomac.inc. Но вставленный текст будет отличаться от оригинала тем, что в нем будут отсутствовать макроопределения _outstr и _exit.
А теперь вернемся к программе из . Проанализируем ее текст, выявим повторяющиеся участки и составим для них макроопределения (листинг 2).
Листинг 2. Пример 1 создания и использования макрокоманд ;prg_3_1.asm с макроопределениями init_ds macro |
;Макрос настройки ds на сегмент данных mov ax,data mov ds,ax endm
out_str macro str ;Макрос вывода строки на экран. ;На входе — выводимая строка. ;На выходе - сообщение на экране. push ax mov ah,09h mov dx,offset str int 21h pop ax endm
clear_r macro rg ;очистка регистра rg xor rg,rg endm
get_char macro ;ввод символа ;введенный символ в al mov ah,1h int 21h endm
conv_16_2 macro ;макрос преобразования символа шестнадцатеричной цифры ;в ее двоичный эквивалент в al sub dl,30h cmp dl,9h jle $+5 sub dl,7h endm
exit macro ;макрос конца программы mov ax,4c00h int 21h endm
data segment para public 'data' message db 'Введите две шестнадцатеричные цифры (буквы A,B,C,D,E,F — прописные): $' data ends
stk segment stack db 256 dup('?') stk ends
code segment para public 'code' assume cs:code,ds:data,ss:stk main proc init_ds out_str message
clear_r ax get_char mov dl,al conv_16_2 mov cl,4h shl dl,cl get_char conv_16_2 add dl,al xchg dl,al ;результат в al exit main endp code ends end main
В листинге 2 в строках , , , , , описаны макроопределения. Их назначение приведено сразу после заголовка в теле каждого макроопределения.
Все эти макроопределения можно использовать и при написании других программ. Посмотрите на модернизированный исходный текст программы из листинга 3.1 в листинге 2 (строки ). Если не обращать внимания на некоторые неясные моменты, то сам сегмент кода стал внешне более читабельным и даже можно сказать, что в нем появился какой то смысл.
Функционально макроопределения похожи на процедуры.
Сходство их в том, что и те, и другие достаточно один раз где-то описать, а затем вызывать их специальным образом. На этом их сходство заканчивается, и начинаются различия, которые в зависимости от целевой установки можно рассматривать и как достоинства и как недостатки: