从 C 调用内联汇编函数

Calling inline assembly function from C

我想将内联汇编中定义的函数的地址发送给 C 函数,但出现此错误:

错误:"func"未声明(首次在此函数中使用)

这是用于调用的代码:

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

another_func(&func);

我想我应该在 C 语言中使用前向声明(比如代码中的 "void func();" 前面)但是还有其他更简洁的方法吗?

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

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

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

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

extern void func(void);

编译器和汇编器可能不会按照您期望的顺序调用。编译器必须在 运行 时知道函数的名称。将函数声明为 .global(或 .public)将导致汇编器发出一个 public 符号:_func,但因为这是内联汇编,它对C编译器。您需要将符号告知 C 编译器,以便它知道期望什么,并且链接器必须知道使用汇编器的输出符号作为 C 引用的输入符号。