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...