Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Endif endif
MOV AL,BH MOV AL, BH ??0105:??0105: ENDIF Как уже отмечалось, при сравнении текстов в директивах IFIDN и IFDIF большие и малые буквы не отождествляются. Это неприятная особенность данных директив. Обычно сих помощью в макросах сравниваются имена переменных и регистров, а эти имена в текстах программ могут записываться как малыми, так и большими буквами или вперемежку, и если при обращении к макросу имена записаны не теми буквами, как предусмотрел автор макроса, то - тот макрос может сформировать неправильное макрорасширение. Например, по макракоманде ММ АL,АН,Мах будет построена группа команд для вычисления минимума (!) чисел из регистров АL и АН, т. к. в теле макроса ММ директива IFIDN будет сравнивать тексты Мах и МАХ, которые не совпадают. Как преодолеть этот недостаток? Можно предложить следующий метод: берем все возможные варианты записи имени (например, АН, АL, аН и аL) и с помощью IRР-блока и директивы IFIDN проверяем, не совпадает ли заданное имя с одним из этих вариантов; если совпадает, тогда некоторому вспомогательному имени с помощью директивы присваивания (=) даем одно значение, не совпадает - другое; затем это значение нужно проверить директивой IF. Эти действия (кроме последней проверки) можно описать в виде следующего макроса SAME N,LN,F (где N - то, что проверяем; LN - список (в уголках, через запятую) всех возможных вариантов записи имени, для которого делаем проверку; F - имя, которому присваивается результат проверки: -1 (истина) - есть совпадение, 0 - нет): SAME MACRO N,LN,F F=0;;присвоить 0 имени F (на случай несовпадения) IRP V,<LN>;; для каждого варианта V из LN выполнить: IFIDN <V>,<N>;; если V совпал с N, то F = -1;;перепресвоить F значение -1 EXITM;;прекратить макроподстановку ENDIF ENDM ENDM Хотя макроподстановка для этого макроса может выполняться достаточно долго, в конце концов генерируется либо одна, либо две директивы присваивания, например: SАМЕ АH,<АН,Аh,аН,аh>,АХ? à АХ?=0 АХ?= -1 SАМЕ bh,<АН,Аh,аН,аh>,АХ? à АХ?=0 Используем SАМЕ для описания в виде макроса САLL_Р Х команд обращения к процедуре Р, параметр (X) для которой передается через регистр АХ. В общем случае этот макрос должен обозначать следующие команды: MOV AX,X CALL P Однако, если в качестве Х указан регистр АХ, то первая команда не нужна. Таким образом, здесь надо сравнивать Х с именем АХ, причем с любым из возможных вариантов его записи. Для этого мы и воспользуемся макросом SАМЕ, причем имя, которому присваивается результат проверки, локализуем в макросе СALL_Р: CALL_P MACRO X LOCAL F SAME X,<AX,Ax,aX,ax>,F IFE F MOV AX,X ENDIF CALL P ENDM Теперь рассмотрим еще две IF-директивы: IFВ <t> IFNB <t> Они фактически являются вариантами директив IFIDN и IFDIF, когда второй текст пуст. В директиве IFВ (if blank, если пусто) условие считается выполненным, если текст t пуст, а в директиве IFNВ (if not blank)- если текст t не пуст. Эти директивы используются в макросах для проверки, задан ли фактический; параметр или нет (не задать параметр - значит указать в соответствующей позиции макрокоманды пустой текст). Например, макроопределение DEF MACRO X, V IFB <V>;параметр V не задан (пустой)? X DB? ELSE X DB V ENDIF ENDM описывает макрос DEF Х,N, по которому определяется байтовая переменная Х с начальным значением V, если оно указано, или без него: DEF A,6 ─────> A DB 6 DEF B ─────> B DB? Далее рассматривается пример разработки и моделирования программы для ГМ одного из вариантов курсового проекта.
Date: 2015-10-21; view: 325; Нарушение авторских прав |