从 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 引用的输入符号。
我想将内联汇编中定义的函数的地址发送给 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 引用的输入符号。