我想編寫一個不使用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()生成的彙編代碼,並簡單地刪除了我原本想避免的部分(我將在明天發佈它)。謝謝 –