АССЕМБЛЕР. Компоновщик. Загрузчик. Макрогенератор


2.2 Обработка макрокоманд. - часть 4


            Теперь НС=13. Это директива ENDM, признак конца МО. Действия макрогенератора в этом случае такие (рис. г). Во-первых, он очищает стек от всего того, что было записано сюда, когда началась обработка последней МК, и при этом восстанавливает в НС то значение, которое хранилось в стеке (у нас НС=16); это как раз номер строки с той МК, из-за которой макрогенератор попал в МО. Во-вторых, счетчик УР уменьшается на 1 (УР=1), чем фиксируется выход из МО. На этом обработка тела макроса M1

полностью закончена и соответствующее макрорасширение получено. Макрогенератор увеличивает НС на 1 (НС=17) и переходит к предложению, следующему за МК.

            Итак, НС=17. Поскольку снова УР?0, то выполняется замена формальных параметров на фактические, но уже, естественно, используется табличка соответствия, которая сейчас находится в верху стека:

MOV Z,AX  -->  MOV [BX],AX

Поскольку это обычное предложение ЯА, то макрогенератор его не обрабатывает, а передает ассемблеру, т.е. заносит в окончательный текст программы [записать], после чего увеличивает НС на 1.

            Теперь НС=18. Снова директива ENDM, завершающая МО. Действия макрогенератора мы уже знаем: стек очищается от информации, попавшей сюда при появлении МК из строки 28, и в НС восстанавливается значение, хранившееся в стеке (28), т.е. номер МК, из-за которой макрогенератор попал в МО, далее УР уменьшается на 1 (УР=0). На этом наконец-то закончилась обработка МК из 28-й строки.

            Макрогенератор увеличивает НС на 1 и идет дальше.

            Вот так макрогенератор "расправляется" с МК.

            В заключение хочу сделать пару замечаний. Во-первых, если внутри МО макрогенератор встречает директиву EXITM, то он выполняет такие же действия, что и при появлении директивы ENDM, т.е. покидает МО. Во-вторых, хочу обратить ваше внимание на то, что макрогенератор при обработке макрокоманд вовсю использует стек. Это очень важно, т.к. одни макросы могут обращаться к другим и, более того, допускаются рекурсивные макросы, поэтому и приходится спасать информацию о каждой МК в новом месте, а для этого и нужен стек.

 




Начало  Назад  Вперед



Книжный магазин