Условные директивы
Помимо использования команд сравнения (cmp…) и различных команд условного перехода (j…) в ассемблере может использоваться конструкция IF, подобная аналогичным операторам из высокоуровневых языков программирования. .IF выражение....ENDIFЕсли значение выражения — ноль (ложь), весь участок программы между IF и ENDIF игнорируется. Директива IF может также сочетаться с ELSE и ELSEIF: .IF выражение... .ELSE... .ENDIFЕсли значение выражения — ноль, ассемблируется участок программы от ELSE до ENDIF, в противном случае — от IF до ELSE. IF выражение1... ELSEIF выражение2... ELSEIF выражение3... ELSE... ENDIFТак, если, например, выражение 2 не равно нулю, будет ассемблироваться участок программы между первой и второй директивой ELSEIF. Если все три выражения равны нулю, ассемблируется фрагмент от ELSE до ENDIF. Данная структура директив может использоваться в частном случае аналогично операторам switch/case языков высокого уровня, если выражения — проверки некоторой целочисленной константы на равенство. Кроме общих директив IF и ELSEIF ассемблеры поддерживают набор специальных команд, каждая из которых проверяет специальное условие: IF1/ELSEIF1 — если ассемблер выполняет первый проход ассемблирования; IF2/ELSEIF2 — если ассемблер выполняет второй проход ассемблирования (часто не работает на современных ассемблерах); IFE выражение/ELSEIFE выражение — если выражение равно нулю (ложно); IFDEF метка/ELSEIFDEF метка — если метка определена; IFNDEF метка/ELSEIFNDEF метка — если метка не определена; IFB < аргумент> /ELSEIFB < аргумент> — если значение аргумента — пробел (эти и все следующие директивы используются в макроопределениях для проверки параметров); IFNB < аргумент> /ELSEIFNB < аргумент> — если значение аргумента — не пробел (используется в макроопределениях для проверки переданных параметров); IFDIF < арг1>, < арг2> /ELSEIFDIF < арг1>, < арг2> — если аргументы отличаются (с различием больших и маленьких букв); IFDIFI < арг1>, < арг2> /ELSEIFDIFI < арг1>, < арг2> — если аргументы отличаются (без различия больших и маленьких букв); IFIDN < арг1>, < арг2> /ELSEIFIDN < арг1>, < арг2> — если аргументы одинаковы (с различием больших и маленьких букв); IFIDNI < арг1>, < арг2> /ELSEIFIDNI < арг1>, < арг2> — если аргументы одинаковы (без различия больших и маленьких букв). Иногда директивы условного ассемблирования используются для того, чтобы прервать ассемблирование программы, если обнаружилась какая-нибудь ошибка. Для таких случаев предназначены директивы условной генерации ошибок. Пример. if $ gt 65535; Если адрес вышел за пределы сегмента..err endifВстретив директиву.ERR, ассемблер прекратит работу с сообщением об ошибке. Аналогично командам условного ассемблирования существуют модификации команды.ERR: .ERR1 — ошибка при первом проходе ассемблирования; .ERR2 — ошибка при втором проходе ассемблирования; .ERRE выражение — ошибка, если выражение равно нулю (ложно); .ERRNZ выражение — ошибка, если выражение не равно нулю (истинно); .ERRDEF метка — ошибка, если метка определена; .ERRNDEF метка — ошибка, если метка не определена; .ERRB < аргумент> — ошибка, если аргумент пуст (эта и все следующие директивы используются в макроопределениях для проверки параметров); .ERRNB < аргумент> — ошибка, если аргумент не пуст; .ERRDIF < арг1>, < арг2> — ошибка, если аргументы различны; .ERRDIFI < арг1>, < арг2> — ошибка, если аргументы отличаются (сравнение не различает большие и маленькие буквы); .ERRIDN < арг1>, < арг2> — ошибка, если аргументы совпадают; .ERRIDNI < арг1>, < арг2> — ошибка, если аргументы совпадают (сравнение не различает большие и маленькие буквы). Пример использования директивы IF. .586
|