Используем C в Ассембли
Разрабатывая стандартную библиотеку для своего языка, столкнулся с проблемой: как связывать код написанный на C с ассембли. Первый подход – компиляция C в ассембли и ручное копирование кода – оказался не самым удобным. Две проблемы этого способа это несовместимость синтаксиса GCC и Nasm и постоянное дублирование кода при малейших изменениях.
Решение
Теперь расскажу о способе, который является оптимальным – линковке объектных файлов.
Пример
Приведу пример из моего языка программирования – функция для печати целых чисел.
debug.c
Важно, что функция объявлена с модификатором extern, то есть доступна глобально.
Также, в него нужно включить заголовочный файл, в котором будут объявлены все сигнатуры функций.
debug.c
debug.h
Теперь, создаём объектный файл.
gcc -nostdlib -no-pie -fno-stack-protector -c debug.c -o debug.o
Флаги -no-pie и -fno-stack-protector нужны для совместимости с ассембли.
main.asm
Компилируем и компонуем с объектным файлом стандартной библиотеки
nasm -f elf64 main.asm -o main.o
gcc -nostdlib -no-pie main.o debug.o -o main
Получаем одиночный бинарный файл, в котором включены и стандартная библиотека и главный файл.
Если вам хочется узнать больше о языках программирования, переходите в мой телеграм канал.
P.S: Тело функции
Лига программистов
2K постов11.8K подписчика
Правила сообщества
- Будьте взаимовежливы, аргументируйте критику
- Приветствуются любые посты по тематике программирования
- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества