Проект представляет собой собственную реализацию функции форматированного вывода (аналог printf), написанную на языке ассемблера NASM для архитектуры x86_64. Функция предназначена для вызова из кода на C и демонстрирует низкоуровневую работу со стеком, регистрами и системными вызовами ОС Linux.
Функция myPrintf работает независимо от стандартной библиотеки ввода-вывода C. Вывод данных на экран осуществляется напрямую через системный вызов write. Для оптимизации производительности функция использует собственный буфер размером 100 байт.
Обработка аргументов реализована с помощью таблицы переходов (Jump Table). Поддерживаются следующие спецификаторы формата:
| Спецификатор | Описание |
|---|---|
%c |
Одиночный символ |
%s |
Строка |
%d |
Десятичное число (с поддержкой отрицательных значений) |
%x |
Шестнадцатеричное число |
%o |
Восьмеричное число |
%b |
Двоичное число |
%% |
Символ процента |
В ассемблерном коде реализован безопасный пролог и эпилог («трамплин») для сохранения значений регистров (rbx, rbp, r12, r15), что гарантирует соблюдение соглашений о вызовах и безопасную интеграцию с C кодом. В качестве точки входа для тестирования используется файл Main.cpp.
Для сборки проекта используется утилита make. В системе должны быть установлены компиляторы g++ и nasm.
Проект ожидает наличие следующей структуры директорий:
source/ — исходные файлы .cpp и .asm
objects/ — скомпилированные объектные файлы
include/ — заголовочные файлы
listen/ — файлы листинга ассемблера
Сборка проекта — выполните команду make в корневой директории. В результате будет создан исполняемый файл с именем do.
Очистка проекта — команда make clean удалит все скомпилированные объектные файлы, файлы листингов и исполняемый файл do.
Чтобы использовать ассемблерную функцию в вашем C/C++ проекте, её необходимо объявить с квалификатором extern "C".
Пример использования (из файла Main.cpp):
#include <stdio.h>
extern "C" int myPrintf(const char* str, ...); // Объявляем функцию my_printf
int main()
{
int return_value = 0;
// Вызываем my_printf для вывода форматированной строки
return_value = myPrintf("%d %s %x %d%%%c%b%a\n", -1, "love", 3802, 100, 33, 126);
printf("return_value = %b\n", return_value);
myPrintf("return_value = %b\n", return_value);
return 0;
}После компиляции программу можно запустить командой:
./do