在全局函数中使用sparc扩展asm

时间:2016-11-23 17:30:32

标签: gcc assembly inline-assembly sparc

我正在尝试编写汇编函数而不使用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");

感谢。

1 个答案:

答案 0 :(得分:4)

来自GCC Documentation

  

请注意,扩展的asm 语句必须位于函数中。只有基本的asm可能在函数之外(参见Basic Asm)。使用naked属性声明的函数也需要基本的asm(参见Function Attributes)。

所以你的问题的答案是 - 不可能在全局上下文中的函数之外使用扩展汇编程序模板。正如您所发现的那样,允许使用基本的汇编语句。

相关问题