彙編基礎一日一學習5

2021-06-23 01:36:34 字數 2265 閱讀 5326

那麼棧到底是什麼呢?棧是一種具有特殊的訪問方式的儲存空間。它的特殊就是在於最後進入這個空間的資料,最先出去。

舉個例子,假如這時我們有3個動物。貓咪、猴子、兔子。那麼我們按先後的順序我們先把貓咪放進棧中,然後再把猴子放到棧中,最後把兔子放到棧中。那麼此時,大家可以看到。兔子現在存在棧頂。那麼此時我們取出的就是兔子了。而最先放進去的時貓咪,它則最後取出。這就是棧的「後進先出」的特性。自己如果不理解,在家裡拿個茶缸,然後找幾個物品,按先後順序把物品放進去,然後在取出來。自己來理解下「後進先出」這個特性。

我們目前的cpu都有棧的設計。例如80386cpu等。。。。這些cpu也提供了相應的指令來以棧的方式訪問記憶體空間。這也表示我們編譯的程式被對映到記憶體以後有一段棧空間供我們訪問。

問題來了?我們怎麼才能知道我們棧空間在那裡呢。

呵呵還記得之前講解的eip暫存器嗎。 我們peloader將我們的程式對映到記憶體空間以後,將程式的入口點賦值給我們的eip暫存器。這樣cpu讀取eip暫存器的值就可以將我們入口點的彙編指令讀取並執行了。。那麼從這裡就可以下結論,我們棧區的記憶體位址,肯定也有相應的暫存器儲存。

沒錯,這個暫存器就是esp暫存器。程式第一次被pe loader對映到記憶體,那麼peloader會把棧區的記憶體偏移位址賦值給esp暫存器。

這裡我們棧區的位址也知道如何訪問了。。那麼像棧這麼有個性的記憶體空間,肯定也有個性的指令來訪問並訪問資料吧。沒錯,棧提供了兩個「存」「取」的指令,「push」 和「pop」。

這兩個指令乙個「存」乙個是「取」。也可以說乙個是「入」乙個是「進」。 

這裡我用「存」和「取」來表示,大家會更好的理解些。。比如push eax 就是將eax暫存器的值存入棧中。。

pop eax 就是將eax取出堆疊。

但是這裡注意了。剛剛我已經說了,esp暫存器是存放棧區的記憶體位址的。但是如果一旦我們通過push將一段資料存入堆疊,那麼如果esp不會自動增加或減少大小。那麼它就over了。下次存入的時候就會將之前的資料給覆蓋。還好,聰明的intel公司,已經想到了這一點。

但是不要慌張,我們存入資料我們的esp暫存器應該相應的增加對吧?

但是我們程式被對映到記憶體以後,相應的是高位址的資料存入高位址,低位址的資料存入低位址。不明白嗎?去看看上節課。或者拿c32asm開啟乙個檔案。檔案最底部的資料對映到記憶體以後也是在位址最高處的。

所以壓入堆疊,我們的資料增加,相應的偏移卻是減少。

每次我們通過push存入資料它esp暫存器的值就會相應的禁燒我們存入資料的位元組大小。舉個例子

例如此時 eax =00402500h 

esp暫存器=00200000h

執行 pusheax的時候esp也相應的減少 

此時 esp = (00200000 –4)h 

此時我們如果想取資料的話。

pop eax 就可以將esp暫存器中的偏移位址的資料取出並存放到 eax暫存器中。

資料取出來了,相應的資料減小。但是我們的偏移卻增加了。因為我們每次訪問棧都要通過esp暫存器才能知道棧的位置,所以我們這裡可以把esp歸結為esp永遠是指向棧頂的。

資料取出來,此時我們棧沒了資料相應的位址也向下降了相應資料位元組的大小。但是我們的記憶體是越深處位址越高。所以此時我們的位址是增加了。

所以popeax暫存器執行後 

esp =(00200000 -4 +4)

不知道大家是否明白了?如果不懂的話多讀幾次。

因為今天這節課程比較多,如果全部講的話怕大家接受不了。 接下來我給大家寫乙個例項。

來詳細的講解下。

如果我們將0040000h – 00400020h , 初始狀態棧是空的,那麼此時esp指向的位址是多少?

切記:記得一定要把上節課的內容也要嵌入進來。。怕大家不能理解。esp永遠指向我們棧頂元素。棧而且它最初指向的就是棧頂,也就是我們棧空間的最頂部。記住記憶體越深,位址也就越高。哈哈

正確答案:esp = 00400021h 。

所以esp指向的位址,必須夠我們寫入4個位元組的資料(因為80386的資料線一次只能傳送4個位元組的資料)。並且寫入後不能發生越界行為。

怕大家不能消化,今天就講這麼多吧。。。。。接下來來用幾個小作業。來鞏固下知識。

小作業:

(1) 

假如此時eax= 00402500h , esp = 00400000h。那麼執行push eax 後, esp暫存器等於多少???

(2) 

假如此時eax= 000001h , esp 00003020h。執行pop eax指令後, esp暫存器等於多少??

(3) 

假如此時我們將00300000h – 0030001ah作為棧空間,初始狀態棧是空的。此時esp等於多少???

彙編基礎一日一學習1

暫存器是什麼?大致說暫存器是cpu的部件 一般用於資訊儲存 也可以說暫存器是我們可以進行指令讀寫的部件。我們目前80386的cpu的每個暫存器是4個位元組的。也就是32位。也可以說80386cpu有32條位址線 8個通用暫存器eax ebx ecx edx esp ebp esi edi 也就是我們...

彙編基礎一日一學習3

今天我們來學習下eip暫存器。不要小看這個暫存器。它可儲存著我們cpu要讀取指令的位址,沒有了它,cpu就無法讀取下面的指令 通俗點講cpu就無法執行 如果玩過破解,跟蹤過程式的人都應該知道。每次相應彙編指令執行完相應的eip值就會增加。我大致描述一下這個暫存器的情況。因為80386cpu的定址範圍...

彙編基礎一日一學習6

執行時棧 runtimestack 我們通常稱為 堆疊 這是由我們cpu硬體直接支援的,也是實現過程的呼叫和過程返回機制的基本組成部分。不知道大家是否知道rtl是什麼意思。如果學過程式的人都應該知道這個就是執行時庫,它是我們程式執行時必須的庫。例如我們bcb中的vclrtl。我們的bcb程式必須依賴...