堆棧段

1  介紹

堆棧段(stacksegment)通常是指採用堆棧方式工作的一段內存區域。當程序被執行時,程序可能會將其執行的狀態加入棧的頂部;當程序結束時,它必須把棧頂的狀態數據彈出(pop)。

 

2  存儲形式

      ebp是棧底寄存器

       esp是棧頂寄存器

       每4字節的棧空間保存一個數據,當esp小於ebp時,就形成了棧幀

 

3  使用指令

       push:壓棧操作,把數據寫入到esp執行的堆棧上,然後esp減4

       pop:出棧操作,從esp執行的地址上獲取一個數據,然後esp加4

       讀取堆棧內容:有兩種尋址方式,ebp尋址(以ebp爲基準的變量地址表示方式)和esp尋址(以esp爲基準的變量地址表示方式)

4  用途

在採用段式內存管理方式進行程序內存分配的架構中,堆棧段用來存放局部變量和函數返回地址。

理論上,最小的棧可能是一個僅能保存函數調用(function call) 地址的結構,以致被調用的函數能根據該地址返回(return)到原函數裏。除此功能以外,開發者也可以將棧另作他用。

 

5  使用方式

堆棧段是在程序運行時動態分配使用,只需要通過棧頂指針即可訪問。目前大多數CPU中都有專用寄存器可以被用來存放棧頂地址。  

     5.1  生成棧幀

              pushebp            ;保存前面函數的棧底到當前的棧上

              movebp, esp     ;以前面函數的棧頂作爲當前函數的棧底

                                          ;也作爲保存前一個函數的棧頂到ebp寄存器

              subesp , [xx]h   ;設置新的棧頂,分配一定大小的棧空間

 

     5.2  關閉棧幀

              addesp , [xx]h   ;恢復棧頂,釋放棧空間

              movesp , ebp    ;恢復上一個函數的棧頂

              popebp                     ;恢復上一個函數的棧底

 

     5.3  寄存器環境保存和恢復

              pushebx

              pushesi

              pushedi

              ......

              popedi

              popesi

              popebx

6  特點

基於棧的內存分配法的特點就是,當程序結束時,棧所用的內存能夠自動快速地被回收,開發者不用幹預,省心省力。如果棧頂的數據需要以某種格式被保存起來,那麼在程序結束前,此數據必須被複制到其他位置,不然就會被彈出棧而丟失。因此,基於棧的內存分配法適用於那些只需暫時數據的保存情況。

x86處理器系列對線程棧的管理有特殊的指令。其他處理器系列(包括PowerPC 和 MIP)則沒有這種支持。

操作系統給線程分配的棧可能僅爲幾個KB的大小。如果分配的棧內存過大,超過了線程實際需要,這可能導致棧溢出(stack overflow),以致系統崩潰。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章