从C调用内联汇编函数

从C调用内联汇编函数,c,inline-assembly,C,Inline Assembly,我想将内联汇编中定义的函数的地址发送到C函数,但我收到以下错误: 错误:func未声明此函数中的首次使用 以下是用于呼叫的代码: __asm__(".global func\n" "func:\n" // func code ); another_func(&func); 我想我应该在C中使用像void func一样的向前声明;但是有没有其他更干净的方法呢?这是因为C编译器不知道汇编程序符号,只知道C符号 简单的解决方案是制作一个标准C

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

错误:func未声明此函数中的首次使用

以下是用于呼叫的代码:

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

another_func(&func);

我想我应该在C中使用像void func一样的向前声明;但是有没有其他更干净的方法呢?

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

简单的解决方案是制作一个标准C函数,其中包含内联程序集:

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

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

简单的解决方案是制作一个标准C函数,其中包含内联程序集:

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

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

extern void func(void);

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

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

extern void func(void);

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

应该是.global\u func吗?或者使用一些汇编程序,它的.public。可以将函数放在单独的程序集源文件中。如果您不确定语法,请用C编写一个测试程序,让编译器输出汇编代码以查看所需内容。对不起,实际上是_func:应该是func:根据编译器/汇编程序(如masm 6.11或更高版本)的不同,双冒号可能会使汇编过程之外的符号可用,在这种情况下,请尝试func::\n。应该是.global\u func吗?或者使用一些汇编程序,它的.public。可以将函数放在单独的程序集源文件中。如果您不确定语法,请用C编写一个测试程序,让编译器输出汇编代码以查看所需内容。对不起,实际上是_func:应该是func:根据编译器/汇编程序(如masm 6.11或更高版本)的不同,双冒号可能会使汇编过程之外的符号可用,在本例中,请尝试func::\n。这是一个非常重要的更改,因为具有内联汇编程序的接口与函数调用ABI不同。这是一个非常重要的更改,因为具有内联汇编程序的接口与函数调用ABI不同。