Эквивалент GCC голый атрибут

У меня есть приложение, написанное на чистом C, смешанное с некоторыми функциями, которые содержат чистую ASM. Голый атрибут недоступен для x86 (почему? Почему?!), а мои функции asm не нравятся, когда пролог и эпилог возится со стеклом. Можно ли как-то создать чистую ассемблерную функцию, на которую можно ссылаться из частей кода C? Мне просто нужен адрес такой функции ASM.

Ответ 1

Просто используйте asm() вне функционального блока. Аргумент asm() просто игнорируется компилятором и передается непосредственно ассемблеру. Для сложных функций отдельный исходный файл сборки является лучшим вариантом, чтобы избежать неудобного синтаксиса.

Пример:

#include <stdio.h>

asm("_one:              \n\
        movl $1,%eax    \n\
        ret             \n\
");

int one();

int main() {
        printf("result: %d\n", one());
        return 0;
}

PS: Убедитесь, что вы понимаете соглашения о вызовах вашей платформы. Много раз вы не можете просто копировать/пропустить код сборки.

PPS: Если вам нужна производительность, вместо этого используйте extended asm. Extended asm существенно встраивает код сборки в ваш код C/С++ и работает намного быстрее, особенно для коротких функций сборки. Для более крупных функций сборки предпочтительным является отдельный исходный файл сборки, поэтому этот ответ действительно является взломом для редкого случая, когда вам нужен указатель на функцию небольшой сборки.

Ответ 2

Конечно, просто создайте файл .s (источник сборки), который запускается через gas (ассемблер) для создания нормального объектного файла.

Ответ 3

Хорошая новость. Наконец, разработчики GCC реализовали атрибут ((голый)) для x86. Эта функция будет доступна в GCC 8.