Используем 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 подписчиков

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

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

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

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

0
Автор поста оценил этот комментарий
Если не секрет, в каких сферах применяется это?
раскрыть ветку (1)
1
Автор поста оценил этот комментарий

В разработке компиляторов, правда сам ассемблер мало где именно пишется, но используется

Автор поста оценил этот комментарий

И в чём же сакральный смысл использования NASM в разработке своей стандартной библиотеки, если вы только что продемонстрировали, что свои библиотечные функции вы пишете как раз на C??? И зачем писать вызывающий код на ассемблере?? Всё с ног на голову.


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

Что это вообще *#!~$ значит.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

В том, что мой язык компилируется в x86 ассемблер и потом линкуется с C библиотекой. Так бы можно было писать ее на ассемблере, но я не думаю, что это удобно

2
Автор поста оценил этот комментарий

Ассембли? Ты бля где такое слово нашел вообще? В русском языке ассемблер, в английском assembly это вообще глагол.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Транслитерация английского варианта

показать ответы
0
Автор поста оценил этот комментарий
А надо? Перечитай, написанное: слишком кривой перевод (ну или ты не русский, или тотально безграмотен).
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Даже свой пойнт не можешь подтвердить, просто грязь льёшь в комментах из-за того что в жизни не можешь, так как из дома не выходишь)

0
Автор поста оценил этот комментарий
Ты даже чужую статью перевести не можешь нормально, но телегу свою прорекламировать не забываешь.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Покажи оригинал

показать ответы
1
Автор поста оценил этот комментарий
Кто-то это ещё делает? Пишет на ассемблере???
раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да

показать ответы