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


5. ОБРАБОТКА IF-БЛОКОВ.


 

            Напомню, что с помощью IF-блоков реализуется условное ассемблирование, т.е. возможность вставлять или не вставлять в окончательный текст программы какие-то фрагменты исходного текста.

            IF-блоки имеют следующий вид:

        <IF-директива>

          <фрагмент-1>

        ELSE

          <фрагмент-2>

        ENDIF

причем часть ELSE может отсутствовать. Смысл этой конструкции следующий: если условие в IF-директиве выполнено, тогда в окончательный текст программы попадает фрагмент-1 и не попадает фрагмент-2, а если условие не выполнено, то, наоборот, в окончательный текст программы не попадает фрагмент-1, а попадает фрагмент-2 (если части ELSE нет, то в последнем случае IF-блок ничего не поставляет в окончательный текст программы).

            Действия макрогенератора при обработке IF-блоков очевидны. Встретив какую-то из IF-директив (например, IF или IFIDN), макрогенератор проверяет ее условие. Если оно выполнено, то макрогенератор передает ассемблеру все строки до директивы ELSE; саму же директиву ELSE и все последующие строки до ENDIF макрогенератор пропускает. Если же условие не выполнено, тогда макрогенератор пропускает все строки до ELSE и только затем начинает передавать ассемблеру строки между ELSE и ENDIF.

            Единственная, пожалуй, проблема, которая возникает при обработке IF-блоков, связана с вложенностью IF-блоков. Рассмотрим

такой

пример:

         IF ...

          ...

           IFIDN ...

            ...

           ELSE

            ...

           ENDIF

          ...

         ELSE

          ...

         ENDIF

Если условие в директиве IF не выполнено, то макрогенератор должен пропустить все строки до директивы ELSE, но не до первой встретившейся, а до "своей", т.е. он должен проигнорировать все вложенные IF-блоки.

            Эта проблема аналогична задаче проверки произвольного текста на сбалансированность по круглым скобкам, и решается она аналогично. Поскольку на семинарах задачу со скобками вы решали, то укажу лишь идею решения. Вводится счетчик, указывающий уровень вложенности IF-блоков: при появлении IF-директивы этот счетчик увеличивается на 1, а при появлении директивы ENDIF, он уменьшается на 1. С помощью такого счетчика макрогенератор и отыскивает нужную директиву ELSE - это директива, для которой счетчик имеет то же значение, что и для исходной IF-директивы.




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



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