博主 沒落的殘陽
這節來講解一下棧的延伸,「堆疊」。算是把昨天的整個理論基礎概念,給大家講解下。
執行時棧(runtime stack)--我們通常稱為「堆疊」,這是由我們cpu硬體直接支援的,也是實現過程的呼叫和過程返回機制的基本組成部分。
不知道大家是否知道rtl是什麼意思。如果學過程式的人都應該知道這個就是執行時庫,它是我們程式執行時必須的庫。例如我們bcb中的vcl rtl。我們的bcb程式必須依賴vcl的執行時庫。
堆疊是由我們cpu直接管理的記憶體區域(也可以形容其陣列,因為它的確有相似陣列的特性)。其實大家昨天已經感受到了堆疊的特性。就是「後進先出,向下擴充套件」的特性。
堆疊的用途:
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通用暫存器取出堆疊。
由於今天主要是為了把上節課程做乙個補充的,所有的內容就這麼多。堆疊到這裡我們基本就講解完了。其實我們只要理解了它的特性即可。。
彙編 基礎試驗7
assume cs code,ss stack,ds data data segment 原始資料存放的地方 db 1975 1976 1977 1978 1979 1980 1981 1982 db 1983 1984 1985 1986 1987 1988 1989 1990 db 1991 1...
彙編學習 NO7
1.flag暫存器 用來儲存相關指令的某些執行結果 用來為cpu執行相關指令提供行為依據 用來控制cpu的相關工作 2.8086cpu的標誌暫存器flag有16位,其中儲存資訊通常被稱作為程式狀態字 psw flag與其他暫存器不同,其他暫存器都是用來存放資料的,都是整個暫存器具有乙個含義,而fla...
彙編基礎學習5
文章 http www.mcany.cn article 280.htm 博主 沒落的殘陽 今天我給大家來講解下我們記憶體中資料的儲存以及訪問。這節課的基礎也是非常重要的。因為80386的資料位址線是32根,所以它一次可以傳送資料是4個位元組。所以我們記憶體單元是按照4個位元組來對齊的。用高階語言的...