1. 程式人生 > >【彙編】堆疊和畫堆疊圖

【彙編】堆疊和畫堆疊圖

        根據咱們學彙編的經驗呀,彙編用的最多的是暫存器和記憶體之間的不斷相互傳值傳地址,井然有序。

       然而,你知道它們具體是怎麼進行資料傳遞和交換的嗎?

                                                           

       我們知道暫存器能夠儲存的資料量不多,所以需要儲存大量資料的時候就需要儲存到記憶體裡面了

       那麼:如果我存了一大堆資料,但是我想知道究竟存了多少資料,要怎麼辦呢?

                  如果我想在這對資料裡面抽出某一個數據出來使用,要怎麼抽呢?

                  用完這些資料是繼續儲存還是丟棄來呢?丟到哪裡去呢?

                                    

                          針對以上種種問題,這裡有個完美的解決方案—〉堆疊 

                                               

                                         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”的函式後,需要執行以下的指令↓↓↓↓↓↓↓↓↓↓

                           ↓↓↓↓↓↓↓↓↓↓所以,“準備工作”堆疊圖如下↓↓↓↓↓↓↓↓↓↓            

                                  ↓↓↓↓↓↓↓↓↓↓然後,執行完程式之後,堆疊的收尾工作如下↓↓↓↓↓↓↓↓↓↓