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