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
». Таким образом могут определяться растущие списки символов.