我想将内联汇编中定义的函数的地址发送到C函数,但是我收到了这个错误:
错误:“func”未声明(首次使用此功能)
以下是用于通话的代码:
__asm__(".global func\n"
"func:\n"
// func code
);
another_func(&func);
我以为我应该在C中使用前向声明(比如代码中的“void func();”)但是还有另一种更清晰的方法吗?
答案 0 :(得分:3)
它可能取决于您的编译器,汇编程序和链接器工具链,但前向声明是正确的方法。
extern void func(void);
不能按照您期望的顺序调用编译器和汇编程序。编译器必须知道函数运行时的名称。将函数声明为.global
(或.public
)将导致汇编程序发出公共符号:_func
,但由于这是内联汇编,因此C编译器无法使用它。您需要告诉C编译器有关该符号的信息,以便它知道会发生什么,并且链接器必须知道使用汇编器中的输出符号作为C引用的输入符号。
答案 1 :(得分:1)
这是因为C编译器不知道汇编符号,只知道C符号。
简单的解决方案是制作标准C函数,并在其中具有内联汇编:
void func(void)
{
__asm__("...");
}