Директива include позволяет вставить код из определенного файла в другой файл. В качестве операнда она принимает имя файла, код которого будет вставляться:
Строковые инструкции используют определенные регистры в качестве операндов:
include имя_файла
В качестве файла может выступать любой файл с кодом на ассемблере. Например, пусть у нас есть файл sum.asm со следующим кодом:
; через RCX и RDX передаются параметры ; через RAX возвращается результат sum proc mov rax, rcx add rax, rdx ret sum endp
Здесь определена процедура sum, которая через регистры RCX и RDX принимает два числа, складывает их и результат помещает в регистр RAX.
Подключим файл sum.asm в главный файл программы, который располагается в той же папке и который пусть называется main.asm:
.code include sum.asm ; подключаем код из файла sum.asm main proc mov rcx, 6 mov rdx, 2 call sum ret main endp end
В данном случае на место:
include sum.asm
при компиляции будет вставляться код из файла sum.asm
. Компиляция проходит также как и в общем случае. Например, в 64-рязном MASM с помощью команды:
ml64 main.asm /link /entry:main
Таким образом, благодаря директиве include
мы можем вынести некоторые части программы, например, процедуры, во внешние файлы и при необходимости подключать их. Причем
подключать в разные файлы с кодом на ассемблере.
Хотя директива include
довольно удобна, но по мере роста и развития программы из-за этой директивы может возникнуть путаница, особенно когда подключается множество файлов, которые,
в свою очередь, подключают другие файлы. Если один код подключается больше одно раза, это приведет к ошибке компиляции, например:
.code include sum.asm ; подключаем код из файла sum.asm ; некоторый код include sum.asm ; повторно подключаем код из файла sum.asm main proc mov rcx, 6 mov rdx, 2 call sum ret main endp end
Решением в данном случае может быть использование оператора ifndef:
.code ifndef sum_asm sum_asm = 0 include sum.asm ; подключаем код из файла sum.asm endif ; некоторый код ifndef sum_asm sum_asm = 0 include sum.asm ; подключаем код из файла sum.asm endif main proc mov rcx, 6 mov rdx, 3 call sum ret main endp end
Оператор условной компиляции ifndef
определяет условную конструкцию, внутри которой подключается файл. В качестве операнда оператору ifndef
передается некоторая переменная. Если она неопределена, то устанавливаем ее значение (например, присваиваем число 0) и подключаем нужный файл. Если же данная переменная уже установлена (то есть файл ранее уже подключен), то повторного подключения файла не будет.