函數調用方式:_cdecl, _stdcall,_fastcall, thiscall,naked call

來源:互聯網
上載者:User
函數參數入棧的方式  
---------------------------------------------------------------  
在函數調用過程中,會使用堆棧,這三個表示不同的堆棧調用方式和釋放方式.
比如說__cdecl,它是標準的c方法的堆棧調用方式,就是在函數調用時的參數壓入堆棧是與函數的聲明順序相反的,其它兩個可以看MSDN,不過這個對我們編程沒有太大的作用  
---------------------------------------------------------------   
呼叫慣例     
呼叫慣例(Calling  convention)決定以下內容:函數參數的壓棧順序,由調用者還是被調用者把參數彈出棧,以及產生函數修飾名的方法。MFC支援以下呼叫慣例:  
⑴. _cdecl  
按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對於“C”函數或者變數,修飾名是在函數名前加底線。對於“C++”函數,有所不同。  
如函數void  test(void)的修飾名是_test;對於不屬於一個類的“C++”全域函數,修飾名是?test@@ZAXXZ。   
這是MFC預設呼叫慣例。由於是調用者負責把參數彈出棧,所以可以給函數定義個數不定的參數,如printf函數。   
⑵. _stdcall   
按從右至左的順序壓參數入棧,由被調用者把參數彈出棧。對於“C”函數或者變數,修飾名以底線為首碼,然後是函數名,然後是符號“@”及參數的位元組數,如函數int  func(int  a,  double  b)的修飾名是_func@12。對於“C++”函數,則有所不同。   
所有的Win32  API函數都遵循該約定。   
⑶. _fastcall   
頭兩個DWORD類型或者占更少位元組的參數被放入ECX和EDX寄存器,其他剩下的參數按從右至左的順序壓入棧。由被調用者把參數彈出棧,對於“C”函數或者變數,修飾名以“@”為首碼,然後是函數名,接著是符號“@”及參數的位元組數,如函數int  func(int  a,  double  b)的修飾名是@func@12。對於“C++”函數,有所不同。  
未來的編譯器可能使用不同的寄存器來存放參數。
⑷. thiscall     
僅僅應用於“C++”成員函數。this指標存放於CX寄存器,參數從右至左壓棧。thiscall不是關鍵詞,因此不能被程式員指定。   
⑸. naked  call   
採用1-4的呼叫慣例時,如果必要的話,進入函數時編譯器會產生代碼來儲存ESI,EDI,EBX,EBP寄存器,退出函數時則產生代碼恢複這些寄存器的內容。naked  call不產生這樣的代碼。   
naked  call不是類型修飾符,故必須和_declspec共同使用,如下:  
__declspec(  naked  )  int  func(  formal_parameters  )   
{   
//  Function  body   
}   
過時的呼叫慣例
原來的一些呼叫慣例可以不再使用。它們被定義成呼叫慣例_stdcall或者_cdecl。例如:  
#define  CALLBACK  __stdcall  
#define  WINAPI  __stdcall   
#define  WINAPIV  __cdecl   
#define  APIENTRY  WINAPI   
#define  APIPRIVATE  __stdcall   
#define  PASCAL  __stdcall  
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.