b?a:b;  }  int__cdeclmin(inta,intb)  { ">

c語言函數(shù)調(diào)用方式的區(qū)別

ID:14169616

大?。?0.00 KB

頁數(shù):22頁

時間:2018-07-26

c語言函數(shù)調(diào)用方式的區(qū)別_第1頁
c語言函數(shù)調(diào)用方式的區(qū)別_第2頁
c語言函數(shù)調(diào)用方式的區(qū)別_第3頁
c語言函數(shù)調(diào)用方式的區(qū)別_第4頁
c語言函數(shù)調(diào)用方式的區(qū)別_第5頁
資源描述:

《c語言函數(shù)調(diào)用方式的區(qū)別》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、C語言函數(shù)調(diào)用方式的區(qū)別通常在使用VC進行函數(shù)定義時會指定該函數(shù)調(diào)用方式,諸如:  int__stdcallmax(inta,intb)  {  returna>b?a:b;  }  int__cdeclmin(inta,intb)  {  returna

2、名:WINAPI,CALLBACK,PASCAL。該類特點是:主調(diào)函數(shù)負責(zé)參數(shù)入棧,由函數(shù)本身負責(zé)棧的恢復(fù)。  第二類:__cdecl類別名:C/C++中默認(rèn)調(diào)用方式,若你定義函數(shù)未指定函數(shù)調(diào)用約定(CallingConventions),例如在VC6中下面兩個函數(shù)的調(diào)用約定是等價的:  intmax(inta,intb)  {  returna>b?a:b;  }  int__cdeclmin(inta,intb)  {  returna

3、并由主調(diào)函數(shù)負責(zé)線的恢復(fù)?! 〉谌悾篲_thiscall該類比較特殊,只用于類成員函數(shù)調(diào)用,你甚至不能強制指定這個函數(shù)調(diào)用約定。它是由C/C++編譯器自動添加的。在C/C++中類成員函數(shù)會默認(rèn)傳入一個this指針,對于此,在默入情況下,C/C++中類成員函數(shù)通過此類調(diào)用約定來指定this指針?! 〗又榻B一下__thiscall,__thiscall是關(guān)于類的一種調(diào)用方式?! ∷c其他調(diào)用方式的最大區(qū)別是:  __thiscall對每個函數(shù)都增加了一個類指針參數(shù)  classaa  {  voidbb(in

4、tcc);  };  實際上bb的函數(shù)原形是voidbb(aa&this,intcc);  __cdecl的調(diào)用方式介紹:C和C++缺省調(diào)用方式  例子:  voidInput(int&m,int&n);/*相當(dāng)于void__cdeclInput(int&m,int&n);*/  以下是相應(yīng)的匯編代碼:  00401068leaeax,[ebp-8];取[ebp-8]地址(ebp-8),存到eax  0040106Bpusheax;然后壓?! ?040106Cleaecx,[ebp-4];取[ebp-4]地址

5、(ebp-4),存到ecx  0040106Fpushecx;然后壓?! ?0401070call@ILT+5(Input)(0040100a);然后調(diào)用Input函數(shù)  00401075addesp,8;恢復(fù)棧  從以上調(diào)用Input函數(shù)的過程可以看出:在調(diào)用此函數(shù)之前,首先壓棧ebp-8,然后壓棧ebp-4,然后調(diào)用函數(shù)Input,最后Input函數(shù)調(diào)用結(jié)束后,利用esp+8恢復(fù)棧。由此可見,在C語言調(diào)用中默認(rèn)的函數(shù)修飾_cdecl,由主調(diào)用函數(shù)進行參數(shù)壓棧并且恢復(fù)堆棧?! ∠旅婵匆幌拢旱刂積bp-8和e

6、bp-4是什么?在VC的VIEW->debugwindows->Registers,顯示寄存器變量值,然后在選debugwindows->Memory,輸入ebp-8的值和ebp-4的值(或直接輸入ebp-8和-4),看一下這兩個地址實際存儲的是什么值,實際上是變量"n"的地址(ebp-8),m的地址(ebp-4)?! ∮纱丝梢钥闯觯涸谥髡{(diào)用函數(shù)中進行實參的壓棧并且順序是從右到左。另外,由于實參是相應(yīng)的變量的引用,也證明實際上引用傳遞的是變量的地址(類似指針)?! 】偨Y(jié):在C或C++語言調(diào)用中默認(rèn)的函數(shù)修飾_

7、cdecl,由主調(diào)用函數(shù)進行參數(shù)壓棧并且恢復(fù)堆棧,實參的壓棧順序是從右到左,最后由主調(diào)函數(shù)進行堆?;謴?fù)。由于主調(diào)用函數(shù)管理堆棧,所以可以實現(xiàn)變參函數(shù)。另外,命名修飾方法是在函數(shù)前加一個下劃線(_)?! stdcall調(diào)用約定介紹:實際上就是PASCAL,CALLBACK,WINAPI  例子:  voidWINAPIInput(int&m,int&n);  看一下相應(yīng)調(diào)用的匯編代碼:  00401068leaeax,[ebp-8]  0040106Bpusheax  0040106Cleaecx,[ebp-

8、4]  0040106Fpushecx  00401070call@ILT+5(Input)(0040100a)  從以上調(diào)用Input函數(shù)的過程可以看出:在調(diào)用此函數(shù)之前,首先壓棧ebp-8,然后壓棧ebp-4,然后調(diào)用函數(shù)Input,在調(diào)用函數(shù)Input之后,沒有相應(yīng)的堆棧恢復(fù)工作(為其它的函數(shù)調(diào)用,所以我沒有列出)下面再列出Input函數(shù)本身的匯編代碼:(實際此函數(shù)不大,但做匯編例子還是大了些

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。
关闭