Visual C++中函數調用方式淺探

發表于:2007-04-27來源:作者:點擊數: 標簽:淺探方式C++visual調用
天極IT資訊短信服務 電腦小技巧 資費:包月5元 手機: 介紹:細處著手,巧處用功。高手和菜鳥之間的差別就是:高手什么都知道,菜鳥知道一些。電腦小技巧收集最新奇招高招,讓你輕松踏上高手之路。 我們知道在進行函數調用時,有幾種調用方法,分為C式,Pasc
天極IT資訊短信服務 電腦小技巧
clearcase/" target="_blank" >cc0 border=0>
資費:包月5元
手機:
介紹:細處著手,巧處用功。高手和菜鳥之間的差別就是:高手什么都知道,菜鳥知道一些。電腦小技巧收集最新奇招高招,讓你輕松踏上高手之路。


  我們知道在進行函數調用時,有幾種調用方法,分為C式,Pascal式。在C和C++中C式調用是缺省的,除非特殊聲明。二者是有區別的,下面我們用實例說明一下:



  1. __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,由主調用函數進行參數壓棧并且恢復堆棧。

  下面看一下:地址ebp-8和ebp-4是什么?

  在VC的VIEW下選debug windows,然后選Registers,顯示寄存器變量值,然后在選debug windows下面的Memory,輸入ebp-8的值和ebp-4的值(或直接輸入ebp-8和-4),看一下這兩個地址實際存儲的是什么值,實際上是變量 n 的地址(ebp-8),m的地址(ebp-4),由此可以看出:在主調用函數中進行實參的壓棧并且順序是從右到左。另外,由于實參是相應的變量的引用,也證明實際上引用傳遞的是變量的地址(類似指針)。

  總結:在C或C++語言調用中默認的函數修飾_cdecl,由主調用函數進行參數壓棧并且恢復堆棧,實參的壓棧順序是從右到左,最后由主調函數進行堆?;謴?。由于主調用函數管理堆棧,所以可以實現變參函數。另外,命名修飾方法是在函數前加一個下劃線(_).

共2頁。 1 2 8 :

原文轉自:http://www.anti-gravitydesign.com

評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
...
国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97