我有一个用纯C编写的应用程序,其中混合了一些包含纯ASM的函数。裸属性不适用于x86 (为什么?为什么?!)我的asm函数不喜欢当prologue和epilogue打乱堆栈的时候。有没有可能创建一个可以从C代码部分引用的纯汇编函数?我只需要这样的ASM函数的地址。
发布于 2011-12-04 20:53:22
只需在函数块外使用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++代码中,并且速度快得多,特别是对于较短的汇编函数。对于较大的汇编函数,最好使用单独的汇编源文件,因此对于极少数情况下,需要一个指向小汇编函数的函数指针,这个答案确实是一种技巧。
发布于 2017-08-01 06:43:52
好消息是大家。最终,GCC开发人员为x86实现了attribute((naked))。该功能将在GCC 8中提供。
发布于 2011-12-04 18:01:29
当然,只需创建一个.s文件(汇编源),该文件通过gas (汇编器)运行即可创建一个普通的目标文件。
https://stackoverflow.com/questions/8374449
复制相似问题