函數調用時候:
創新互聯建站專注于大廠網站建設服務及定制,我們擁有豐富的企業做網站經驗。 熱誠為您提供大廠營銷型網站建設,大廠網站制作、大廠網頁設計、大廠網站官網定制、微信小程序開發服務,打造大廠網絡公司原創品牌,更為您提供大廠網站排名全網營銷落地服務。1. 棧針寄存器 esp ebp
esp 增大的時候棧空間減小,減小的時候棧空間增大,ebp指向棧基址不變。
2. 調用函數的時候參數由右至左壓棧,棧空間方向是從高地址(棧底)到低地址(棧頂),然后壓入返回地址,函數地址入棧后,EBP入棧,然后把當前ESP的值給EBP,對應的匯編指令:
push ebp mov ebp esp
這就相當于進入了此函數的棧空間,
下面是轉載內容:
http://blog.163.com/yichangjun1989@126/blog/static/131972028201442221956603/
#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依次出棧,函數調用執行完畢
另外有需要云服務器可以了解下創新互聯cdcxhl.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網站標題:函數調用過程-創新互聯
本文來源:http://vcdvsql.cn/article22/dsdpcc.html
成都網站建設公司_創新互聯,為您提供外貿網站建設、域名注冊、商城網站、建站公司、App設計、網站制作
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯