摘要:目錄前言由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教前言由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教作者新曉故知作者新曉故知那些代碼背后的故事那些代碼背后的故事通過
目錄
前言:●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教!
???????? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——By 作者:新曉·故知
?注:本次編譯環境為:Visual Stdio 2013 !
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?? ? ?????????????????????????????????????????????????????????????????——By 作者:新曉·故知? 整理+創作?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?? ? ?????????????????????????????????????????????????????????????????——By 作者:新曉·故知? 整理+創作?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
當進入函數計算時,形參回頭去找壓棧時的空間的a、b對應的值!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???
此時所有指令回到main函數!main函數的棧幀交給esp,ebp進行維護!Add函數的棧幀銷毀!別擔心!z的值在寄存器eax中存放,安全著呢!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
?這時顯現出最初在棧頂存儲call指令的下一條指令地址的作用:
在進行函數調用結束后回到主函數,并從call指令的下一條指令開始執行!
1.局部變量的創建是首先為函數分配棧幀空間,棧幀空間初始化一部分空間后,再為局部變量分配一些空間!
2.局部變量不初始化的是隨機值,因為創建的時候是隨機放置的值!初始化后隨機值被覆蓋!
3.函數的傳參是在未調用形參對應的函數(子函數)時通過push 操作將實參的值壓棧,當真正進入形參函數時,在形參對應的函數(子函數)棧幀里通過指針的偏移量,找回形參,進行使用!
4.形參是在壓棧時開辟的空間 ,它和實參只是在數值上相同的,空間上是獨立的!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
函數內部創建的靜態變量是在全局變量空間開辟的!而以上介紹的是在棧區空間開辟的!
2.函數的形參可以理解為:不在形參對應的函數(子函數)的棧幀里,而在主函數main拓展的棧幀里!
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??? ?——Since 作者:新曉·故知? 整理+創作
?注:本次編譯環境為: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
摘要:這里分塊講解六函數棧幀的銷毀過程一解析的作用是將棧頂的數據彈出,彈出數據儲存到相應寄存器中。 ?前言? 讀完這篇博客,你可以明白什么? ①局部變量到底是怎么在棧上創建的? ②為什么局部變量不初始化為隨機值? ③函數是怎么傳參的?傳參的先后順序是什么? ④形參和實參是什么關系? ⑤函數調用是怎...
摘要:語言深層理解函數中棧幀的創建與銷毀引言引言問題一引言問題二引言問題三一棧的簡單認識內存的簡單了解棧的簡單了解棧的定義棧的結構二寄存器與簡單的匯編指令寄存器的定義寄存器的分類簡單的匯編指令三棧幀的創建于銷毀調試調用堆棧調 ...
目錄 ?前言:●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教! ???????? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——By 作者:新曉·故知 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ...
摘要:變量占用個字節的空間,這里是將的個字節的第一個字節的地址存放在變量中,就是一個之指針變量。是指針變量作者新曉故知總結指針變量,用來存放地址的變量。 目錄 前言:●由于作者水平有限,文章難免存在謬誤之處,敬請讀者斧正,俚語成篇,懇望指教! ???????? ? ? ?? ? ? ? ? ? ...
閱讀 1240·2021-11-22 13:54
閱讀 1425·2021-11-22 09:34
閱讀 2698·2021-11-22 09:34
閱讀 4007·2021-10-13 09:39
閱讀 3341·2019-08-26 11:52
閱讀 3360·2019-08-26 11:50
閱讀 1529·2019-08-26 10:56
閱讀 1913·2019-08-26 10:44