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

Unknown Author

PURGE <имя макроса> {,<имя макроса>>

После этой директивы все макросы, имена которых в ней перечислены считаются несуществующими. Например, после директивы

PURGE A,ININT

к макросам А и ININT уже нельзя обращаться.11.4. Условное ассемблирование

Если макросы и блоки повторения позволяют избежать многократного выписывания в исходном тексте программы повторяющихся фрагментов, то

рассматриваемое в данном разделе средство макроязыка

условное

ассемблирование - удобно при многократных прогонах программы. Оно дает возможность в исходном тексте держать несколько вариантов одного и того же участка программы, а при каждом ее прогоне оставлять в окончательном тексте только один из них. Какой именно вариант будет оставлен, зависит от тех или иных условий, которые автор программы задает перед прогоном. Выгода от такой условной сборки окончательного текста программы заключается в том, что автор программы не должен перед каждым ее прогоном вручную редактировать ее текст (это чревато ошибками и требует значительного времени), а возлагает эту работу на макрогенератор (он работает без ошибок и быстрее).

Участок программы, затрагиваемый условным ассемблированием, должен записываться в виде так называемого IF-блока:

<1Р-директива> ^фрагмент-1>

else

^parMeHT-2>

ENDIF

или

<1Р-директива> «фрагмент-1 > END IF

Директивы ELSE и ENDIF обязательно должны записываться в отдельных строчках. В каждом же фрагменте может быть любое число любых предложений, в частности в них снова могут быть IF-блоки, т. е. допускается вложенность IF-блоков.

В IF-директиве (имеется несколько разновидностей ее) указывается некоторое условие, которое проверяется макрогенератором. Если условие выполнено, то макрогенератор оставляет в окончательном тексте программы только фрагмент-1, а фрагмент-2 исключает, не переносит в окончательный текст. Если же условие не выполнено, тогда фрагмент-1 игнорируется, а в окончательную программу вставляется только фрагмент-2. Если части ELSE нет, то считается, что фрагмент-2 пуст, поэтому при невыполнении условия такой IF-блок ничего не "поставляет" в окончательный текст программы.

Поскольку условие в IF-директиве проверяется на этапе макрогенерации, то, вполне естественно, в нем не должно быть ссылок на величины, которые станут известными только при выполнении программы (например, в условии нельзя ссылаться на содержимое регистров или ячеек памяти). Более того, условие должно быть таким, чтобы макрогенератор мог вычислить его сразу, как только встретит его (например, в нем не должно быть ссылок вперед).

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

11.4.1. Директивы IF и IFE

Эти директивы имеют следующий вид:

Встречая любую из этих директив, макрогенератор вычисляет указанное к ней константное выражение. В директиве IF условие считается выполненным, если значение выражения отлично от 0, а директиве IFE (if equal, если равно) - если значение равно 0.