Организация программы

Вставка кода и директива include

Последнее обновление: 03.07.2023

Директива 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) и подключаем нужный файл. Если же данная переменная уже установлена (то есть файл ранее уже подключен), то повторного подключения файла не будет.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850