Существует два класса условных директив: директивы условного ассемблирования и условные директивы генерации сообщений об ошибке. С помощью директив условного ассемблирования вы можете управлять тем, какой код будет ассемблироваться в программе при определенных условиях.
Директивы условного ассемблирования позволяют вам генерировать во время ассемблирования сообщения об ошибках при наступлении определенных событий. Турбо Ассемблер выводит сообщение об ошибке на экран и в файл листинга и предотвращает создание объектного файла. В данной главе описывается, как можно использовать имеющиеся условные директивы.
Синтаксис условных директив
Тремя директивами условного ассемблирования являются директивы IFxxx, ELSEIFxxx и ERRxxx. Эти директивы используются также, как операторы условия в языках высокого уровня.
Директива условного ассемблирования IFxxx
Вы можете использовать директиву условного ассемблирования IFxxx для определения блока кода, который включается в объектный файл при удовлетворении определенных условий (таких как определение идентификатора или установка какого-то значения). Приведем синтаксис оператора условного ассемблирования:
IFxxx тело_условия_true EMDIF
или
IFxxx тело_условия_true ELSE тело_условия_false ENDIF
где IFxxx представляет следующие директивы:
IF IF1 IF2 IFDEF IFNDEF IFB IFNB IFIDN IFIDNI IFDIF IFDIFI
Каждая директива условного ассемблирования IFxxx задает конкретное условие, при вычислении которого получается истинное (true) или ложное (false) значение. Если условие имеет значение true, то выполняется ассемблирование и помещение в объектный файл блока ассемблируемого кода "тело_условия_true". Если при вычислении условия получается значение false, то Турбо Ассемблер пропускает "тело_условия_true" и не включает его в объектный файл. При наличие директивы ELSE, если условие имеет значение false, то ассемблируется и выводится в объектный файл блок "тело_условия_false". Если условие имеет значение true, то этот блок игнорируется. Условный блок завершается директивой ENDIF.
Кроме особых случаев директив IF1 и IF2 (которые мы обсудим позднее) два описанных блока кода являются взаимноисключающими: в объектный файл включается либо "тело_условия_true", либо "тело_условия_false", но не оба блока одновременно. Кроме того, если вы используете форму IFxxx.ELSE.ENDIF, один из блоков будет обязательно включаться в объектный файл. Если используется форма IFxxx.ENDIF, то "тело_условия_true" может включаться или не включаться в объектный файл, в зависимости от условия.
При использовании вложенных директив IF и ELSE директива ELSE всегда соответствует ближайшей директиве IF.
В следующем примере test является идентификатором, который управляет включением кода (если идентификатор не определен, то генерируется соответствующий блок кода) Идентификатор color устанавливается в ненулевое значение, если дисплей цветной, и равен 0, если дисплей монохромный.
От этих значений зависит фактическая генерация кода:
. . . IFDEF test ; true, если test определен ; первая часть блока кода ; если test определен IF color ; true, если color <> 0 ; блок кода color ; если color <> 0 ELSE ; ; код для монохромного ; дисплея если color = 0 ENDIF ; ; вторая часть блока кода ; если test определен ELSE ; ; другой код ; если test не определен ENDIF . . .
test color | определен 0 | определен не 0 | не определен 0 | не определен не 0 | код | блок кода 1 | блок кода 1 | другой код | другой код | цветной/моно | блок кода color | блок кода 2 | блок кода 2 | |
Если идентификатор test не определен,то не ассемблируется ни код для цветного дисплея (color), ни для монохромного, поскольку все это включено в блок условного ассемблирования, который ассемблируется только при определенном идентификаторе test.
1 2 3 4
8 8 8
|