Читать «Assembler. Программирование на языке ассемблера IBM PC» онлайн - страница 187

Unknown Author

Вообще говоря, можно и не знать об этих двух проходах ассемблера, однако иногда это знание полезно и даже необходимо. Например, если по директиве %OUT нужно только один раз выдать текст на экран (только на первом или только на втором проходе), тогда следует воспользоваться следующими IF-дирек-тивами условного ассемблирования:

IF1

IF2

Условие директивы IF1 считается выполненным, когда ассемблер совершает свой первый проход (просматривает текст программы в первый раз), и невыполненным при втором проходе. И наоборот, условие директивы IF2 считается выполненным на втором проходе и невыполненным на первом проходе.

Следующие две директивы также относятся к IF-директивам:

IFDEF <имя>

IFNDEF <имя>

На первом проходе трансляции условие директивы IFDEF (if defined, если определено) считается выполненным, если указанное имя уже описано (до этой директивы) в программе, и считается невыполненным, если это имя будет описано позже или вообще не описано в программе. На втором проходе условие директивы считается выполненным, если имя вообще описано в программе (до или после этой директивы). В директиве же IFNDEF (if not defined) условие считается выполненным, если имя не было описано до этой директивы (для первого прохода) или если имя вообще не описано в программе (для второго прохода).

Описанными считаются имена, указанные в левой части команд и директив, а также имена полей структур и записей, имена регистров. Названия же команд, директив и операторов не относятся к описанным именам.

Пример. По IF-блоку

IFDEF N S DB N DUP(?)

ELSE "

S DB 256 DUP(?)

ENDIF

в окончательный текст программы попадет описание S как массива из N байтов, если в программе описано имя N, а иначе - как 256-байтового массива.

14.5.3. Условная генерация ошибок

При трансляции программы может возникнуть ситуация (например, в макрокоманде не указан обязательный параметр), когда с точки зрения правил языка в программе все в порядке, но вот с точки зрения логики программы возникла ошибочная ситуация, которую может установить только автор программы. Для того чтобы фиксировать такие ошибки, в ЯА введены директивы условной генерации ошибок. Каждая из них проверяет некоторое условие и, если оно выполнено, записывает в листинг (в ту строчку, где встретилась эта директива) сообщение о принудительной ошибке (forced error). После этого трансляция программы будет продолжена, однако файл с объектным кодом, как и при любой иной ошибке периода трансляции, уже формироваться не будет.

Ниже для каждой директивы условной генерации ошибки приводятся номер ошибки и текст записываемого в листинг сообщения об ошибке.

. ERR1    87 Forced error - pass 1

. ERR2    88 Forced error - pass 2

.ERR    89 Forced error

Директива .ERR1 генерирует ошибку, если директива встретилась ассемблеру на его первом проходе, директива .ERR2 генерирует ошибку, если она встретилась на втором проходе, а директива .ERR генерирует ошибку на любом проходе.