等效于GCC';s裸属性

等效于GCC';s裸属性,gcc,assembly,x86,freebsd,Gcc,Assembly,X86,Freebsd,我用纯C编写了一个应用程序,其中混合了一些包含纯ASM的函数。裸体属性不适用于x86(为什么?为什么?!),我的asm函数不喜欢序言和尾声干扰堆栈。是否有可能创建一个可以从C代码部分引用的纯汇编函数?我只需要这类ASM函数的地址。当然,只需创建一个.s文件(汇编源代码),它通过gas(汇编程序)来创建一个普通的对象文件。只需在函数块外使用ASM()。asm()的参数被编译器忽略,并直接传递给汇编程序。对于复杂的函数,最好使用单独的程序集源文件来避免使用笨拙的语法 例如: #include <

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

当然,只需创建一个
.s
文件(汇编源代码),它通过
gas
(汇编程序)来创建一个普通的对象文件。

只需在函数块外使用
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;
}
#包括
asm(“\u-one:\n\
movl$1,%eax\n\
ret\n\
");
int-one();
int main(){
printf(“结果:%d\n”,one());
返回0;
}
PS:确保您了解平台的调用约定。很多时候,您不能只复制/跳过程序集代码


PPS:如果您关心性能,请改用。扩展asm本质上是将汇编代码内联到C/C++代码中,速度更快,特别是对于短汇编函数。对于较大的汇编函数,最好使用一个单独的汇编源文件,因此,对于极少数需要一个指向小汇编函数的函数指针的情况,这个答案确实是一个技巧。

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

你能行。使用适用于操作系统的函数使内存区域可执行。如果您使用
.S
后缀(大写字母S),您的汇编代码也将由cpp预处理。这就是我要找的!感谢您的解释。
asm()
外部功能块在
c99
@hauzer try
\uuu asm
\uuuuu asm\uuu
中似乎不起作用,而不是
asm
@hauzer一个可移植的c99程序可能有一个名为
asm
的全局变量,该变量与此GCC扩展冲突。但是以两个下划线开头的名称是为实现保留的(例如GCC)。因此,GCC扩展可以使用
\uuuasm
\uuuasm
,并且仍然符合标准,但不符合
asm
(在Linux上)。有点相关。GCC 7.1添加了对带有
属性((interrupts))
的x86中断的支持,以及相关的命令行选项
-mgeneral regs only
。这个实现还有一点不尽如人意,但它并不是完全没有实现的。