2016-11-23 50 views
1

我想编写一个不使用c原型的程序集函数。 由于某些原因,它看起来像gcc不允许在全局上下文中使用扩展的asm。在全局函数中使用sparc扩展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: error: expected ')' before ':' token :"=r" (return_addr)); ^

请注意,当我如下不使用推广的ASM,编译批准代码:

asm(".global foo2\n\t" 
    "foo2:\n\t"); 
asm("jmpl  %o7 + 8, %g0\n\t"); 

感谢。

+2

嗯。 *为什么*你想要这样做?刚使用'foo()'有什么问题?特别是如果您将其标记为内联。 –

+0

@DavidWohlferd我也很好奇,虽然在x86上它对引导加载程序很有用,因为x86不支持函数的_naked_属性。他可能试图避免任何序言和结尾代码。用ARM我敢肯定你可以创建一个包含基本内联汇编的裸函数。如果您需要使代码首先出现在二进制文件中,那么链接器脚本是您最好的朋友。 –

+0

@DavidWohlferd没错,我试图避免任何序言和结尾代码。我无法为sparc创建裸函数,如[在这里]所示(http://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc)。我并没有完全理解你的建议,但我找到了另一种方法 - 我使用foo()生成的汇编代码,并简单地删除了我原本想避免的部分(我将在明天发布它)。谢谢 –

回答

4

GCC Documentation

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).

所以回答你的问题是 - 没有它不可能在全球范围内的使用功能外扩展汇编程序模板。正如你发现基本的汇编语句是被允许的。