从C调用内联汇编函数

时间:2015-03-30 17:11:21

标签: c inline-assembly

我想将内联汇编中定义的函数的地址发送到C函数,但是我收到了这个错误:

错误:“func”未声明(首次使用此功能)

以下是用于通话的代码:

__asm__(".global func\n"
        "func:\n"
        // func code
        );

another_func(&func);

我以为我应该在C中使用前向声明(比如代码中的“void func();”)但是还有另一种更清晰的方法吗?

2 个答案:

答案 0 :(得分:3)

它可能取决于您的编译器,汇编程序和链接器工具链,但前向声明是正确的方法。

extern void func(void);

不能按照您期望的顺序调用编译器和汇编程序。编译器必须知道函数运行时的名称。将函数声明为.global(或.public)将导致汇编程序发出公共符号:_func,但由于这是内联汇编,因此C编译器无法使用它。您需要告诉C编译器有关该符号的信息,以便它知道会发生什么,并且链接器必须知道使用汇编器中的输出符号作为C引用的输入符号。

答案 1 :(得分:1)

这是因为C编译器不知道汇编符号,只知道C符号。

简单的解决方案是制作标准C函数,并在其中具有内联汇编:

void func(void)
{
    __asm__("...");
}