3.3.9. Условное ассемблирование

В большинстве языков программирования присутствуют средства, позволяю­щие игнорировать тот или иной участок программы в зависимости от выполне­ния условий, например: в языке С это осуществляется командами препроцессора #if, #ifdef, #ifndef и т. д. Ассемблер тоже предоставляет такую возможность.

if выражение endif

Если значение выражения - ноль (ложь), весь участок программы между IF и ENDIF игнорируется. Директива IF может также сочетаться с ELSE и ELSEIF:

if выражение

else

endif

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

if выражение! elseif выражение2 elseif выражениеЗ else endif

Так, если, например, выражение 2 не равно нулю, будет ассемблироваться учас­ток программы между первой и второй директивой ELSEIF Если все три выражения

Организация программы |

равны нулю, ассемблируется фрагмент от ELSE до ENDIF. Данная структура ди­ректив может использоваться в частном случае аналогично операторам switch/ case языков высокого уровня, если выражения - проверки некоторой константы на

Кроме общих директив IF и ELSEIF ассемблеры поддерживают набор специ­альных команд, каждая из которых проверяет специальное условие:

□ IF1/ELSEIF1 - если ассемблер выполняет первый проход ассемблирования;

□ IF2/ELSEIF2 - если ассемблер выполняет второй проход ассемблирования (часто не работает на современных ассемблерах);

a IFE выражение - если выражение равно нулю (ложно);

a IFDEF метка/ELSEIFDEF метка - если метка определена;

a IFNDEF метка/ELSEIFNDEF метка - если метка не определена;

□ IFB <apryMeHT>/ELSEIFB <аргумент> - если значение аргумента - пробел (эти и все следующие директивы используются в макроопределениях для проверки параметров);

- если значение аргумента - не

пробел (используется в макроопределениях для проверки переданных пара­метров);

□ IFDIF <aprl>,<apr2>/ELSEIFDIF <арг1>,<арг2> - если аргументы отли­чаются (с различием больших и маленьких букв);

□ IFDIFI <aprl>,<apr2>/ELSEIFDIFI <арг1>,<арг2> - если аргументы отли­чаются (без различия больших и маленьких букв);

□ IFIDN <aprl>,<apr2>/ELSEIFIDN <арг1>,<арг2> - если аргументы одина­ковы (с различием больших и маленьких букв);

□ IFIDNI <aprl>,<apr2>/ELSEIFIDNI <арг1>,<арг2> - если аргументы оди­наковы (без различия больших и маленьких букв).

Иногда директивы условного ассемблирования используются для того, чтобы

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

Для таких случаев предназначены директивы условной генерации ошибок.

if        $ gt 65535 ;  Если адрес вышел за пределы сегмента.

.err

endif

Встретив директиву .ERR, ассемблер прекратит работу с сообщением об ошиб­ке. Аналогично: командам условного ассемблирования существуют модификации команды

□ .ERR1 - ошибка при первом проходе ассемблирования;

□ .ERR2 - ошибка при втором проходе ассемблирования;

a выражение - ошибка, если выражение равно нулю (ложно);

выражение - ошибка, если выражение не равно нулю (истинно);

□ .ERRDEF метка - ошибка, если метка определена;

□ .ERRNDEF метка - ошибка, если метка не определена;

- ошибка, если аргумент пуст (эта и все следующие ди­рективы используются в макроопределениях для проверки параметров);

□ .ERRNB <аргумент> - ошибка, если аргумент не пуст;

□ .ERRDIF <арг1>,<арг2> - ошибка, если аргументы различны;

□ .ERRDIFI <арг1>,<арг2> - ошибка, если аргументы отличаются (сравнение не различает большие и маленькие буквы);

□ .ERRIDN <арг1>,<арг2> - ошибка, если аргументы совпадают;

□ .ERRIDNI <арг1>,<арг2> - ошибка, если аргументы совпадают (сравнение не различает большие и маленькие буквы).