- •Лекция 23
- •Схема трансляции программы с
- •Макросы
- •Макросы
- •Примеры макросов
- •Достоинства и недостатки макросов
- •Использование макросов
- •Использование макросов
- •Использование макросов
- •Использование макросов
- •Использование макросов
- •Пример использования
- •Макродирективы
- •Директивы WHILE и REPT
- •Пример использования WHILE и REPT
- •Директива IRP
- •Директива IRPC
- •Директивы условной
- •Директивы условной компиляции
- •Директивы условной компиляции
- •Директивы IF и IFE
- •Директивы IF и IFE
- •Директивы IFDEF и IFNDEF
- •Директивы IFDEF и IFNDEF
- •Директивы IFB и IFNB
- •Директивы IFB и IFNB
- •Директивы IFIDN, IFIDNI, IFDIF и IFDIFI
- •Директивы IFIDN, IFIDNI, IFDIF и IFDIFI
- •Директивы IFIDN, IFIDNI, IFDIF и IFDIFI
- •Вложенные
- •Директивы генерации ошибок
- •Безусловные директивы генерации ошибки
- •Условная генерация пользовательской ошибки
- •Условная генерация пользовательской ошибки
- •Условная генерация пользовательской ошибки
- •Пример с использованием константных выражений
Директивы IF и IFE
Синтаксис директив IF(E):
IF(E) логическое_выражение фрагмент_програмы_1
ELSE фрагмент_програмы_2
ENDIF
Для директивы IF: первый фрагмент вставляется в текст программы, если значение логического выражения «Истина». В противном случае в текст программы вставляется второй фрагмент (если он есть).
Для директивы IFE наоборот.
Директивы IF и IFE
Макрос создания массива размером от 10 до 50 элементов:
def_arr |
|
MACRO len |
IF |
len GE 50 |
|
|
GOTO exit |
|
ENDIF |
|
|
IF |
len LT 10 |
|
|
:exit |
|
|
EXITM |
|
ENDIF |
|
|
rept |
|
len |
endm |
db |
0 |
|
|
|
ENDM |
|
|
… |
|
|
def_arr |
25 |
;Будет сгенерирован массив |
def_arr |
100 |
;Массив с генерирован не будет |
|
|
|
Директивы IFDEF и IFNDEF
Синтаксис директив IFDEF и IFNDEF:
IF(N)DEF символическое_имя фрагмент_програмы_1
ELSE фрагмент_програмы_2
ENDIF
Для директивы IFDEF: первый фрагмент вставляется в текст программы, если символическое имя определено. В противном случае в текст программы вставляется второй фрагмент (если он есть).
Для директивы IFNDEF наоборот.
Директивы IFDEF и IFNDEF
Пример: если значение mode равно 0, то сгенерировать фрагмент для вычисления выражения X*(2^n), в противном случае для выражения X/(2^n).
IFNDEF mode |
|
|
|
EXITM |
|
ELSE |
|
|
|
mov cl, n |
|
|
IFE mode |
|
|
sal |
x, cl |
|
ELSE |
|
|
sar |
x, cl |
|
ENDIF |
|
ENDIF |
|
|
|
|
|
Директивы IFB и IFNB
Синтаксис директив IFB и IFNB:
IF(N)B аргумент фрагмент_програмы_1
ELSE фрагмент_програмы_2
ENDIF
Директива IFB проверяет равенство аргумента пробелу. В качестве аргумента могут выступать имя или число. Если его значение равно пробелу (т.е. фактический аргумент при вызове макрокоманды не был задан, то в текст программы вставляется первый фрагмент. В противном случае – второй фрагмент (если он был задан).
Для директивы IFNB наоборот.
Директивы IFB и IFNB
Создать макрос очистки регистра, с проверкой указания имени регистра.
cls_reg macro reg IFB<reg>
display “No register!” EXITM
ENDIF
xor |
reg, reg |
ENDM
…
cls_reg ax |
-> |
xor |
ax,ax |
cls_reg |
-> |
Вывод No register! |
|
|
|
|
|
Директивы IFIDN, IFIDNI, IFDIF и IFDIFI
Эти директивы позволяют не просто проверить наличие или значение аргументов макрокоманды, но и выполнить идентификацию аргументов как строк символов.
IFIDN(I) аргумент_1, аргумент_2 фрагмент_программы_1
ELSE фрагмент_программы_2
ENFIF
IFIDIF(I) аргумент_1, аргумент_2 фрагмент_программы_1
ELSE фрагмент_программы_2
ENFIF
Директивы IFIDN, IFIDNI, IFDIF и IFDIFI
В этих директивах проверяются аргумент_1 и аргумент_2 как строки символов. Для директивы IFIDN(I): если результат сравнения положительный, то в текст программы вставляется первый фрагмент. В противном случае в текст программы вставляется второй фрагмент (если он есть).
Для директивы IFDIF(I) наоборот.
Различие директив IFDIF и IFDIFI, IFIDN и IFIDNI заключается в: различаются ли большие и маленькие буквы.
Директивы IFDIFI и IFIDNI – не различают, директивы IFDIF и IFIDN
– различают.
Директивы IFIDN, IFIDNI, IFDIF и IFDIFI
Создать макрос, который проверят имя какого регистра было передано в макрос: ah |
||
или al. |
|
|
my_macro |
MACRO reg |
|
IFDIFI |
<al>, <reg> |
|
GOTO M_AL |
|
|
ELSE |
|
|
IFDIFI |
<ah>, <reg> |
GOTO M_AH ELSE
EXITM ENDIF ENDIF :M_AL
…
:M_AH
…
ENDM
Вложенные
Длямакродирективысоздания большего количества ветвлений используется дополнительная конcтрукция ELSEIFxx, которая реализована для всех макродиректив IFxx.
Пример: |
|
my_macro |
MACRO reg |
IFDIFI |
<al>, <reg> |
GOTO M_AL |
|
ELSEIFDIFI |
<ah>, <reg> |
GOTO M_AH
ELSE
EXITM
ENDIF
:M_AL
…
:M_AH
…
ENDM