Sr_Mov ds,es
при макрорасширении будет заменен на
push ds
pop es
Пример некорректного задания параметра.
Time_Msg Macro XXX
TimXXX: db ‘сейчас ХХХ часов$’
ENDM
параметр макроопределения не может быть частью идентификатора;
параметр макроопределения непосредственно не может использоваться в строке, так как его трудно распознать.
Правильный вариант.
Time_Msg Macro XXX
Tim&XXX: db ‘сейчас &ХХХ& часов$’
ENDM
Если в теле макроса используется метка, то она должна быть объявлена локальной, чтобы исключить многократное объявление имен.
Пример 4.
Delay Macro count
local cycle
push cx
mov cx, count
cycle: loop cycle
pop cx
ENDM
В макросредствах широко применяются два вида директив (повторения и условные директивы).
Использование в макросах директив повторения.
REPT, IRP, IRPC – это встроенные макросы, следовательно должен быть концевик ENDM.
REPT
REPT выражение
тело
ENDM
Выражение задает количество раз, которое должно повториться тело. Пример.
REPT 4
shl ax,1
ENDM
При макрорасширении макровызов будет заменен на четыре повторяющихся команды shl ax,1.
Пример 5.
Alloc Macro tlab, lenght
value=0
tlab EQU this byte
rept lenght
value=value+1
db value
ENDM
ENDM
Вызов:
Date Segment
Alloc tab1, 40
Date ENDS
IRP
IRP фиктивный_аргумент, <список значений>
тело
ENDM
Каждый раз из списка подставляется новое значение вместо фиктивного аргумента.
Пример 6.
Savregad Macro
irp r, <ax, bx, dx>
push r
ENDM
ENDM
IRPC
IRPC фиктивный_аргумент, строка
тело
ENDM
При расширении при каждом повторе тела будет подставляться очередной символ из строки.
Пример 7.
IRPC odd5, 13579
db odd5
ENDM
При макрорасширении получим команды db 1, db 3, db 5, db 7, db 9.
Пример 8.
IRPC char, hello
db char
ENDM
При макрорасширении получим команды db h, db e, db l, db l, db o.
Пример 9.
IRPC char, hello
db char
ENDM
При макрорасширении получим команды db ‘h’, db ‘e’, db ‘l’, db ‘l’, db ‘o’.
Условные директивы
Позволяют при трансляции программы просмотреть или пропустить фрагмент программы в зависимости от проверки условия.
Директивы условной трансляции.
Директивы условной генерации ошибок (позволяют выдать соответствующее сообщение об ошибках на этапе трансляции).
Назначение директивы условной трансляции:
Написание отладочных версий программ, в которых после завершения отладки можно протранслировать код без соответствующих операторов
(Например Debug = 1).
Написание универсальных макросов, настраиваемых на систему.
IF xxx
Операторы (Тело 1)
[ ELSE
Операторы (Тело 2) ]
ENDIF
xxx – некоторое выражение, проверка которого должна давать булевский результат
xxx = 0 Ложь
xxx 0 Истина
Допускается 255 уровневое вложение.
Существуют предопределенные операторы IF:
IF1 Его тело транслируется только на первом проходе.
Пример10.
IF1
INCLUDE MYLIB
ENDIF
IFE xxx Транслируется, если выражение (xxx) равно нулю.
ALLOC MACRO LENGHT
VALUE
REPT LENGTH
IFE VALUE – 0FFh
EXITM
ENDIF
VALUE = VALUE + 1
ENDM
ENDM
EXITM – Выход из макроса
Написанный макрос обеспечивает заполнение памяти целыми числами от 1 до 256 байт.
II.
IFDET / IFNDEF имя _ переменной
Тело выполняется, если определено / не определено имя _ переменной.
Пример 12. (задает возможность проверки дисплея):
IFDEF Disptest
; часть первой общей проверки дисплея
IFCOLOR
; часть проверки цветного дисплея
ELSE
; часть проверки монохромного дисплея
ENDIF
; часть второй общей проверки
ELSE
; код, выполнения при отсутствие проверки
ENDIF
IFB / IFNB <аргумент> Проверяет, имеется или отсутствует аргумент (IF Blank – если отсутствует)
Применяется:
Для выдачи подсказок об отсутствия аргументов.
Для разработки рекурсивных макросов с переменным числом в параметрах.
Пример 11.
I способ применения
Make _ Pasc _ String Macro Id, Msg
Local MsgLen, Endstr
Ifb <id>
Display ‘Задать переменную id’
ExitM
IFB <Msg>
Display ‘Задать преобразованную строку’
ExitM
Else
Id Db Endstr-id-1,’&Msg&’
Label EndStr Byte
EndIf
EndIf
EndM
II способ применения
PushReg Macro R1, R2, R3, R4, R5, R6
Ifnb <R1>
Push R1
PushReg R2, R3, R4, R5, R6
Endif
EndM
Отличительные признаки рекурсивного вызова макроса:
Должен быть вызов заново себя с количеством элементов меньше на единицу.
Предусмотрен контроль аргумента с помощью директивы Ifnb.
Способы использования макросов
Непосредственное размещение макроопределения в тексте программы. (Оно размещается в самом начале, обычно после заголовка.)
Применение:
Создание макробиблиотеки с последующим подключением ее к программе. Библиотека строится как обычный файл. В основной файл добавляются следующие команды:
IF1
Include My _ Maclib
EndIf
Можно исключить некоторые макросы из библиотеки, если они не нужны.
Purge Mac1, Mac2, Mac7