Макрокоманды, использующие директивы 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