c語言是面向過程的計數機語言,其本質就是函式的呼叫,從彙編的角度深層次剖析函式之間的呼叫關係,將對c語言的理解更上一層樓。
先來看一段**
#include
int myfun(int x, int y)
int main()
這個例項實現了myfun()
函式的呼叫,接下來分析myfun
是如何被呼叫的。
首先轉到反彙編(我使用的工具是vs2013)
int main()
9: 0106149a pop edi
0106149b pop esi
0106149c pop ebx
0106149d mov esp,ebp
0106149f pop ebp
010614a0 ret
和主函式一樣,首先開闢棧楨
當前棧底是接著esp
之前push010613f9
開闢的,所以ebp到010613f9
為ebp+4(位址int)
,而010613f9
下是a(a是int再加4)
,所以ebp+8
是a,b在a下,即ebp+och(12)
,add
是對取回的ab求和
0106148e
moveax,dword
ptr[ebp+8]
01061491 add
eax,dword
ptr[ebp+0ch]
ebp-8
自然是進入到棧楨空間,將eax
內的a+b存入
mov
dword
ptr[ebp-8],eax
又將a+b的結果存入eax
用於返回值
函式的呼叫大致完成,撤銷棧楨
這裡pop
彈出函式一開始push
的ebp
位址,也就是主函式時的棧底
程式重新回到主函式,之前被push
的010613f9
重新回到eip中,到此,函式的呼叫完成。
深度剖析函式的呼叫過程(棧幀)
當我們在學習c語言的時候,寫 一定會用到函式 main函式 但函式在使用過程中是如何呼叫的,當我們從彙編的角度來剖析函式的呼叫,會讓我們對函式的認識剛深一層。注 使用的工具是vs2017 下面我將通過一段 來剖析函式是如何呼叫的 include int add int x,int y int mai...
深度剖析 函式指標
宣告 下面 所有在windows7 vs2010環境下編譯通過。並執行無誤。是指向函式的指標變數,在c編譯時。每個函式都有乙個入口位址。那麼這個指向這個函式的函式指標便指向這個位址。函式指標的用途是非常大的,主要有兩個作用 用作呼叫函式和做函式的引數。資料型別標誌符 指標變數名 形參列表 一般函式的...
深度剖析C 全域性建構函式和析構函式的呼叫機制
c 全域性建構函式和析構函式的呼叫機制 控制台exe中c 的全域性變數在main之前初始化,在main之後清除,vc編譯器 鏈結器和vc執行庫 互相配合完成了這個魔術。請複製這段 到你新建的控制台程式,建立並執行 include stdafx.h include define secname crt...