ОБРАБОТКА БЛОКОВ ПОВТОРЕНИЯ.
Объяснять действия макрогенератора при обработке блоков повторения я буду на следующем примере:
исходный текст окончательный текст
-------------- -------------------
| ... ...
100 | REPT 3 DW ?
101 | DW ? DB 1
102 | IRP X,<1,2> DB 2
103 | DB X DW ?
104 | ENDM DB 1
105 | ENDM ...
106 | ...
Сразу отмечу, что из-за возможной вложенности одних блоков повторения в другие информация о каждом из них не должна мешать информации о другом, поэтому макрогенератор хранит информацию о каждом блоке повторения в стеке. Как это делается, мы сейчас и рассмотрим.
Пусть НС=100. Анализируя мнемокод из 100-й строки, макрогенератор узнает, что это директива макроязыка, поэтому именно он должен заняться ее обработкой. Эта директива начинает блок повторения типа REPT, по которому в окончательный текст программы должно быть записано 3 копии тела этого блока. Что надо знать макрогенератору при этом копировании? Две вещи: с какой строки начинается тело блока (конец определяется по директиве ENDM) и сколько копий тела осталось еще сделать. С записи этой информации в стек макрогенератор и начинает обработку блока (рис. а): номер первой строки тела определяется как текущее значение НС плюс 1 (у нас это 101), а счетчик оставшихся копий вначале совпадает со значением выражения из директивы REPT (у нас это 3).
Дальнейшие действия макрогенератора идут в следующем цикле: если хранимый в стеке счетчик копий равен 0, тогда обработка блока заканчивается, иначе этот счетчик уменьшается на 1, НС
устанавливается по значению из стека на 1-ю строку тела и затем начинается просмотр тела блока. Когда макрогенератор дойдет до директивы ENDM, все эти действия повторяются заново (счетчик копий уменьшается на 1, НС снова устанавливается на начало тела и т.д.). Этот цикл прекращается, когда при очередном достижении конца тела будет обнаружено нулевое значение у счетчика копий. Тогда макрогенератор проходит по тексту программы дальше.