相当于GCC的裸属性

时间:2011-12-04 09:38:05

标签: gcc assembly x86 freebsd

我有一个用纯C编写的应用程序,混合了一些包含纯ASM的函数。裸机属性不适用于x86(为什么?为什么?!)和我的asm功能不喜欢当序言和结尾弄乱堆栈时。是否有可能创建一个可以从C代码部分引用的纯汇编程序函数?我只需要这种ASM功能的地址。

3 个答案:

答案 0 :(得分:16)

只需在功能块外使用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 ++代码中,并且速度更快,特别是对于短汇编函数。对于较大的汇编函数,最好使用单独的汇编源文件,所以这个答案实际上是一个非常罕见的情况,你需要一个指向小型汇编函数的函数指针。

答案 1 :(得分:5)

大家好消息。 GCC开发人员最终为x86实现了属性((裸))。该功能将在GCC 8中提供。

答案 2 :(得分:3)

当然,只需创建一个.s文件(汇编源代码),它通过gas(汇编程序)运行,以创建一个普通的目标文件。