【彙編】堆疊和畫堆疊圖
阿新 • • 發佈:2019-01-03
根據咱們學彙編的經驗呀,彙編用的最多的是暫存器和記憶體之間的不斷相互傳值傳地址,井然有序。
然而,你知道它們具體是怎麼進行資料傳遞和交換的嗎?
我們知道暫存器能夠儲存的資料量不多,所以需要儲存大量資料的時候就需要儲存到記憶體裡面了
那麼:如果我存了一大堆資料,但是我想知道究竟存了多少資料,要怎麼辦呢?
如果我想在這對資料裡面抽出某一個數據出來使用,要怎麼抽呢?
用完這些資料是繼續儲存還是丟棄來呢?丟到哪裡去呢?
針對以上種種問題,這裡有個完美的解決方案—〉堆疊
NO.1 首先我們來了解下什麼是堆疊
根據百度百科的記載,堆疊的定義如下
顧名思義,就是在呼叫程式 的時候,電腦會自動開闢一塊記憶體空間專門用來放資料的,然後我們的資料就會想貨物一樣一個一個往上堆,需要用到的時候就拿出來使用,當程式執行完之後再騰出空間給其他程式繼續使用,這個就是堆疊。
這裡兩個概念需要了解下,一個是棧頂,一個是棧底。
棧頂:顧名思義,就是棧道的頂部啦~
棧底:顧名思義,就是棧道的底部啦~
然後呢,通常我們規定使用暫存器裡面的EBP暫存器 儲存一個地址,作為堆疊的棧底,ESP暫存器儲存一個地址,作為堆疊的棧頂,用EAX暫存器來儲存需要輸出的資料。
舉個例子,可以看到,有個暫存器EBP和ESP所儲存的地址如下↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓所以它們在堆疊中是這樣的↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓現在要實現以下功能↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
以上的指令含義分別為:1.將立即數“2”壓進棧道里,並且棧頂提升4個位元組
2.將立即數“1”壓進棧道里,並且棧頂提升4個位元組
3.進入名為“kong”的函式,把地址“0040100F”儲存到EIP暫存器 裡,並且把00401070(0040106c+0x4)壓進棧道,並且棧頂提升4個 位元組
4.從函式中出來以後,棧頂esp+8(恢復棧頂)
↓↓↓↓↓↓↓↓↓↓進入名為“kong”的函式後,需要執行以下的指令↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓所以,“準備工作”堆疊圖如下↓↓↓↓↓↓↓↓↓↓
↓↓↓↓↓↓↓↓↓↓然後,執行完程式之後,堆疊的收尾工作如下↓↓↓↓↓↓↓↓↓↓