Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
|
Директивы ifidn ,ifdif , ifb и ifnb
Вернемся к IF-дирeктивам и следующей рассмотрим такую пару директив: IFIDN < t1 >,< t2 > IFDIF <t1>,<t2> Здесь t1 и t2 - любые тексты (последовательности символов), причем они обязательно должны быть заключены в уголки. Эта тексты посимвольно сравниваются. В директиве IFIDN условие считается выполненным, если эти тексты равны (идентичны, identical), а в директиве IFDIF - если они не равны (различны, different). Отметим, что при сравнении этих текстов большие и малые буквы не отождествляются. Примеры: IFDIF <a+b>,<a+b> -условие выполнено IFDIF <a+b>,<a> -условие не выполнено IFDIF <a+b>,<a+B> -условие не выполнено Обе эти директивы имеет смысл использовать лишь внутри тела макроса (или блока повторения), указывая в сравниваемых текстах формальные параметры макроса. При макроподстановке эти параметры будут заменяться на фактические параметры, и это позволяет проверить, заданы ли при обращении к макросу фактические параметры определенного вида или нет. В качестве примера опишем в виде макроса ММ R1,R2,Т (где R1 и R2 - имена байтовых регистров, содержимое которых трактуется как знаковые числа, а Т -слово МАХ или МIN операцию R1: = Т(R1,R2), т. е, запись в R1 либо максимума чисел R1 и R2 (при Т=МАХ), либо минимума. Прежде всего отметим, что этот макрос должен генерировать непустое макрорасширение, только если R1 и R2 - разные регистры (при обращении же, скажем, ММ АL,АL,МАХ менять значение АL не надо). Как проверить несовпадение двух первых фактических параметров макроса? Отметим, что директива IF R1 NE R2 здесь не проходит, т. к. оператор NE предназначен для сравнения чисел, а нам надо сравнить имена регистров. Зато здесь проходит директива IFDIF <R1>,<R2>, в которой при макроподстановке формальные параметры R1 и R2 будут заменены на имена регистров (для указанной выше макрокоманды эта директива примет вид IFIDN <АL>,<АL>), что и позволит сравнить эти имена. Далее. Чтобы определить, что именно надо вычислять - максимум или минимум, надо проверить третий фактический параметр: МАХ это или МIN? Сделать это можно, например, с помощью директивы IFIDN <T>, <МАХ>: при макроподстановке формальный параметр Т будет заменен на третий фактический параметр, который тем самым и будет сравниваться со словом МАХ. И последнее. Вычисления максимума и минимума различаются лишь одной командой - командой условного перехода: ;R1:=max (R1,R2); R1:=min(R1,R2) CMP R1,R2 CMP R1,R2 JGE L JLE L MOV R1,R2 MOV R1,R2 L: L: поэтому не имеет смысла в макроопределении дважды выписывать эту практически одинаковую группу команд, а достаточно выписать ее лишь раз, поместив вместо команды условного перехода IF-блок, который в зависимости от параметра Т выберет нужную команду условного перехода. С учетом всего сказанного получаем такое описание макроса ММ: MM MACRO R1,R2 T LOCAL L IFDIF <R1>,<R2>;;R1 и R2 – разные регистры CMP R1,R2 IFIDN <T>,<MAX>;; T=MAX? JGE L;;да – поместить JGE L в макрорасширение ELSE JLE L;; нет поместить JLE L ENDIF MOV R1,R2 L: ENDIF ENDM Приведем этапы макроподстановки для макрокоманды ММ AL,BH,MIN после того, как в теле макроса формальные параметры были заменены на фактические параметры, а локальная метка L - на специмя (скажем,??0105):
IFDIF <AL>,<BH> CMP AL,BH CMP AL,BH CMP AL,BH IFIDN <MIN>,<MAX> IFIDN <MIN>,<MAX> JLE??0105 JGE??0105 ────à JGE??0105 ────à MOV AL,BH ELSE ELSE??0105: JLE??0105 JLE??0105 Date: 2015-10-21; view: 513; Нарушение авторских прав |