iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0

今天來談記憶體架構,在我們的程式碼裡可以看到它們被分成了 .data 、.text 、 .bss 等區塊,這件是在記憶中也會做相似的事情,例如這篇文章所述,
https://ithelp.ithome.com.tw/upload/images/20220920/20151538sAyvNuOIIX.png
此圖擷取自該篇文章,從此圖可以看到記憶體被分成如此多的分塊,各個分塊會分別存放不同的東西,例如底下三個分塊就是我們這幾天一直提到的東西,中間的 heap (堆) 與 stack (棧) 這兩個不是資料結構中的 heap 與 stack ,記憶體的 heap 跟 stack 是會真實存資料於記憶體中的,但資料結構的 heap 跟 stack 是抽象的,是我們處裡資料的方式。這裡可以注意 heap 跟 stack 的延展方向是相反的, heap 低位址往高位址延展, stack 是從高位址往低位址延展,且 stack 會有一個 frame 的機制,例如遞迴一個函式時,在呼叫函式時會建立一個 frame 給這條函式,在呼叫第二次時會再開一個 frame 給第二次呼叫的函式,以此機制使函式間不會讀取或修改到互相的資料。

再這部分我們可以回去看我們的 HelloWorld .text 的開頭與結尾

push	ebp
mov	    ebp,esp


pop	    ebp

ebp 是基址指標暫存器,會指著最先 push 進 stack 的資料的位置,而 esp 是棧指標暫存器,會指著最後 push 進 stack 的位置,esp 會隨著資料一直 push 進 stack 而一直往低位址延展。在這裡我們先 push ebp 將上一個 frame 的開頭放進去,再來 mov ebp,esp 便是將前一個 frame 的最後位置作為現在的 frame 的初始位置;在最後再 pop ebp ,因為資料在調用完後應該會將 esp 移回該 frame 的開頭,所以通常執行到這時會只剩下最一開始 push 的 ebp 的位置,因此指要將這個位址 pop 回去給 ebp 便完成,這項動作即稱為平棧。

https://ithelp.ithome.com.tw/upload/images/20220920/20151538meupq12WTx.png
這是調用函式前

https://ithelp.ithome.com.tw/upload/images/20220920/20151538YA6WxssZgj.png
執行 push ebp,將 ebp 的位置放進 stack

https://ithelp.ithome.com.tw/upload/images/20220920/20151538kPmWPar9gi.png
執行 mov ebp,esp,執行完這條指令後我們就已經在第二個 frame 的範圍裡了。

https://ithelp.ithome.com.tw/upload/images/20220920/20151538q1A5lkOzRw.png
執行 pop ebp ,將之前放進去的位置還給 ebp。

這邊可能會有點難懂且非常繞口,需要一點時間去理解,若真的一樣還是不懂可以去搜尋一下平棧,又或是可以與我討論。


上一篇
Day3 語法&指令
下一篇
Day5 暫存器
系列文
絕對花心的30天組合語言13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言