首先,
__thiscall
是關於類的一種呼叫方式,它與其他呼叫方式的最大區別是:
__thiscall對每個函式都增加了乙個類指標引數
class aa
;
實際上bb的函式原形是void bb(aa &this, int cc);
這就是__thiscall的呼叫方式
__cdecl :c和c++預設呼叫方式
例子:
void input( int &m,int &n); /*相當於void __cdecl input(int &m,int &n);*/
以下是相應的彙編**:
00401068 lea eax,[ebp-8] ;取[ebp-8]位址(ebp-8),存到eax
0040106b push eax ;然後壓棧
0040106c lea ecx,[ebp-4] ;取[ebp-4]位址(ebp-4),存到ecx
0040106f push ecx ;然後壓棧
00401070 call @ilt+5(input) (0040100a);然後呼叫input函式
00401075 add esp,8 ;恢復棧
從以上呼叫input函式的過程可以看出:在呼叫此函式之前,首先壓棧ebp-8,然後壓棧ebp-4,然後呼叫函式input,最後input函式呼叫結束後,利用esp+8恢復棧。由此可見,在c語言呼叫中預設的函式修飾_cdecl,由主呼叫函式進行引數壓棧並且恢復堆疊。
**:
stdcall 與 cdecl 的區別
stdcall 與 cdecl 的區別 幾乎我們寫的每乙個windows api函式都是 stdcall型別的,首先,需要了解兩者之間的區別 windows的函式呼叫時需要用到棧 stack,一種先入後出的儲存結構 當函式呼叫完成後,棧需要清除,這裡就是問題的關鍵,如何清除?如果我們的函式使用了 c...
stdcall 與 cdecl 的區別
幾乎我們寫的每乙個windows api函式都是 stdcall型別的,首先,需要了解兩者之間的區別 windows的函式呼叫時需要用到棧 stack,一種先入後出的儲存結構 當函式呼叫完成後,棧需要清除,這裡就是問題的關鍵,如何清除?如果我們的函式使用了 cdecl,那麼棧的清除工作是由呼叫者,用...
stdcall與cdecl的區別
1 區別vc 的c c 函式有兩種基本的呼叫約定 stdcall cdecl stdcall cdecl 函式 cint stdcalladds int a,int b int cdecladdc int a,int b asm32 push ebp mov ebp,esp sub esp,40h ...