摘要:目錄前言由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教前言由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教作者新曉故知作者新曉故知那些代碼背后的故事那些代碼背后的故事通過
目錄
前言:●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教!
???????? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——By 作者:新曉·故知
通過反匯編講解函數(shù)棧幀的創(chuàng)建與銷毀!
?注:本次編譯環(huán)境為:Visual Stdio 2013 !
main函數(shù)也會被其他函數(shù)調(diào)用哦!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?? ? ?????????????????????????????????????????????????????????????????——By 作者:新曉·故知? 整理+創(chuàng)作?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?? ? ?????????????????????????????????????????????????????????????????——By 作者:新曉·故知? 整理+創(chuàng)作?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
形參對應(yīng)的函數(shù)(子函數(shù))計算:?
當(dāng)進(jìn)入函數(shù)計算時,形參回頭去找壓棧時的空間的a、b對應(yīng)的值!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?這時顯現(xiàn)出最初在棧頂存儲call指令的下一條指令地址的作用:
在進(jìn)行函數(shù)調(diào)用結(jié)束后回到主函數(shù),并從call指令的下一條指令開始執(zhí)行!
?esp執(zhí)行至此,形參的空間均已釋放歸還給操作系統(tǒng)!
?而eax的值暫存的z=30!主函數(shù)進(jìn)行打印輸出!
1.局部變量的創(chuàng)建是首先為函數(shù)分配棧幀空間,棧幀空間初始化一部分空間后,再為局部變量分配一些空間!
2.局部變量不初始化的是隨機(jī)值,因為創(chuàng)建的時候是隨機(jī)放置的值!初始化后隨機(jī)值被覆蓋!
4.形參是在壓棧時開辟的空間 ,它和實參只是在數(shù)值上相同的,空間上是獨立的!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
函數(shù)內(nèi)部創(chuàng)建的靜態(tài)變量是在全局變量空間開辟的!而以上介紹的是在棧區(qū)空間開辟的!
?1.a和b是不連續(xù)的,相隔的空間大小取決于不同的編譯器!
2.函數(shù)的形參可以理解為:不在形參對應(yīng)的函數(shù)(子函數(shù))的棧幀里,而在主函數(shù)main拓展的棧幀里!
?注:本次編譯環(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
摘要:這里分塊講解六函數(shù)棧幀的銷毀過程一解析的作用是將棧頂?shù)臄?shù)據(jù)彈出,彈出數(shù)據(jù)儲存到相應(yīng)寄存器中。 ?前言? 讀完這篇博客,你可以明白什么? ①局部變量到底是怎么在棧上創(chuàng)建的? ②為什么局部變量不初始化為隨機(jī)值? ③函數(shù)是怎么傳參的?傳參的先后順序是什么? ④形參和實參是什么關(guān)系? ⑤函數(shù)調(diào)用是怎...
摘要:語言深層理解函數(shù)中棧幀的創(chuàng)建與銷毀引言引言問題一引言問題二引言問題三一棧的簡單認(rèn)識內(nèi)存的簡單了解棧的簡單了解棧的定義棧的結(jié)構(gòu)二寄存器與簡單的匯編指令寄存器的定義寄存器的分類簡單的匯編指令三棧幀的創(chuàng)建于銷毀調(diào)試調(diào)用堆棧調(diào) ...
目錄 ?前言:●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教! ???????? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——By 作者:新曉·故知 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...
摘要:函數(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ù)...
摘要:變量占用個字節(jié)的空間,這里是將的個字節(jié)的第一個字節(jié)的地址存放在變量中,就是一個之指針變量。是指針變量作者新曉故知總結(jié)指針變量,用來存放地址的變量。 目錄 前言:●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教! ???????? ? ? ?? ? ? ? ? ? ...
閱讀 1248·2021-11-22 13:54
閱讀 1435·2021-11-22 09:34
閱讀 2712·2021-11-22 09:34
閱讀 4024·2021-10-13 09:39
閱讀 3348·2019-08-26 11:52
閱讀 3370·2019-08-26 11:50
閱讀 1538·2019-08-26 10:56
閱讀 1920·2019-08-26 10:44