執行時棧(runtimestack)--我們通常稱為「堆疊」,這是由我們cpu硬體直接支援的,也是實現過程的呼叫和過程返回機制的基本組成部分。
不知道大家是否知道rtl是什麼意思。如果學過程式的人都應該知道這個就是執行時庫,它是我們程式執行時必須的庫。例如我們bcb中的vclrtl。我們的bcb程式必須依賴vcl的執行時庫。
堆疊是由我們cpu直接管理的記憶體區域(也可以形容其陣列,因為它的確有相似陣列的特性)。其實大家昨天已經感受到了堆疊的特性。就是「後進先出,向下擴充套件」的特性。
堆疊的用途:
1.暫存器在用做多種用途的時候,堆疊可以方便的作為臨時儲存區域。在暫存器使用完畢後,可恢復其原始值。
2.呼叫子程式的時候放過程返回的位址。
3.子程式的區域性變數在堆疊中建立,結束時,變數丟棄
4.呼叫子程式的時候,可以通過堆疊傳輸輸入值。
昨天已經講解了push pop指令。
push壓棧
相應的esp暫存器-4,如果是實模式-2
pop
出棧 相應的esp暫存器+4,如果是實模式+2
從以上我們就可以認識到堆疊的向下擴充套件的特性。因為壓入堆疊,相應的esp減少,那麼表示我們的堆疊往下擴充套件。
今天還要介紹兩個與堆疊相關的彙編指令。pushad popad pusha popa
pushad是將我們所有的32位通用暫存器壓入堆疊,popad則是將我們所有的32位通用暫存器按壓入時候相反的順序取出堆疊。一般用於子程式儲存但前的環境,例如我們的子程式需要修改一些暫存器的值,我們就可以用這個先儲存,等子程式結束後,將其所有的備份的暫存器值在恢復,這樣就不會破壞其他子程式執行的情況。
這兩個指令,在免殺方面比較常用。相信看過免殺課程動態恢復資料段ascii字串的朋友都應該知道。
pusha是將我們所有的16位通用暫存器壓入堆疊,popa同理是將我們所有的16通用暫存器取出堆疊。
由於今天主要是為了把上節課程做乙個補充的,所有的內容就這麼多。堆疊到這裡我們基本就講解完了。其實我們只要理解了它的特性即可。。
小作業:
1.push指令是否能使用立即數。
2. pushad , popad、pusha popa都是將哪些暫存器壓入堆疊。分別列舉。
3.舉出乙個例子來描述堆疊「後進先出,向下擴充套件」的特性,說明自己的觀點。。
彙編基礎一日一學習1
暫存器是什麼?大致說暫存器是cpu的部件 一般用於資訊儲存 也可以說暫存器是我們可以進行指令讀寫的部件。我們目前80386的cpu的每個暫存器是4個位元組的。也就是32位。也可以說80386cpu有32條位址線 8個通用暫存器eax ebx ecx edx esp ebp esi edi 也就是我們...
彙編基礎一日一學習3
今天我們來學習下eip暫存器。不要小看這個暫存器。它可儲存著我們cpu要讀取指令的位址,沒有了它,cpu就無法讀取下面的指令 通俗點講cpu就無法執行 如果玩過破解,跟蹤過程式的人都應該知道。每次相應彙編指令執行完相應的eip值就會增加。我大致描述一下這個暫存器的情況。因為80386cpu的定址範圍...
彙編基礎一日一學習5
那麼棧到底是什麼呢?棧是一種具有特殊的訪問方式的儲存空間。它的特殊就是在於最後進入這個空間的資料,最先出去。舉個例子,假如這時我們有3個動物。貓咪 猴子 兔子。那麼我們按先後的順序我們先把貓咪放進棧中,然後再把猴子放到棧中,最後把兔子放到棧中。那麼此時,大家可以看到。兔子現在存在棧頂。那麼此時我們取...