我想编写一个不使用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");
感谢。
嗯。 *为什么*你想要这样做?刚使用'foo()'有什么问题?特别是如果您将其标记为内联。 –
@DavidWohlferd我也很好奇,虽然在x86上它对引导加载程序很有用,因为x86不支持函数的_naked_属性。他可能试图避免任何序言和结尾代码。用ARM我敢肯定你可以创建一个包含基本内联汇编的裸函数。如果您需要使代码首先出现在二进制文件中,那么链接器脚本是您最好的朋友。 –
@DavidWohlferd没错,我试图避免任何序言和结尾代码。我无法为sparc创建裸函数,如[在这里]所示(http://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc)。我并没有完全理解你的建议,但我找到了另一种方法 - 我使用foo()生成的汇编代码,并简单地删除了我原本想避免的部分(我将在明天发布它)。谢谢 –