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