|
|
|
|
Условные макросы
Приведенный выше пример макрокода слишком прост, поэтому разрешите несколько "приодеть его". Предположим, что для целей отладки мы хотели бы
писать наши символы на экран, а не в файл. Тогда мы можем переписать макро следующим образом:
@WritToFil MACRO EКOFLAG ;;определить INCHRIF с
;;аргументом EKOFLAG
IFIDN , ;;если аргумент EKOFLAG
;;идентичен трем буквам
;;EKO, ассемблировать
;;следующую строку
mov ah,06h ;;функция DOS по записи в
;;стандартный вывод
ELSE ;;если EKOFLAG не идентично трем буквам
;; EKO, ассемблировать следующую строку
mov ah,40h ;;функция DOS по записи в файл
int 21h ;;вызов DOS
ENDM ;;конец макро
|
В данном случае MASM анализирует аргумент EKOFLAG с целью определения, что вставлять: mov ah,06h или mov ah,40h:
@WritToFil EKO ;здесь MASM подставляет MOV AH,06 и
;INT 21H
.
.
. ;так как аргумент идентичен EKO
@WritToFil NOEKO ;MASM подставляет MOV AH,40H и
;INT 21H
.
.
. ;так как аргумент не идентичен EKO
|
Заметим, что в предыдущем примере вместо NOEKO мы могли бы использовать PHUBAH или что-нибудь еще, так как основная мысль заключается в том, чтобы
аргументом не было EKО. Спеллинг параметра довольно произвольный. Это гарантирует возможность ошибки, если мы забудем его и напишем @WritToFil ECHO.
Такая запись лишает нас появления эха на экране, так как вместо EKO мы указали ECHO. Мы можем исключить возможность появления такой ошибки, ограничив
себя использованием EKO или NOEKO:
@WritToFil MACRO EKOFLAG ;;определить INCHRIF c аргументом
;;EKOFLAG
IFIDN , ;;если EKOFLAG = EKO,
;;ассемблировать след-ую строку
mov ah,06h ;;функция DOS по записи в
;;стандартный файл
ELSE ;;в противном случае
IFIDN , ;;если EKOFLAG = NOEKO,
;;ассемблировать
mov ah,40h ;;функция DOS по записи в файл
ELSE ;;если аргумент не соответствует,
;; то
.ERR ;;выдать ошибку ассемблирования
ENDIF ;;конец проверки условия
int 21h ;; вызов DOS
ENDM ;; конец макро
|
|
|