c語言中函式呼叫的過程
阿新 • • 發佈:2019-01-24
一.程式在記憶體中的佔用。
要學習C語言中函式呼叫的過程,必須要知道程式在記憶體中各個區域的分佈。
C語言的函式呼叫的過程主要分佈在棧中,所以我們今天主要研究棧。
二.幾個基本的彙編指令。
call:1.將當前指令的下一條指令的地址儲存到棧中。
2.跳轉至目標函式的地址。
ret :彈出棧頂地址將資料放入eip
從棧頂入棧稱為push
從棧底出棧稱為pop
三.常用暫存器。
在CPU中:讀取指令(記憶體-->CPU)-->分析指令(CPU)-->執行指令(CPU)
1. EAX:累積暫存器,EBX:基底暫存器,ECX:計數暫存器,EDX:資料暫存器
2. EIP(pc):程式計數器(用來存放當前正在執行指令的下一條指令的地址)
3. ESP:棧頂
4. EBP:棧底
四.函式的呼叫與棧幀的建立銷燬。
例項函式:
轉換成組合語言:
首先由_tmainCRTStartup呼叫main函式,並在棧中建立了一個棧幀。
分別把a和b的值壓入棧中:
建立b,a臨時變數壓棧。
call指令儲存當前指令下一條計數器的值,並跳轉到指定地址。
建立新的棧幀myadd
定義z,並計算a+b,並返回z的值到main中
將a+b的值賦給c。
到這裡函式的呼叫就結束了。