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


ОБРАБОТКА БЛОКОВ ПОВТОРЕНИЯ.


            Объяснять действия макрогенератора при обработке блоков повторения я буду на следующем примере:

           исходный текст               окончательный текст

           --------------               -------------------

           |  ...                          ...

       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, НС снова устанавливается на начало тела и т.д.). Этот цикл прекращается, когда при очередном достижении конца тела будет обнаружено нулевое значение у счетчика копий. Тогда макрогенератор проходит по тексту программы дальше.



Содержание раздела