彙編基礎一日一學習6

大家好,今天我們來講解一下棧的延伸,“堆棧”。算是把昨天的整個理論基礎概念,給大家講解下。

   運行時棧(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.舉出一個例子來描述堆棧“後進先出,向下擴展”的特性,說明自己的觀點。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章