行動中的棧
因為引數和區域性變數基本上屬於乙個功能,我們只需要考慮我們呼叫乙個函式時,堆疊發生了什麼。下面的步驟序列發生在呼叫函式時:
超越函式呼叫指令的位址推送到堆疊。這是怎樣的cpu記住去後,函式返回。
房間是在函式的返回型別的堆疊。這只是乙個佔位符,現在。
該cpu跳轉到該函式的**。
的棧頂指標是在乙個特殊的舉行,稱為堆疊幀。一切都新增到堆疊之後這一點被認為是「本地」的功能。
所有的函式引數都放在棧。
這個函式的內部指令開始執行。
區域性變數推到堆疊上為它們定義。
當函式結束,以下步驟發生:
函式的返回值複製到佔位符,被用於此目的的堆疊。
後彈出堆疊幀指標是一切。這破壞了所有的區域性變數和引數。
返回值是彈出堆疊和分配作為函式值。如果該函式的值未分配到任何東西,沒有分配發生,而失去價值。
要執行的下一條指令的位址是從堆疊中彈出,並繼續執行,cpu的指令。
通常情況下,它是不知道如何呼叫堆疊的作品的重要的細節。然而,理解功能有效地在堆疊上時,他們被稱為彈出當他們返回給你需要理解遞迴的基本原理,以及一些其他的概念是有用的除錯時。
堆疊溢位
堆疊的大小有限制,因此只能容納有限的資訊。如果程式試圖把太多的資訊會導致堆疊,堆疊溢位。堆疊溢位發生在堆疊中的所有記憶體被分配-在這種情況下,進一步分配開始氾濫到儲存器的其它部分。
堆疊溢位通常是分配太多變數在堆疊上的結果,和/或使太多的巢狀的函式呼叫(在函式呼叫函式呼叫函式呼叫函式d b c等)的堆疊溢位通常會導致程式崩潰。
下面是乙個示例程式,導致堆疊溢位。你可以在你的系統崩潰,看它:
123
45int main()
行動的力量
做一件事情,只要開始行動,就算獲得了一半的成功。演講大師齊格勒提醒我們,世界上牽引力最大的火車頭停在鐵軌上,為了防滑,只需在它8個驅動輪前面塞一塊一英吋見方的木塊,這個龐然大物就無法動彈。然而,一旦這只巨型火車頭開始啟動,這小小的木塊就再也擋不住它了 當它的時速達到100英里時,一堵5英呎厚的鋼筋混...
行動的意義
一天有24小時,是不是感覺過的很快,或者過得很慢?當我們埋頭於工作時,沉浸在認真工作的幻覺中,把工作忙當做藉口?當我們不滿足於現狀時,不停的在抱怨,卻不思改變?時間正悄悄地從我們身邊流逝,我們卻不知所措,晚上睡覺前忘記反省自己,一天做了什麼?看似很充實的我們,卻真的沒有沉澱下來什麼。記得讀過一本書叫...
棧在程式中的應用 棧溢位
我的理解 在程式執行過程中,當要呼叫某個子函式時 將子函式的相關引數壓入棧中 將call指令的下一條指令的位址作為返回位址壓入棧中 將當前ebp入棧 使ebp指向esp所指的位置 重新定位棧底 將esp指向的位址 h 在棧上分配 位元組的空間 可選 將某些暫存器中的值入棧 可選 將某些暫存器中的值出...