Выбрать главу

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

«restore» позволяет присвоить назад предыдущее значение переопределенной константы. За ней должно следовать одно или больше имен символьных констант, разделенных запятыми. Так, «restore d» после предыдущего переопределения вернет константе значение «edx», следующее применение этой директивы вернет ей значение «dword», а ещё одно применение восстановит первоначальное значение, как будто такая константа не определялась. Если не константа с заданным именем не определена, то «restore» не вызовет ошибку, а будет просто проигнорирована.

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

b equ byte

w equ word

d equ dword

p equ pword

f equ fword

q equ qword

t equ tword

x equ dqword

Так как символьная константа может так же иметь пустое значение, она может использоваться для того, чтобы допустить синтаксис со словом «offset» перед каким-нибудь значением адреса:

offset equ

После такого определения «mov ax, offset char» будет правильной конструкцией, которая будет копировать смещение переменной «char» в регистр «ax», так как «offset» заменяется пустым значением, и поэтому игнорируется.

Символьные константы могут также быть определены директивой «fix», которая имеет такой же синтаксис, как «equ», но определяет константы высшего приоритета — они заменяются их символическим значением даже перед совершением директив препроцессора и макроинструкций. Исключением является сама директива «fix», которая имеет наивысший возможный приоритет, и поэтому допускает переопределение констант, заданных таким путем. Но если такие константы высшего приоритета находятся внутри значения, следующего за директивой «fix», они заменяются их значениями перед присвоением этого значения новой константе.

Директива «fix» может использоваться для адаптирования директив препроцессора, что нельзя сделать директивой «equ». Например: