在全局函数中使用 sparc extended asm
Use sparc extended asm in global function
我试图在不使用 c 原型的情况下编写汇编函数。
出于某种原因,gcc 似乎不允许在全局上下文中使用扩展 asm。
请考虑以下编译成功的代码:
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: error: expected ')' before ':' token :"=r"
(return_addr)); ^
请注意,当我不使用如下扩展汇编时,编译器认可代码:
asm(".global foo2\n\t"
"foo2:\n\t");
asm("jmpl %o7 + 8, %g0\n\t");
谢谢。
Note that extended asm statements must be inside a function. Only basic asm may be outside functions (see Basic Asm). Functions declared with the naked attribute also require basic asm (see Function Attributes).
所以您的问题的答案是 - 不,不可能在全局上下文中的函数外部使用扩展汇编器模板。正如您所发现的,基本的汇编程序语句是允许的。
我试图在不使用 c 原型的情况下编写汇编函数。 出于某种原因,gcc 似乎不允许在全局上下文中使用扩展 asm。
请考虑以下编译成功的代码:
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: error: expected ')' before ':' token :"=r" (return_addr)); ^
请注意,当我不使用如下扩展汇编时,编译器认可代码:
asm(".global foo2\n\t"
"foo2:\n\t");
asm("jmpl %o7 + 8, %g0\n\t");
谢谢。
Note that extended asm statements must be inside a function. Only basic asm may be outside functions (see Basic Asm). Functions declared with the naked attribute also require basic asm (see Function Attributes).
所以您的问题的答案是 - 不,不可能在全局上下文中的函数外部使用扩展汇编器模板。正如您所发现的,基本的汇编程序语句是允许的。