堆棧是存儲器中專用的緩衝區,用於暫存寄存器數據或地址指針,push/pop就用於堆棧的操做,這兩個指令通常用在:
一、子程序調用,爲了保護現場,把所要用的寄存器中的內容先暫時保存起來,在子程序調用結束以前,按照先進後出的原則,把數據恢復。
二、有時候,須要臨時用一下某些寄存器,也可用一下,憑我的喜愛;
這兩個指令必須成對使用(特殊用途除外),你只要壓入了那些東西,而且知道他們的順序就好了,所操做的是字符仍是數據,就不用知道了。
堆棧操做指令
堆棧是一個先進後出的主存區域,位於堆棧段中,使用SS段寄存器記錄器段地址。棧只有一個出口,即當前棧頂。棧頂是地址較小的一端(低端),它用堆棧指針寄存器SP指定。堆棧的兩種基本操做,對應兩條基本指令:
(1)、進棧指令push
push reg/mem/seg;sp<-sp-2,ss<-reg/mem/seg
進棧指令先使堆棧指令sp減2,而後把一個字操做數存入堆棧頂部。堆棧操做的對象只能是字操做數,進棧時底字節存放於低地址,高字節存放於高地址,sp相應向低地址移動兩個字節單元。
push AX
PUSH [2000H]
PUSH CS
(2)、出棧指令pop
pop reg/seg/mem;reg/seg/mem<-ss:[sp],sp<-sp+2
出棧指令把棧頂的一個字傳送至指定的目的操做數,而後堆棧指針sp加2。目的操做數應爲字操做數,字從棧頂彈出時,低地址字節送低字節,高地址字節送高字節。
pop AX
POP [2000H]
POP SS堆棧能夠用來臨時存放數據,以便隨時恢復它們。也經常使用於子程序見傳遞參數。
注意幾點:
(1)、由於堆棧指針sp老是指向已經存入數據的棧頂(不是空單元),因此PUSH指令是將(SP)減2,後將內容壓棧(即先修改SP是指指向空單元,後壓入數據),而POP是先從棧頂彈出一個字,後將堆棧指針SP加2.
(2)、PUSH CS是合法的,可是POP CS是不合法的。
(3)、由於SP老是指向棧頂,而用PUSH和POP指令存取數時都是在棧頂進行的,因此堆棧是先進後出或叫後進先出的。棧底在高地址,堆棧是從高地址向低地址延伸的,全部棧底就是最初的棧頂。
(4)、用PUSH指令和POP指令時只能按字訪問堆棧,不能按字節訪問堆棧。
(5)、PUSH和POP指令都不影響標誌。