C語言之函式呼叫

2021-07-05 04:42:56 字數 1848 閱讀 8174

c

語言之函式呼叫-棧幀

學過彙編的都知道在彙編中子程式呼叫是怎樣實現的

那高階語言中的函式呼叫是怎樣實現的?

通過棧幀,什麼是棧幀?

棧幀是函式呼叫的過程記錄

棧幀是怎麼實現的?

有如下**

反彙編**如下

我們發現在call

指令呼叫

add函式前進行了兩次

push 

操作把add

函式所需的引數壓入棧中,這就是呼叫前的準備工作,而

add esp,8

指令是函式呼叫後的清除工作(釋放引數所佔的棧空間),

接下來讓我們進入add

函式的內部看看編譯器是怎樣用棧幀實現函式呼叫的以及棧幀是怎樣生成的

下面我畫個圖來表示表示棧幀以及這段**所做的事(生成乙個棧幀)

紅色標識的是main

函式的棧幀,藍色標識的是

add函式的棧幀,單箭頭表示單元存放的是

xx的值

,雙箭頭表示

xx暫存器的值指向

進入函式的第乙個操作就是push ebp

儲存main

的ebp,

第二個操作把mov ebp,esp    main 

的棧頂指標做為

add函式基棧指標,生成基棧指標

第三個操作sub esp,40h

為add

函式分配

64位元組的棧空間用來儲存區域性變數(儘管

add函式沒有區域性變數),生成棧頂指標

第4,5,6

個操作分別在棧中儲存

ebx,esi,edi

暫存器的值 第7

,8,9

,10操作把分配的

64位元組棧空間,以

4個位元組為單位分

16次,把每個位元組賦值為

0(棧初始化),,,,

第11,12

,13操作是a=a+b

第14,15

,16操作恢復

esi,edi,ebx

的值 

第17個操作

mov esp,ebp

恢復main

函式的棧頂指標

第18個操作pop pbp 

恢復main

函式的基棧指標

第19個操作從

add函式中返回到

main

函式中

ebp與

esp間的內容就是函式的呼叫的過程記錄即棧幀 

所有操作中我們都沒有看到關於「call

那麼它是什麼時候被push 

什麼時候被

pop的?

它的作用是什麼?

在執行call

指令時會把它壓棧,執行

ret指令時會把它

pop 到pc

暫存器中

現在你知道它的做用是什麼了?

就是儲存函式呼叫後的返回位址

返回到?

當然是返回到呼叫者中

現在你知道c

語言的函式呼叫是怎樣實現的了?

注:vc6.0

c語言之函式的呼叫

c語言中函式的呼叫目的就是為了簡化 能夠讓 重複使用,且使 看起來便於理解 格式 返回值型別 函式名 形式引數列表 此段 是用來求兩數之和的,我們可以看到此時並沒有用到函式的呼叫,那麼該怎麼進行修改呢?此時我們給出另一段 define crt secure no warnings 1 include...

linux下C語言之呼叫簡單函式

今天我們來學習下簡單的自定義函式。下面是個最簡單的自定義函式,列印乙個空行 void newline void 然後我們在主函式裡面呼叫它,看下效果,首先新建乙個檔案,two.c root localhost vi two.c include void newline void int main v...

C語言之函式

1.前導程式 2.函式概述 1 列印乙個信頭 2 include3 include 4 define name gigathink,inc.5 define address 101 megabuck plaza 6 define place megapolis,ca 94904 7 define w...