【轉】C/C++函數調用過程分析

來源:互聯網
上載者:User

標籤:寄存器   images   ref   出棧   bsp   說明   c代碼   span   ges   

轉自:here

這裡以一個簡單的C語言代碼為例,來分析函數調用過程

代碼:

#include <stdio.h>int func(int param1 ,int param2,int param3){        int var1 = param1;        int var2 = param2;        int var3 = param3;         printf("var1=%d,var2=%d,var3=%d",var1,var2,var3);        return var1;} int main(int argc, char* argv[]){        int result = func(1,2,3);         return 0; }

首先說明,在堆棧中變數分布是從高地址到低地址分布,EBP是指向棧底的指標,在程序呼叫中不變,又稱為幀指標。ESP指向棧頂,程式執行時移動,ESP減小分配空間,ESP增大釋放空間,ESP又稱為棧指標。

下面來逐步分析函數的調用過程

1.函數main執行,main各個參數從右向左逐步壓入棧中,最後壓入返回地址

2.執行第15行,3個參數以從左向右的順序壓入堆棧,及從param3到param1,棧內分布如:

 3.然後是返回地址入棧:此時的棧內分布如下:

4.第3行函數調用時,通過跳轉指令進入函數後,函數地址入棧後,EBP入棧,然後把當前ESP的值給EBP,對應的彙編指令

push ebpmov ebp esp

   此時棧頂和棧底指向同一位置,棧內分布如下:

 

5.第5行開始執行, int var1 = param1; int var2 = param2; int var3 = param3;按申明順序依次儲存。對應的彙編:

mov 0x8(%ebp),%eaxmov %eax,-0x4(%ebp)

  其中將[EBP+0x8]地址裡的內容賦給EAX,即把param的值賦給EAX,然後把EAX的中的值放到[EBP-4]這個地址裡,即把EAX值賦給var1,完成C代碼 int var1 = param1,其他變數雷同。

6.第9行,輸出結果,第10行執行 對應的彙編代碼:

mov  -0x4(%ebp),%eax

 最後通過eax寄存器儲存函數的傳回值;

 

 

7.調用執行函數完畢,局部變數var3,var2,var1一次出棧,EBP恢複原值,返回地址出棧,找到原執行地址,param1,param2,param3依次出棧,函數調用執行完畢。圖略

【轉】C/C++函數調用過程分析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.