thiscall與 cdecl呼叫方式

2021-07-12 03:36:22 字數 857 閱讀 9584

首先,

__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 ...