Skip to content

Latest commit

 

History

13 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

MyPrintf

Оглавление


Аннотация

Проект представляет собой собственную реализацию функции форматированного вывода (аналог 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

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages