Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 149

Unknown Author

Примеры:

IFIDN <a+b>,<a+b>    -    условие    выполнено

IFIDN <a+b>,<a>    -    условие    не выполнено

IFIDN <а+Ь>,<а+В>    -    условие    не выполнено

Обе эти директивы имеет    смысл использовать лишь внутри тела макроса (или

5лока повторения), указывая в сравниваемых текстах формальные параметры макроса. При макроподстановке эти параметры будут заменяться на фактические параметры, и это позволяет проверить, заданы ли при обращении к макросу фактические параметры определенного вида или нет.

В качестве примера опишем в виде макроса ММ R1,R2,T (где R1 и R2 - имена байтовых регистров, содержимое которых трактуется как знаковые числа, а Т • слово МАХ или MIN) операцию R1:=T(R1,R2), т. е. запись в R1 либо максимума чисел R1 и R2 (при Т=МАХ), либо минимума.

Прежде всего отметим, что этот макрос должен генерировать непустое макрорасширение, только если R1 и R2 - разные регистры (при обращении же, скажем, ММ AL,AL,MAX менять значение AL не надо). Как проверить несовпадение двух первых фактических параметров макроса? Отметим, что директива IF R1 NE R2 здесь не проходит, т. к. оператор NE предназначен для равнения чисел, а нам надо сравнить имена регистров. Зато здесь проходит директива IFDIF <R1>,<R2>, в которой при макроподстановке формальные параметры R1 и R2 будут заменены на имена регистров (для указанной выше Макрокоманды эта директива примет вид IFIDN <AL>,<AL>), что и позволит сравнить эти имена.

Далее. Чтобы определить, что именно надо вычислять - максимум или Минимум, надо проверить третий фактический параметр: МАХ это или MIN? ^Делать это можно, например, с помощью директивы IFIDN <Т>,<МАХ>: при

\

макроподстановке формальный параметр Т будет заменен на третий фактический параметр, который тем самым и будет сравниваться со словом МАХ.

И последнее. Вычисления максимума и .минимума различаются лишь одной командой - командой условного перехода:

;Rl:=max(Rl,R2) CMP R1,R2 JGE L MOV Rl,R2 L:

;R1:=min(Rl,R2) CMP R1,R2 JLE L MOV Rl,R2 L:

поэтому не имеет смысла в макроопределении дважды выписывать эту практически одинаковую группу команд, а достаточно выписать ее лишь раз, поместив вместо команды условного перехода IF-блок, который в зависимости от параметра Т выберет нужную команду условного перехода.

С учетом всего сказанного получаем такое описание макроса ММ:

ММ MACRO Rl,R2,T LOCAL L

IFDIF <R1>,<R2> CMP Rl,R2 IFIDN <T>,<MAX> JGE L ELSE JLE L END IF MOV Rl,R2 L:

END IF ENDM

;;R1 и R2 - разные регистры?

;;T=MAX?

;да - поместить JGE L в макрорасширение

;;нет - поместить JLE L

Приведем этапы макроподстановки для макрокоманды ММ AL,BH,MIN после того, как в теле макроса формальные параметры были заменены на фактические параметры,, а локальная метка L - на специмя (скажем, ??0105):

IFDIF <AL>,<BH>

CMP AL,BH

CMP AL,BH

CMP AL,BH

IFIDN <MIN> t<MAX>

IFIDN <MIN>,<MAX>

JLE ??0105

JGE ??0105

JGE ??0105

MOV AL,BH

ELSE

ELSE

??0105:

JLE ??0105

JLE ??0105

END IF