我正在尝试编写汇编函数而不使用c原型。 出于某种原因,看起来gcc不允许在全局上下文中使用扩展的asm。
请考虑以下编译succssefully的代码:
void *g_var;
void foo()
{
asm ("stx %%i7, [%0]"
:"=r" (g_var));
}
当我也尝试使用asm定义原型时,如下所示:
asm(".global foo2\n\t"
"foo2:\n\t");
asm ("stx %%i7, [%0]"
:"=r" (g_var));
编译器给出了以下错误,好像扩展的asm不能在全局上下文中使用。
foo.c:151:2:错误:预期')'之前':'令牌:" = r" (return_addr)); ^
请注意,当我不按如下方式使用扩展的asm时,编译器会批准代码:
asm(".global foo2\n\t"
"foo2:\n\t");
asm("jmpl %o7 + 8, %g0\n\t");
感谢。
答案 0 :(得分:4)
请注意,扩展的asm 语句必须位于函数中。只有基本的asm可能在函数之外(参见Basic Asm)。使用naked属性声明的函数也需要基本的asm(参见Function Attributes)。
所以你的问题的答案是 - 不可能在全局上下文中的函数之外使用扩展汇编程序模板。正如您所发现的那样,允许使用基本的汇编语句。