2016-11-23 48 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).

所以回答你的問題是 - 沒有它不可能在全球範圍內的使用功能外擴展彙編程序模板。正如你發現基本的彙編語句是被允許的。