Эквивалент голого атрибута GCC - PullRequest
10 голосов
/ 04 декабря 2011

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

Ответы [ 3 ]

16 голосов
/ 04 декабря 2011

Просто используйте 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 .Расширенная asm, по сути, встраивает ассемблерный код в ваш C / C ++ код и работает намного быстрее, особенно для коротких ассемблерных функций.Для более крупных функций сборки предпочтителен отдельный исходный файл сборки, поэтому этот ответ действительно полезен для редкого случая, когда вам нужен указатель на функцию небольшой сборки.

5 голосов
/ 01 августа 2017

Хорошие новости всем. Разработчики GCC наконец-то реализовали атрибут ((голый)) для x86. Функция будет доступна в GCC 8.

3 голосов
/ 04 декабря 2011

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

...