Макрокоманды, использующие директивы IF и IFNDEF
9.1. Записать в текстовом редакторе следующую программу в СОМ-формате:
.286
TITLE MACRO7 (COM) Проверка директив IF и IFNDEF
;--------------------------------------------
DIVIDE MACRO DIVIDEND,DIVISOR,QUOTIENT
LOCAL COMP
LOCAL OUT
CNTR = 0
; AX=делимое ВХ=делитель СХ=частное
IFNDEF DIVIDEND
; Делитель не определен
CNTR = CNTR +1
ENDIF
IFNDEF DIVISOR
; Делимое не определено
CNTR = CNTR +1
ENDIF
IFNDEF QUOTIENT
; Частное не определено
CNTR = CNTR +1
ENDIF
IF CNTR
; Макрорасширение отменено
EXITM
ENDIF
MOV AX,DIVIDEND ;Загрузить делимое
MOV BX,DIVISOR ;Загрузить делитель
SUB CX,CX ;Регистр для частного
COMP: CMP AX,BX ;Делимое < делителя?
JB OUT ;да - выйти
SUB AX,BX ;Делимое - делитель
INC CX ;Частное + 1
JMP COMP
OUT: MOV QUOTIENT,CX ;Записать результат
ENDM ;Конец макрокоманды
;--------------------------------------------------
CSEG SEGMENT PARA 'Code'
ASSUME CS:CSEG,DS:CSEG,SS:CSEG,ES:CSEG
ORG 100H
BEGIN: JMP SHORT MAIN
;---------------------------------------------------
DIVDND DW 150 ;Делимое
DIVSOR DW 27 ;Делитель
QUOTNT DW ? ;Частное
;---------------------------------------------------
MAIN PROC NEAR
.LALL
DIVIDE DIVDND,DIVSOR,QUOTNT
DIVIDE DIDND,DIVSOR,QUOT
RET
MAIN ENDP
CSEG ENDS
END BEGIN
Программа содержит макроопределение DIVIDE, которое генерирует подпрограмму для выполнения деления вычитанием. Макрокоманда должна кодироваться с параметрами в такой последовательности: делимое, делитель, частное. Макрокоманда содержит директиву IFNDEF для проверки наличия параметров. Для любого неопределенного элемента макрокоманда увеличивает счетчик CNTR. Этот счетчик может иметь любое корректное имя и предназначен для временного использования в макроопределении. После проверки всех трех параметров
макрокоманда проверяет CNTR.
Если счетчик CNTR содержит ненулевое значение, то ассемблер прекращает по директиве EXITM дальнейшее макрорасширение.
Если ассемблер успешно проходит все проверки, то он генерирует макрорасширение. В кодовом сегменте вторая команда DIVIDE содержит неправильное делимое и частное и поэтому генерирует только комментарии.
9.2. Выполнить ассемблирование и компоновку программы. Записать в отчет листинг программы и выводы о работе программы.
Макрокоманды, использующие директиву IFIDN.
10.1. Введите в текстовый редактор файл string.asm из библиотеки ASMLIB. Измените имя файла:
TITLE MACRO8 (EXE) Проверка директивы IFIDN
После имени файла вставьте макрорасширение:
MOVIF MACRO TAG
IFIDN <&TAG>,<B>
REP MOVSB
EXITM
ENDIF
IFIDN <&TAG>,<W>
REP MOVSW
ELSE
; Не указан параметр Вили W, по умолчанию принято В
;---------------------------------------------------
REP MOVSB
ENDIF
ENDM
;----------------------------------------------------
Замените в программе команду REP MOVSB на макрокоманду MOVIF B, и команду REP MOVSW на макрокоманду MOVIF W.
После выполненных изменений программа содержит макроопределение по имени MOVIF, которое генерирует команды MOVSB или MOVSW в зависимости то указанного параметра. Макрокоманду можно кодировать с параметром В (для байта) или W (для слова).
СОДЕРЖАНИЕ ОТЧЕТА:
1. Листинги программ.
2. Выводы о работе программ.
КОНТРОЛЬНЫЕ ВОПРОСЫ:
1. Напишите необходимые директивы для: а) подавления распечатки всех команд, которые генерирует макрокоманда; б) распечатки только команд, генерирующих объектный код.
2. Закодируйте макроопределение для умножения: а) макрокоманда MULTBY должна генерировать код для умножения байта на байт; б) макрокоманда MULTWD должна генерировать код для умножения слова на слово.
Для множителя и множимого необходимо использовать в макроопределении формальные параметры.
ОТВЕТЫ:
1. а) .SALL ; б) .XALL
2. а) MULTBY MACRO TPR,TCD
MOV AL,TCD
MUL TPR
ENDM
б) MULTWD MACRO TPR,TCD
MOV AX,TCD
MUL TPR
ENDM