Flat Assembler 1.64. Мануал программера | страница 16



Из этого примера вы можете заключить, что прогноз для оператора «>defined» очень прямолинейный — метка прогнозируется как определенная только если она была определена в предыдущий проход (а если она была определена в текущий проход, прогноз не требуется). То же самое относится к оператору «>used». Однако прогнозы для значений меток не так просты и вам никогда не следует полагать, что ассемблер работает таким способом.

2.3 Директивы препроцессора

Все директивы препроцессора выполняются перед основным ассемблированием, и таким образом директивы управления на них никак не влияют. В это время также удаляются все комментарии.

2.3.1 Включение файлов-исходников

«>include» включает указанный файл-исходник туда, где эта директива используется. За ней должно следовать в кавычках имя файла, который должен быть включен, например:

>include 'macros.inc'

Весь включенный файл обрабатывается препроцессором перед обработкой строк, следующих за содержащей директиву «>include». Нет предела для количества включаемых файлов, пока они умещаются в память.

Путь, заключенный в скобки, может содержать окружающие переменные, заключенные в знаки «>%», они будут заменены на их значения внутри пути. Знаки «>\» и «>/» трактуются как разделители пути. Если не указан абсолютный путь, сначала файл ищется в директории, содержащей файл, в который он включается, и, далее, если его там нет, в директории, содержащей главный файл-исходник (указанный в командной строке). Эти правила так же относятся к путям, которые указываются в директиве «>file».

2.3.2 Символьные константы

Символьные константы отличаются от числовых констант тем, что перед процессом ассемблирования они заменяются на их значения во всех строках кода, следующих за их определением, и все может стать их значением.

Определение символьных констант состоит из имени константы, за которой следует директива «>equ». Все, что следует за этой директивой, станет значением константы. Если значение символьной константы содержит другие символьные константы, они заменяются на их значения перед присвоением значения новой константе. Например:

>d equ dword

>NULL equ d 0

>d equ edx

После этих трех определений значение «>NULL» будет «>dword 0», а значение «>d» будет «>edx». Так, например, «>push NULL» будет сассемблировано как «>push dword 0», а «>push d» как «>push edx». А, например, в такой строке:

>d equ d,eax

константе «>d» будет присвоено новое значение «>edx,eax». Таким образом могут определяться растущие списки символов.