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

資訊專欄INFORMATION COLUMN

C語言學(xué)習(xí)筆記—P17(函數(shù)棧幀的創(chuàng)建與銷毀<超詳解版>+圖解+題例)

gnehc / 1434人閱讀

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

目錄

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

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

那些代碼背后的故事:

通過反匯編講解函數(shù)棧幀的創(chuàng)建與銷毀!

?注:本次編譯環(huán)境為:Visual Stdio 2013 !

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

main函數(shù)也會被其他函數(shù)調(diào)用哦!

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

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

反匯編查看:?

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

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

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

?? ? ?????????????????????????????????????????????????????????????????——By 作者:新曉·故知? 整理+創(chuàng)作?

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

完成a的開辟、存值:

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

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

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

?push?壓棧:

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

?傳參:?

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

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

?為Add函數(shù)準(zhǔn)備棧幀!?

?? ? ?????????????????????????????????????????????????????????????????——By 作者:新曉·故知? 整理+創(chuàng)作?

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

形參對應(yīng)的函數(shù)(子函數(shù))計算:?

?注:

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

當(dāng)進(jìn)入函數(shù)計算時,形參回頭去找壓棧時的空間的a、b對應(yīng)的值!

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

?返回:

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

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

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

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

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

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

在進(jìn)行函數(shù)調(diào)用結(jié)束后回到主函數(shù),并從call指令的下一條指令開始執(zhí)行!

邏輯嚴(yán)謹(jǐn)!不僅要走的出去,也要回的來!

?esp執(zhí)行至此,形參的空間均已釋放歸還給操作系統(tǒng)!

?而eax的值暫存的z=30!主函數(shù)進(jìn)行打印輸出!

解答:

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

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

3.函數(shù)的傳參是在未調(diào)用形參對應(yīng)的函數(shù)(子函數(shù))時通過push 操作將實參的值壓棧,當(dāng)真正進(jìn)入形參函數(shù)時,在形參對應(yīng)的函數(shù)(子函數(shù))棧幀里通過指針的偏移量,找回形參,進(jìn)行使用!

傳參是從右向左傳!

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

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

5.函數(shù)的調(diào)用見以上講解!

6.函數(shù)調(diào)用的結(jié)果的返回:

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

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

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

注:

函數(shù)內(nèi)部創(chuàng)建的靜態(tài)變量是在全局變量空間開辟的!而以上介紹的是在棧區(qū)空間開辟的!

編譯器會根據(jù)函數(shù)的不同,開辟合適的空間!

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

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

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ?——Since 作者:新曉·故知? 整理+創(chuàng)作



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

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

那些代碼背后的故事:

通過反匯編講解函數(shù)棧幀的創(chuàng)建與銷毀!

?注:本次編譯環(huán)境為:Visual Stdio 2013 !

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

?

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

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函數(shù)也會被其他函數(shù)調(diào)用哦!

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

?

?

?

?

??

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

反匯編查看:

?

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

?

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

?

?

?

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/124090.html

相關(guān)文章

  • C語言知識精講②】函數(shù)幀的創(chuàng)建銷毀(全程圖解

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

    davidac 評論0 收藏0
  • C語言深層理解:函數(shù)幀的創(chuàng)建銷毀

    摘要:語言深層理解函數(shù)中棧幀的創(chuàng)建與銷毀引言引言問題一引言問題二引言問題三一棧的簡單認(rèn)識內(nèi)存的簡單了解棧的簡單了解棧的定義棧的結(jié)構(gòu)二寄存器與簡單的匯編指令寄存器的定義寄存器的分類簡單的匯編指令三棧幀的創(chuàng)建于銷毀調(diào)試調(diào)用堆棧調(diào) ...

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

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

    lykops 評論0 收藏0
  • 函數(shù)棧幀解析

    摘要:函數(shù)棧幀的銷毀匯編語言了解函數(shù)傳參函數(shù)返回值如何返回函數(shù)中變量如何初始化和賦值函數(shù)執(zhí)行結(jié)束后系統(tǒng)進(jìn)行了什么操作 文章目錄 一、什么是函數(shù)棧幀 1.寄存器2.函數(shù)棧幀3.棧幀的作用和維護(hù)4.棧幀結(jié)構(gòu)二、函數(shù)棧幀的創(chuàng)建? 1.匯編2.main函數(shù)3.Add函數(shù)的創(chuàng)建三、函數(shù)...

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

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

    weknow619 評論0 收藏0

發(fā)表評論

0條評論

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