Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 курс / Лекции / Лекция 23 -Макросы.ppt
Скачиваний:
42
Добавлен:
18.02.2023
Размер:
199.68 Кб
Скачать

Директивы 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