ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



4. Условные директивы
               Язык  ассемблера  включает  в  себя условные директивы
         двух типов: директивы условного ассемблирования и  директивы
         условной     генерации     ошибок.     Директива   условного
         ассемблирования    обеспечивает    ассемблирование     блока
         предложений  лишь  в  том  случае,  если  истинно заданное в
         директиве  условие.  Директива  условной  генерации   ошибки
         проверяет  заданное  в ней условие и генерирует ошибку, т.е.
         формирует сообщение в листинге программы и обеспечивает  код
         возврата,  соответствующий наличию ошибки в исходном тексте,
         если это условие истинно.
               Директивы  обоих  типов  проверяют   условия   времени
         ассемблирования.  Они не могут анализировать условия времени
         выполнения, т.к. последние не могут быть вычислены до  того,
         как  программа начнет выполняться. В условиях допустимы лишь
         выражения, преобразуемые в константы при ассемблировании.
               Директивы  условного   ассемблирования   и   директивы
         условной генерации ошибок описаны в следующих двух разделах.
               
               
               
               
               
               
               
                    4.1. Директивы условного ассемблирования.
               
               
               Директивы   условного   ассемблирования   позволяют  в
         некоторой степени  управлять  процессом  ассемблирования.  В
         зависимости  от  значений  условий  времени ассемблирования,
         проверяемых   этими   директивами,   макроассемблер    может
         пропустить обработку целого блока предложений или обработать
         вместо него другой (альтернативный) блок.
               Блок  предложений  условного   ассемблирования   имеет
         следующий общий вид:
               
               директива-условного-ассемблирования
                          ..........
                     предложения ассемблера или инструкции
                          ..........
               [[ ELSE ]]
                          ..........
                     предложения ассемблера или инструкции
                          ..........
               ENDIF

                                   - 17 -
         
         
               
               Директива-условного-ассемблирования  задает   условие,
         при   истинном   значении  которого  будут  ассемблироваться
         предложения, расположенные непосредственно после директивы и
         до ключевого слова ELSE, или,  если оно  опущено,  до  конца
         блока,  обозначаемого  ENDIF.  Если  условие не выполняется,
         ассемблируется  группа  предложений,   расположенная   между
         ключевыми  словами  ESLE  и ENDIF, а если ELSE опущено, MASM
         пропускает блок.
               Допускается вложенность директив. Максимальная глубина
         вложения - 255.
               В  качестве  директивы-условного-ассемблирования могут
         задаваться конструкции, приведенные в таблице 4.1.
               
               
             Таблица 4.1. Директивы условного ассемблирования.
               ____________________________________________
               |                                          |
               |     IF     выражение                     |
               |__________________________________________|
               |                                          |
               |     IFE    выражение                     |
               |__________________________________________|
               |                                          |
               |     IF1                                  |
               |__________________________________________|
               |                                          |
               |     IF2                                  |
               |__________________________________________|
               |                                          |
               |     IFDEF  имя                           |
               |__________________________________________|
               |                                          |
               |     IFNDEF имя                           |
               |__________________________________________|
               |                                          |
               |     IFB    <аргумент>                    |
               |__________________________________________|
               |                                          |
               |     IFNB   <аргумент>                    |
               |__________________________________________|
               |                                          |
               |     IFIDN  <аргумент-1>,<аргумент-2>     |
               |__________________________________________|
               |                                          |
               |     IFDIF  <аргумент-2>,<аргумент-2>     |
               |__________________________________________|
               
               
               В  случае  директивы  IF  блок  ассемблируется,   если
         указанное выражение истинно (не  нуль).  Для  директивы  IFE
         блок  ассемблируется, если выражение ложно (нуль). Выражение
         должно  иметь  абсолютное  значение  и  не  может  содержать
         ссылок вперед.
               Директивы IF1 и IF2 проверяют номер прохода ассемблера

                                   - 18 -
         
         
         и обеспечивают обработку  блока  только  на  1-м  (IF1)  или
         только на 2-м (IF2) проходе.
               
                 Пример (выдача сообщений на консоль):
               
               IF1
                %OUT Pass 1
               ELSE
                %OUT Pass 2
               ENDIF
               
               Директивы  IFDEF  и  IFNDEF проверяют, определено ли в
         программе указанное имя. IFDEF обеспечивает ассемблирование,
         если  это  имя  определено как метка, переменная или символ,
         IFNDEF -  если  имя  не  определено.  Заметим,  что  если  в
         качестве   имени   задана   ссылка   вперед,  она  считается
         неопределенной на 1-м проходе и определенной на 2-м.
               Имена  можно  определять  не  только  указанием  их  в
         соответствующей   позиции   при   мнемонике  инструкции  или
         директивах определения памяти, но в опции ассемблера /D, что
         позволяет управлять составом  ассемблируемой  программы  без
         изменения исходного файла.
               Директивы  IFB  и  IFNB  проверяют значение указанного
         аргумента,  трактуемого  как  строка  символов,  и  вызывают
         ассемблирование блока, если аргумент является пробелом (IFB)
         или  отличен  от пробела (IFNB). Аргумент может быть именем,
         числом или выражением. Скобки < и > обязательны.
               Директивы IFB  и  IFNB  введены для использования их в
         макроопределениях,   где   они   могут   управлять  условным
         ассемблированием, основываясь на том, задан или нет параметр
         макроопределения. В этом случае в качестве аргумента следует
         задавать один из формальных параметров макроопределения.
               Директивы IFDIF и IFIDN  сравнивают  специфицированные
         для  них аргументы, которые трактуются как символьные строки
         (с учетом регистра), и вызывают ассемблирование блока при их
         идентичности  (IFIDN)  или неидентичности (IFDIF). Аргументы
         могут быть именами, числами или выражениями. Скобки  <  и  >
         обязательны. Аргументы разделяются запятой.
               Директивы IFDIF и IFIDN введены для использования их в
         макроопределениях,  где   они   могут   управлять   условным
         ассемблированием,   анализируя   значения   передаваемых   в
         макроопределение  параметров.  В  этом  случае  в   качестве
         аргументов    следует    задавать    формальные    параметры
         макроопределения.
               
               
               
               
               
               
                    4.2. Директивы условной генерации ошибок.
               
               
               Использование   директив   условной  генерации  ошибок
         позволяет контролировать ситуации, не нашедшие  отражения  в

                                   - 19 -
         
         
         синтаксисе  языка  ассемблера.  Например,  при  помощи такой
         директивы можно вызвать генерацию  сообщения  об  ошибке  и,
         соответственно,   установку   минимального   кода   возврата
         транслятора в случае использования регистра AX,  что с точки
         зрения   синтаксиса  не  является  ошибкой,  но  может  быть
         недопустимо по логике программы. 
               Обработка любой директивы условной  генерации  ошибок,
         кроме  .ERR1, с истинным условием эквивалентна распознаванию
         фатальной ошибки (с кодом  возврата  7),  при  которой  MASM
         уничтожает объектный файл.
               Форматы  директив  и соответствующие им сообщения MASM
         приведены в таблице 4.2.
               
               
               Таблица 4.2. Директивы условной генерации ошибок.
         ____________________________________________________________
         |                   |                                      |
         |     Синтаксис     |       Номер и текст сообщения        |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERR1             | 87 Forced error - pass 1             |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERR2             | 88 Forced error - pass 2             |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERR              | 89 Forced error                      |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRE выражение   | 90 Forced error - expression equals 0|
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRNZ выражение  | 91 Forced error - expression not     |
         |                   |    equals 0                          |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRNDEF имя      | 92 Forced error - symbol not defined |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRDEF имя       | 93 Forced error - symbol defined     |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRB <строка>    | 94 Forced error - string blank       |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRNB <строка>   | 95 Forced error - string not blank   |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRIDN <стро-    | 96 Forced error - strings identical  |
         |  ка-1>,<строка-2> |                                      |
         |___________________|______________________________________|
         |                   |                                      |
         | .ERRDIF <стро-    | 97 Forced error - strings different  |
         |  ка-2>,<строка-2> |                                      |
         |___________________|______________________________________|

                                   - 20 -
         
         
         
               
               Директива  .ERR  обеспечивает  безусловную   генерацию
         сообщения  об  ошибке.  Директивы  .ERR1   и   .ERR2   также
         безусловно воздействуют  соответственно  лишь  на  1-й и 2-й
         проход транслятора. Директива .ERR1  вызывает  не  фатальную
         ошибку, а предупреждение. 
               Директивы .ERRNZ и .ERRE вычисляют значение указанного
         выражения  и  обеспечивают  появление  сообщения  об  ошибке
         соответственно в случае  истинности  (1)  или  ложности  (0)
         этого выражения.
               Директива  .ERRDEF  обеспечивает  появление  фатальной
         ошибки, когда  указанное  имя  определено  в  программе  как
         метка,  переменная  или символ, а директива .ERRNDEF - когда
         имя еще не определено. Если это имя является ссылкой вперед,
         оно  считается  неопределенным на 1-м проходе и определенным
         на 2-м. Эти директивы работают на 1-м проходе.
               Директивы .ERRB и .ERRNB анализируют указанную  строку
         и  обеспечивают  генерацию  сообщения  об  ошибке,  если эта
         строка соответственно содержит все пробелы или нет.
               Директивы  .ERRIDN  и   .ERRDIF   вызывают   появление
         фатальной   ошибки,  если  указанные  строки  соответственно
         идентичны или различны.


© KOAP Open Portal 2000