2010-06-11 141 views
8

我正在研究將爲Windows編寫的腳本引擎移植到Linux;它適用於Winamp的可視化平臺AVS。我不確定目前是否有可能。從我可以告訴代碼正在使用C函數nseel_asm_atannseel_asm_atan_end的地址,並將它們存儲在它可以在代碼執行過程中引用的表內。有人可以解釋__declspec(裸體)嗎?

我已經看過MS的文檔,但我不確定__declspec(naked)究竟做了什麼。文檔中提到的prolog和epilog代碼是什麼?這與Windows調用約定有關嗎?這是便攜式嗎?瞭解使用類似技術的任何基於Linux的示例?

static double (*__atan)(double) = &atan; 
__declspec (naked) void nseel_asm_atan(void) 
{ 
    FUNC1_ENTER 

    *__nextBlock = __atan(*parm_a); 

    FUNC_LEAVE 
} 
__declspec (naked) void nseel_asm_atan_end(void) {} 
+0

這就是他們所說的序言和結語:HTTP:// msdn.microsoft.com/en-us/library/tawsa7cb(VS.80).aspx,我非常肯定,你可以'#define __declspec(n)'擴展到Linux。我認爲GNU C++實現了類似的功能,但我不太確定它是什麼。 – 2010-06-11 11:01:47

回答

5

基本上,函數序言爲局部變量設置了一個堆棧幀,結尾部分負責清理它。這通常由編譯器自動完成。如果使用__declspec(naked),則設置此堆棧幀將由您決定,因此它可以提供更大的靈活性。

有很多參考文獻:herehere,also here和更多。

的GNU gcc編譯器還支持裸,但顯然不是針對x86:search for "naked" in the page(我還沒有嘗試,看看它是否適用於x86)的