Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скляров И. Изучаем Assembler за 7 дней (2010).pdf
Скачиваний:
1335
Добавлен:
23.02.2015
Размер:
2.11 Mб
Скачать

http://www.sklyaroff.ru

 

63

Таблица 3.2. Операторы условий в конструкциях времени исполнения программы

 

 

 

 

 

Оператор

Условие

 

 

 

 

 

 

==

равно

 

 

 

!=

не равно

 

 

>

больше

 

 

<

меньше

 

 

>=

больше или равно

 

 

<=

меньше или равно

 

 

&

проверка бита

 

 

!

инверсия ( NOT )

 

 

&&

логическое 'И' ( AND )

 

 

||

логическое 'ИЛИ' ( OR )

 

 

CARRY?

флаг переноса (cf) установлен

 

 

OVERFLOW?

флаг переполнения (of) установлен

 

 

PARITY

флаг паритета (pf) установлен

 

 

SIGN?

флаг знака (sf) установлен

 

 

ZERO?

флаг нуля (zf) установлен

 

 

 

 

 

 

3.8. Директивы условного ассемблирования

Директивы условного ассемблирования проверяют условия только во время ассемблирования программы, т. е. служат только для указания определенных действий транслятору. Как мы уже знаем, в исполняемый файл директивы не включаются, поэтому никакие директивы в принципе не способны проверять рабочие условия во время выполнения программы.

Директива условного ассемблирования имеет следующую основную конструкцию:

IF выражение

...

ENDIF

Если значение выражения "истина" (не равно нулю), то ассемблируется участок между IF и ENDIF.

Директива IF может также содержать ELSE:

IF выражение

...

ELSE

...

ENDIF

В этом случае если выражение "истина" (не равно нулю), то ассемблируется участок между IF и ELSE, в противном случае — от ELSE до ENDIF.

Директива IF может также включать множество операторов ELSEIF:

IF выражение1

...

ELSEIF выражение2

...

http://www.sklyaroff.ru

64

ELSEIF выражение3

...

ELSE

...

ENDIF

Если выражение "истина" (не равно нулю), то ассемблируется соответствующий участок программы. Например, если выражение2 не равно нулю, то будет ассемблироваться участок между первой и второй директивой ELSEIF. Если все три выражения "ложь" (равны нулю), то ассемблируется фрагмент ELSE до ENDIF.

Существуют директивы, проверяющие специальные условия.

Директива IF1 обеспечивает ассемблирование только на первом проходе ассемблирования:

IF1 выражение1

...

ELSEIF1 выражение2

...

ELSE

...

ENDIF

Директива IF2 обеспечивает ассемблирование только на втором проходе ассемблирования:

IF2 выражение1

...

ELSEIF2 выражение2

...

ELSE

...

ENDIF

Директива IFE обеспечивает ассемблирование, если значение выражения оценивается как "ложное" (нуль):

IFE выражение1

...

ELSEIFE выражение2

...

ELSE

...

ENDIF

Директива IFDEF проверяет, было ли определено указанное 'имя' и обеспечивает ассемблирование только в том случае, если это 'имя' представляет собой некоторую метку, переменную или символьное имя:

IFDEF имя1

...

ELSEIFDEF имя2

...

http://www.sklyaroff.ru

65

ELSE

...

ENDIF

Директива IFNDEF обеспечивает ассемблирование, если указанное имя еще не было определено:

IFNDEF имя1

...

ELSEIFNDEF имя2

...

ELSE

...

ENDIF

Директива IFB проверяет значение указанного 'аргумента' и обеспечивает ассемблирование, если 'аргумент' пустой (пробел). Аргументом этой директивы может быть любое имя, число или выражение. Угловые скобки (<>) должны указываться обязательно:

IFB <аргумент1>

...

ELSEIFB <аргумент2>

...

ELSE

...

ENDIF

Директива IFNB аналогична IFB, только обеспечивает ассемблирование, если 'аргумент' не пустой (не пробел):

IFNB <аргумент1>

...

ELSEIFNB <аргумент2>

...

ELSE

...

ENDIF

Директива IFDIF сопоставляет указанные 'аргумент1' и 'аргумент2', и обеспечивает ассемблирование при различии этих аргументов (с различием больших и маленьких букв). Угловые скобки (<>) должны указываться обязательно:

IFDIF <аргумент1>,<аргумент2>

...

ELSEIFDIF <аргумент3>,<аргумент4>

...

ELSE

...

ENDIF

http://www.sklyaroff.ru

66

Директива IFIDN сопоставляет указанные 'аргумент1' и 'аргумент2', и обеспечивает ассемблирование при идентичности этих аргументов (с различием больших и маленьких букв). Идентичность аргументов означает посимвольное совпадение 'аргумента1' и 'аргумента2':

IFIDN <аргумент1>,<аргумент2>

...

ELSEIFIDN <аргумент3>,<аргумент4>

...

ELSE

...

ENDIF

Есть еще две директивы выполняющие действия аналогичные директивам IFDIF и IFIDN, но без различия больших и маленьких букв:

IFDIFI <аргумент1>,<аргумент2> — сопоставляет указанные 'аргумент1' и 'аргумент2', и обеспечивает ассемблирование при различии этих аргументов (без различия больших и маленьких букв).

IFIDNI <аргумент1>,<аргумент2> — сопоставляет указанные 'аргумент1' и 'аргумент2', и обеспечивает ассемблирование при идентичности этих аргументов (без различия больших и маленьких букв).

Существуют условные директивы контроля ошибок, которые могут использоваться для отладки программ и контроля ошибок ассемблирования. Эти директивы можно помещать в критические точки программного кода и проверять условия ассемблирования в этих точках. Самой простой директивой контроля ошибок является .ERR, встретив ее, ассемблер прекратит работу с сообщением об ошибке. Пример:

IFDEF love

...

ELSE

.ERR ; выводится ошибка, если имя love не определено

ENDIF

Другие условные директивы контроля ошибок:

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

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

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

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

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

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

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

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

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

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

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

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