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

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

Директива .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
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850