Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсач гофаров 5 вариант.doc
Скачиваний:
6
Добавлен:
03.05.2019
Размер:
608.77 Кб
Скачать

113.8. Директива ехiтм

Рассмотрим еще одну директиву макроязыка:

ЕХIТМ

У этой директивы нет операндов. Ее можно использовать только внутри макрооп­ределений и блоков повторения, т. е. внутри конструкций макроязыка, оканчиваю­щихся директивой ЕNDМ. Встретив директиву ЕХIТМ, макрогенератор завершает обработку ближайшего объемлющего макроопределения или блока повторения.

Например, при макроопределении

A MACRO K

RЕРТ К

DB 0

ЕХIТМ

ENDM

DW ?

ЕNDМ

Макрокоманда А 5 будет заменена на следующий текст:

DW 0

DW ?

Здесь макрогенератор, создавая первую копию тела блока повторения, перенесет предложение DВ 0 в макрорасширение, а затем, встретив ЕХIТМ, полностью завершит обработку этого блока, но не покинет тело макроса - он "перескочит" за ближайшую директиву ЕNDM, т. е. на предложение DW ?. Более содержательные примеры на директиву ЕХITМ будут приведены позже (они требуют знания условных директив). Пока лишь отметим, что эта директива ис­пользуется тогда, когда при выполнении некоторого условия надо досрочно (не доходя до ЕNDМ) прекратить макроподстановку или "раскрутку" блока повторения.

3. 9. Переопределение и отмена макросов

В отличие от других объектов программы на ЯА, макросы можно пере­определить или уничтожить. Если в тексте программы описать макрос с именем, которым ранее был обозначен другой макрос, то с этого момента прежний макрос считается уничтоженным, а новый макрос - действующим. Например:

A MACRO X

INC X

ENDM

A CX  INC CX

A MACRO Y,Z

CMP Y, 0

JE Z

ENDM

A BH, EQ  CMP BH ,0

JE EQ

Макрос можно и просто уничтожить, не определяя новый макрос с тем же именем, для чего надо воспользоваться следующей директивой:

РURGE <имя макроса> {,<имя макроса>}

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

PURGE A, ININT

к макросам А и ININТ уже нельзя обращаться.

4. Условное ассемблирование

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

<IF –директива> <IF –директива>

<фрагмент-1> или <фрагмент-1>

ELSE ENDIF

<фрагмент-2>

ENDIF

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

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