Директива .include позволяет вставить код из одного файла в определенное место в другом файле. Это позволяет нам разбить код на отдельные файлы, которые содержат отдельные компоненты, и при необходимости подключать их в программу.
Допустим, у нас есть следующий файл copy.s с определением функции copy
, которая копирует данные одной строки в другую:
// Функция copy, которая копирует символы из одной строки в другую // Параметры функции // X0 - адрес входящей строки // X1 - адрес исходящей строки // // Результат функции // X0 - длина строки copy: MOV X4, X1 // сохраняем адрес начала строки, чтобы потом вычислить ее длину // в цикле получаем все байты, пока не дойдем до нулевого байта loop: LDRB W5, [X0], #1 // загружаем из X0 один байт - один символ в W5 и увеличиваем адрес в X0 на 1 байт CMP W5, #0 // сравниваем с нулевым байтом B.EQ endloop // если нулевой байт, переход к метке endloop STRB W5, [X1], #1 // если символы равны, заменяем байт по адресу X1 и увеличиваем адрес в X1 на 1 байт B loop // перед обратно к метке loop endloop: SUB X0, X1, X4 // помещаем в регистр X0 длину строки - X0 = X1 - X4 RET // выход из функции
Подключим этот файл в главный файл программы, который пусть называется main.s:
.include "copy.s" // вставляем в это место содержимое файла copy.s .global _start _start: LDR X0, =input // строка, их которой надо скопировать символы LDR X1, =output // строка, в которую надо скопировать символы BL copy // вызов функции copy // печать строки на консоль MOV X2, X0 // в регистр X2 передаем результ функции copy - длину строки из регистра X0 MOV X0, #1 // 1 = StdOut - стандартный поток вывода LDR X1, =output // загружаем адрес выводимой строки MOV X8, #64 // функция Linux для вывода в поток SVC 0 // вызываем функцию Linux // выход из программы MOV X0, 0 // код возврата - 0 MOV X8, #93 // устанавливаем функцию Linux для выхода из программы SVC 0 // Вызываем функцию Linux .data input: .asciz "Hello METANIT.COM!\n" output: .fill 256, 1, 0
При компиляции на место вызова директивы
.include "copy.s"
будет вставляться содержимое файла copy.s.
Причем при компиляции ассемблеру передается только один - главный файл main.s:
aarch64-none-elf-as main.s -o main.o