深度剖析函式的呼叫

2021-08-16 16:50:04 字數 1945 閱讀 4584

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到010613f9ebp+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彈出函式一開始pushebp位址,也就是主函式時的棧底

程式重新回到主函式,之前被push010613f9重新回到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...