亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

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

gnehc / 1495人閱讀

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

目錄

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

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

那些代碼背后的故事:

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

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

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

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

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

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

反匯編查看:?

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

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

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

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

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

完成a的開辟、存值:

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

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

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

?push?壓棧:

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

?傳參:?

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

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

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

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

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

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

?注:

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

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

因此說:形參是對(duì)實(shí)參的臨時(shí)拷貝!改變形參的值不影響實(shí)參!

?返回:

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

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

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

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

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

?這時(shí)顯現(xiàn)出最初在棧頂存儲(chǔ)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ī)值,因?yàn)閯?chuàng)建的時(shí)候是隨機(jī)放置的值!初始化后隨機(jī)值被覆蓋!

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

傳參是從右向左傳!

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

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

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

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

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

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

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

注:

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

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

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

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

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



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

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

那些代碼背后的故事:

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

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

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

?

?越高級(jí)的編譯器越難以抽離函數(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ù)也會(huì)被其他函數(shù)調(diào)用哦!

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

?

?

?

?

??

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

反匯編查看:

?

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

?

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

?

?

?

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/124090.html

相關(guān)文章

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

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

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

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

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

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

    lykops 評(píng)論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 評(píng)論0 收藏0
  • C語言學(xué)習(xí)筆記—P15(指針<初階>+圖解+題例

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

    weknow619 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<