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


3. ОБРАБОТКА БЛОКОВ ПОВТОРЕНИЯ. - часть 3


            Дальнейшие действия макрогенератора по обработке IRP-блока идут в следующем цикле: если список параметров в стеке не пуст, тогда от списка отщепляется первый параметр и он ставится в соответствие формальному параметру, после чего НС устанавливается на начало тела (рис. в) и начинается просмотр тела блока. Когда будет достигнут конец тела, то эти действия повторяются заново, и так до тех пор, пока список параметров не станет пустым.

             В нашем примере происходит следующее. Поскольку список фактических параметров <1,2> не пуст, то от него отщепляется первый параметр 1 и он ставится в соответствие формальному параметру X. Затем НС устанавливается на начало тела: НС=103, т.е. начинается обработка 103-й строки. В ней прежде всего заменяются все вхождения формального параметра X на текущий фактический параметр 1:

DB X  -->  DB 1

Далее определяется тип полученного предложения. Т.к. у нас это обычное предложение ЯА, то макрогенератор ничего с ним не делает, а передает его на обработку ассемблеру, т.е. это предложение записывается в окончательный вариант программы [записать]. После этого НС увеличивается на 1. Теперь НС=104. Это директива ENDM, оканчивающая тело блока повторения. Макрогенератор делает следующее (рис. г): поскольку у нас еще остались параметры, то из их списка удаляется первый параметр (2) и он ставится в соответствие формальному параметру, после чего НС

снова устанавливается на начало тела блока (НС=103) и снова начинается просмотр тела блока.

            При этом просмотре в окончательный вариант программы будет записано предложение DB 2 [записать], после чего НС станет равным 104 и снова будет достигнута директива ENDM. Т.к. на этот раз список параметров уже пуст, то обработка IPR-блока завершается: из стека удаляется вся информация, относящаяся в этому блоку, и НС увеличивается на 1 (рис. д), т.е. макрогенератор идет по тексту за блок.

            Теперь НС=105. Снова директива ENDM, но уже относящаяся к блоку REPT. (Отмечу, что макрогенератор помимо той информации, о которой я сказал, заносит в стек пометки, по которым можно определить, к какому типу блока повторения относится информация в вершине стека, поэтому макрогенератор знает, какого типа блок только что завершился.) О действиях макрогенератора в данном случае я уже говорил: проверив, что текущее значение (2) счетчика копий отлично от нуля, он уменьшает его на 1 и восстанавливает в НС номер (101) 1-й строки тела блока. Начинается новый просмотр тела блока. И так далее, пока счетчик не станет нулевым. Тогда происходит очистка стека, НС

увеличивается на 1 (НС=106) и макрогенератор переходит к обработке строки, следующей за блоком повторения.

На этом я закончу рассказ про обработку блоков повторения.

 




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



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