Используем C в Ассембли

Используем C в Ассембли Программирование, Языки программирования, Компиляция, Компилятор, Гайд, Обучение, Длиннопост

Разрабатывая стандартную библиотеку для своего языка, столкнулся с проблемой: как связывать код написанный на C с ассембли. Первый подход – компиляция C в ассембли и ручное копирование кода – оказался не самым удобным. Две проблемы этого способа это несовместимость синтаксиса GCC и Nasm и постоянное дублирование кода при малейших изменениях.

Решение

Теперь расскажу о способе, который является оптимальным – линковке объектных файлов.

Пример

Приведу пример из моего языка программирования – функция для печати целых чисел.

debug.c

Используем C в Ассембли Программирование, Языки программирования, Компиляция, Компилятор, Гайд, Обучение, Длиннопост

Важно, что функция объявлена с модификатором extern, то есть доступна глобально.


Также, в него нужно включить заголовочный файл, в котором будут объявлены все сигнатуры функций.

debug.c

Используем C в Ассембли Программирование, Языки программирования, Компиляция, Компилятор, Гайд, Обучение, Длиннопост

debug.h

Используем C в Ассембли Программирование, Языки программирования, Компиляция, Компилятор, Гайд, Обучение, Длиннопост

Теперь, создаём объектный файл.

gcc -nostdlib -no-pie -fno-stack-protector -c debug.c -o debug.o

Флаги -no-pie и -fno-stack-protector нужны для совместимости с ассембли.

main.asm

Используем C в Ассембли Программирование, Языки программирования, Компиляция, Компилятор, Гайд, Обучение, Длиннопост

Компилируем и компонуем с объектным файлом стандартной библиотеки

nasm -f elf64 main.asm -o main.o

gcc -nostdlib -no-pie main.o debug.o -o main

Получаем одиночный бинарный файл, в котором включены и стандартная библиотека и главный файл.

Если вам хочется узнать больше о языках программирования, переходите в мой телеграм канал.


P.S: Тело функции

Используем C в Ассембли Программирование, Языки программирования, Компиляция, Компилятор, Гайд, Обучение, Длиннопост

Лига программистов

2K постов11.8K подписчика

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества