Мы решили эту проблему, создав символы ?р2sw ..., которые на
втором проходе анализируются на необходимость установки в нулевые
значения. Имя получается из Switch (переключателя) фазы 2.
Этот
процесс проверки предоставляет хорошую возможность выявить, при-
надлежат ли уровни вложенности самому верхнему уровню, указывая,
что конструкции IF-IFEND, DOWHILE-DOEND и т.д. спарены правильно.
В Листинге 1-16 приведены простые примеры расширения макросов
структурного управления, определенных ранее.
Как можно видеть, мы
подавили те части расширения, которые не вырабатывают код или
метки переходов. Если Вы хотите ознакомиться с работой этих мак-
росов более детально, используйте директиву .LALL.
avast home, panda antivirus, asplinux 11, avast 4 professional, система распознавания текста, .
norton
Однако выбор скрытой
возможности вызывает проблемы будущей совместимости и даже реали-
зуемости. Кроме того, Вы всегда должны задаваться вопросом, может
ли неподдерживаемая или несанкционированная функция зависеть от
реализации совместимости. Решение этой дилеммы остается за чита-
телем.
Авторы использовали эту несанкционированную возможность в
программе, не генерирующей программного кода, но решающей знаме-
нитую задачу "Ханойские башни" в рекурсивной манере. Кроме того,
для достижения общности наш метод создания символов счетчиков из
нескольких частей позволяет при необходимости создавать новые
счетчики. Перед своим использованием эти счетчики должны инициа-
лизироваться, в противном случае первая попытка увеличить или
- 1-41 -
уменьшить их значение вызовет ошибку "Символ не определен". Ис-
пользуя условный оператор IFDEF, можно проверить, требуется ли
инициализация при каждом использовании символа.
Инициализация связана еще с одной тонкостью работы MASM. Как
мы установили, MASM является двухпроходным ассемблером, определя-
ющим символы при первом проходе и затем использующим их при вто-
ром. Это значит, что определения символов защищены от первого
прохода ко второму. Таким образом, когда MASM начинает второй
проход, все счетчики первого прохода уже определены и содержат
свои старые значения. Если в начале второго прохода переинициали-
зация символов не происходит,возникает фазовая ошибка, так как
начальные значения счетчиков отличаются.
Для инициализации символов на первом проходе необходима конс-
трукция IFDEF, так как заранее мы не знаем, сколько счетчиков
потребуется, а использования IFDEF на втором проходе недостаточ-
но.