国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

C語言學習筆記—P17(函數棧幀的創建與銷毀<超詳解版>+圖解+題例)

gnehc / 1424人閱讀

摘要:目錄前言由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教前言由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教作者新曉故知作者新曉故知那些代碼背后的故事那些代碼背后的故事通過

目錄

前言:●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教!

???????? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——By 作者:新曉·故知

那些代碼背后的故事:

通過反匯編講解函數棧幀的創建與銷毀!

?注:本次編譯環境為:Visual Stdio 2013 !

?越高級的編譯器越難以抽離函數棧幀分裝的過程!

main函數也會被其他函數調用哦!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

反匯編查看:?

?為a、b、c開辟空間并存值:?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?? ? ?????????????????????????????????????????????????????????????????——By 作者:新曉·故知? 整理+創作?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???

完成a的開辟、存值:

?完成b的開辟、存值:??

?完成c的開辟、存值:?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?push?壓棧:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?傳參:?

?call指令將下一條指令的地址拿出壓棧!?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?為Add函數準備棧幀!?

?? ? ?????????????????????????????????????????????????????????????????——By 作者:新曉·故知? 整理+創作?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

形參對應的函數(子函數)計算:?

?注:

函數調用時沒有創建形參,最初在調用函數時,通過call指令和其他指令,就將參數傳過去了,將實參a、b通過push壓棧在a"、b"。因為是在棧中進行,所以先傳的是b(右面的參數),壓入棧中,再傳a(左面的參數),故參數從右向左傳參!

當進入函數計算時,形參回頭去找壓棧時的空間的a、b對應的值!

因此說:形參是對實參的臨時拷貝!改變形參的值不影響實參!

?返回:

?先在eax保存z的值,安全!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???

此時所有指令回到main函數!main函數的棧幀交給esp,ebp進行維護!Add函數的棧幀銷毀!別擔心!z的值在寄存器eax中存放,安全著呢!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?這時顯現出最初在棧頂存儲call指令的下一條指令地址的作用:

在進行函數調用結束后回到主函數,并從call指令的下一條指令開始執行!

邏輯嚴謹!不僅要走的出去,也要回的來!

?esp執行至此,形參的空間均已釋放歸還給操作系統!

?而eax的值暫存的z=30!主函數進行打印輸出!

解答:

1.局部變量的創建是首先為函數分配棧幀空間,棧幀空間初始化一部分空間后,再為局部變量分配一些空間!

2.局部變量不初始化的是隨機值,因為創建的時候是隨機放置的值!初始化后隨機值被覆蓋!

3.函數的傳參是在未調用形參對應的函數(子函數)時通過push 操作將實參的值壓棧,當真正進入形參函數時,在形參對應的函數(子函數)棧幀里通過指針的偏移量,找回形參,進行使用!

傳參是從右向左傳!

4.形參是在壓棧時開辟的空間 ,它和實參只是在數值上相同的,空間上是獨立的!

形參是實參的一份臨時拷貝!改變形參的值不影響實參!

5.函數的調用見以上講解!

6.函數調用的結果的返回:

調用之前將call指令的下一條指令的地址壓入棧,記錄存儲,將ebp的調用的函數的上一個函數(此例為主函數ebp-main)的棧幀的ebp地址存儲記錄,當形參對應的函數(子函數)調用完返回時,彈出ebp就找到原始函數(上一個函數,此例為main函數)的ebp,而esp的指針移動返回時就能找到原始函數(此例為main函數)的棧幀的頂,回到原始函數(main函數)的棧幀空間,就可以跳轉到已記錄的call指令的下一條指令的地址,進行返回。

返回值是通過寄存器eax帶回!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

注:

函數內部創建的靜態變量是在全局變量空間開辟的!而以上介紹的是在棧區空間開辟的!

編譯器會根據函數的不同,開辟合適的空間!

?1.a和b是不連續的,相隔的空間大小取決于不同的編譯器!

2.函數的形參可以理解為:不在形參對應的函數(子函數)的棧幀里,而在主函數main拓展的棧幀里!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ?——Since 作者:新曉·故知? 整理+創作



前言:
●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教!

???????? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——By 作者:新曉·故知

那些代碼背后的故事:

通過反匯編講解函數棧幀的創建與銷毀!

?注:本次編譯環境為:Visual Stdio 2013 !

VS2013運行結果會一閃而過解決辦法1:設置項目屬性解決辦法2:system("pause");

?

?越高級的編譯器越難以抽離函數棧幀分裝的過程!

int Add(int x, int y){	int z = 0;	z = x + y;	return z;}int main(){	int a = 10;	int b = 20;	int c = 0;	c = Add(a, b);	return 0;}

main函數也會被其他函數調用哦!

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

?

?

?

??

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

反匯編查看:

?

?為a、b、c開辟空間并存值:

?

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

?

?

?

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/124090.html

相關文章

  • C語言知識精講②】函數幀的創建銷毀(全程圖解

    摘要:這里分塊講解六函數棧幀的銷毀過程一解析的作用是將棧頂的數據彈出,彈出數據儲存到相應寄存器中。 ?前言? 讀完這篇博客,你可以明白什么? ①局部變量到底是怎么在棧上創建的? ②為什么局部變量不初始化為隨機值? ③函數是怎么傳參的?傳參的先后順序是什么? ④形參和實參是什么關系? ⑤函數調用是怎...

    davidac 評論0 收藏0
  • C語言深層理解:函數幀的創建銷毀

    摘要:語言深層理解函數中棧幀的創建與銷毀引言引言問題一引言問題二引言問題三一棧的簡單認識內存的簡單了解棧的簡單了解棧的定義棧的結構二寄存器與簡單的匯編指令寄存器的定義寄存器的分類簡單的匯編指令三棧幀的創建于銷毀調試調用堆棧調 ...

    archieyang 評論0 收藏0
  • C語言學習筆記—P12(掃雷游戲<初級>+圖解+題例

    目錄 ?前言:●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教! ???????? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——By 作者:新曉·故知 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...

    lykops 評論0 收藏0
  • 函數棧幀解析

    摘要:函數棧幀的銷毀匯編語言了解函數傳參函數返回值如何返回函數中變量如何初始化和賦值函數執行結束后系統進行了什么操作 文章目錄 一、什么是函數棧幀 1.寄存器2.函數棧幀3.棧幀的作用和維護4.棧幀結構二、函數棧幀的創建? 1.匯編2.main函數3.Add函數的創建三、函數...

    MonoLog 評論0 收藏0
  • C語言學習筆記—P15(指針<初階>+圖解+題例

    摘要:變量占用個字節的空間,這里是將的個字節的第一個字節的地址存放在變量中,就是一個之指針變量。是指針變量作者新曉故知總結指針變量,用來存放地址的變量。 目錄 前言:●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教! ???????? ? ? ?? ? ? ? ? ? ...

    weknow619 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<