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


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


MOV AX,X --> MOV AX,Q

            После такой замены макрогенератор смотрит, что получилось - обычное предложение ЯА или конструкция макроязыка. Для этого он выделяет мнемокод (у нас - MOV) и смотрит, нет ли такого имени в ТМ. Если есть, тогда это МК. Если же нет, тогда макрогенератор просматривает таблицу директив макроязыка и т.д. У нас - обычное предложение ЯА, поэтому макрогенератор передает его на обработку ассемблеру, другими словами, заносит в окончательный текст программы [записать справа от программы]. Когда ассемблер закончит обработку предложения, он возвратит управление макрогенератору, который увеличивает НС на 1 и идет дальше.

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

M1 ADD,Y  -->  M1 ADD,50

Далее макрогенератор выделяет мнемокод и по ТМ узнает, что это имя макрокоманды. Следовательно, очередное предложение - МК. Действия макрогенератора такие же, как и при обработке МК из 28-й строки (рис. в). В стек записывается текущее значение НС (16) и формальные параметры макроса M1 (OP, W) вместе с фактическими параметрами (ADD, 50). Кроме того, в макросе M1 имеется локальное имя (L), которое макрогенератор также записывает в стек, причем ему в соответствие ставится специмя с текущим значением НОМ

(у нас это ??0000), после чего значение НОМ увеличивается на 1 (НОМ=0001); на это специмя и будут заменяться все вхождения L в тело макроса. Далее УР увеличивается на 1 (УР=2), т.к. макрогенератор "входит" в новое МО, и в НС

записывается начало тела макроса M1

(12), взятое из ТМ. Начинается обработка тела макроса M1.

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

L: OP AX,W  -->  ??0000: ADD AX,50

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




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



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