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


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


 

       а)                б)                 в)                 г)

 

            Итак, НС=28. В 28-й строке находится МК. Как макрогенератор узнает о том, что это МК? Выделив из строки мнемокод, макрогенератор "лезет" в ТМ и смотрит, нет ли там такого имени. Если есть, значит это МК, нет - нечто иное (например, директива макроязыка, что распознается по таблице директив этого языка, или обычное предложение ЯА). В нашем случае имя М имеется в ТМ, поэтому макрогенератор и узнает, что перед ним МК. С нею макрогенератор поступает так (рис. б).

            Во-первых, макрогенератор записывает в стек текущее значение НС (у нас - 28), т.е. номер строки с МК. Это как бы адрес возврата: сейчас макрогенератор перейдет к обработке строк из МО, но затем ему надо будет вернуться к МК; чтобы можно было осуществить такой возврат, номер строки с МК и запоминается в стеке. Во-вторых, используя данные из соответствующей строки ТМ, макрогенератор записывает в стек названия формальных параметров макроса (у нас - X, Y и Z), а рядом с ними записывает фактические параметры, взятые из МК (у нас - Q, 50 и [BX]). Тем самым создана таблица соответствия между формальными и фактическими параметрами, которая будет сейчас использоваться при макроподстановке (МП). В-третьих, макрогенератор увеличивает счетчик УР

на 1 (УР=1); это означает, что макрогенератор "входит" внутрь МО. В-четвертых, макрогенератор присваивает счетчику НС взятый из ТМ номер первой строки тела макроса (у нас НС=15); это значит, что макрогенератор переходит к обработке тела макроопределения.

            Итак, НС=15. Обработку любого предложения программы макрогенератор всегда начинает с проверки, где он сейчас находится - вне или внутри МО. Делается это просто, сравнением УР с 0: если УР=0, то - вне МО, а иначе внутри МО. Зачем это надо знать? А затем, что, находясь внутри МО, макрогенератор всегда начинает обработку предложения с замены в нем всех вхождений формальных параметров на соответствующие фактические параметры. (При этом он не портит текст программы, а строит копию данного предложения.) Делается это так: макрогенератор выделяет в предложении очередное имя и смотрит, есть ли оно среди формальных параметров в таблице соответствия (из стека). Если нет (как в нашем случае для имен MOV и AX), тогда макрогенератор ничего не делает, а если есть (как для X), тогда заменяет это имя на соответствующий фактический параметр:




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



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