書上是這樣寫的“程序在執行過程中,如果遇到了對其他函數的調用,則暫停當前函數的執行,保存下一條指令的地址(即返回地址,作為從子函數返回后繼續執行的入口點),并保存現場,然后轉到子函數的入口地址,執行子函數?!?
3 回答

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

弒天下
TA貢獻1818條經驗 獲得超8個贊
怎么說的跟中斷似的...
函數調用就好像堆積木一樣。調用方調用一個函數的時候,被調用的函數是直接摞在調用方上面的;被調用的函數返回的時候也就好像直接把放在上面的積木拿開。
另外“現場”是不會被保存的。這不是中斷,函數返回后CPU的狀態不能保證和調用前相同。只是函數使用的棧內存因為互不相干,所以一般不會被改變(除非你主動去改)
- 3 回答
- 0 關注
- 171 瀏覽
添加回答
舉報
0/150
提交
取消