3 回答

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
C++中函數(shù)調(diào)用的執(zhí)行過程有六步:
1、參數(shù)傳遞:將函數(shù)參數(shù)壓棧:mov eax,dword ptr [n] ;(n為參數(shù)變元)。
2、操作:將幀指針壓入棧中:push ebp;使得幀指針等于棧指針:mov ebp,esp;使棧指針自減,自減得到的內(nèi)存地址應(yīng)當(dāng)能夠(足夠)用來存儲被調(diào)用函數(shù)的本地狀態(tài):sub esp,0CCh。
3、傳入保存狀態(tài):push ebx ;保存ebx寄存器的值;push esi ;保存esi寄存器的值;push edi ;保存edi寄存器的值。
4、裝入edi:lea edi,[ebp-0CCh] ;0cch是當(dāng)前活動記錄的大小。
5、恢復(fù)傳入的保存狀態(tài):00411417 pop edi;00411418 pop esi;pop ebx棧指針上移,恢復(fù)空間;add esp,0CCh。
6、函數(shù)返回釋放空間:使棧指針等于幀指針: mov esp,ebp;從棧中將舊的幀指針彈出: pop ebp;返回:ret。

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超8個(gè)贊
怎么說的跟中斷似的...
函數(shù)調(diào)用就好像堆積木一樣。調(diào)用方調(diào)用一個(gè)函數(shù)的時(shí)候,被調(diào)用的函數(shù)是直接摞在調(diào)用方上面的;被調(diào)用的函數(shù)返回的時(shí)候也就好像直接把放在上面的積木拿開。
另外“現(xiàn)場”是不會被保存的。這不是中斷,函數(shù)返回后CPU的狀態(tài)不能保證和調(diào)用前相同。只是函數(shù)使用的棧內(nèi)存因?yàn)榛ゲ幌喔?,所以一般不會被改變(除非你主動去改?/p>

TA貢獻(xiàn)1816條經(jīng)驗(yàn) 獲得超6個(gè)贊
保存現(xiàn)場,即保存因?yàn)榍懊嬷赶蛘Z句所存下的數(shù)據(jù)等信息,不保存的話,當(dāng)指向完子函數(shù)會來,程序就沒有辦法往下執(zhí)行
- 3 回答
- 0 關(guān)注
- 176 瀏覽
添加回答
舉報(bào)