1、子程式呼叫,為了保護現場,把所要用的暫存器中的內容先暫時儲存起來,在子程式呼叫結束之前,按照先進後出的原則,把資料恢復。
2、有時候,需要臨時用一下某些暫存器,也可用一下,憑個人喜好;
這兩個指令必須成對使用(特殊用途除外),你只要壓入了那些東西,並且知道他們的順序就行了,所操作的是字元還是資料,就不用知道了。
堆疊操作指令
堆疊是乙個先進後出的主存區域,位於堆疊段中,使用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指令都不影響標誌。
pushpop指令的運算元必須是字運算元 指令格式
指令字長 整個指令的長度,與機器字長沒有固定關係。通常把指令字長 機器字長的指令稱為單字長指令,同理還有半字長指令和雙字長指令。在乙個指令系統 指令集 arm,x86 中,若所有指令的長度都相等,則稱為定長指令字結構。定長指令的執行速度快,控制簡單。同樣與之對應的有變長指令字結構。由於主存一般是按位...
ARM堆疊及特殊指令
arm7支援四種堆疊模式 滿遞減 fd 滿遞增 fa 空遞減 ed 空遞增 ea fd 堆疊位址從上往下遞減,且指標指向最後乙個入棧元素。fa 堆疊位址從下往上遞增,且指標指向最後乙個入棧元素。ed 堆疊位址從上往下遞減,且指標指向下乙個可用空位。ea 堆疊位址從下網上遞增,且指標指向下乙個可用空位...
ARM堆疊及特殊指令
arm7支援四種堆疊模式 滿遞減 fd 滿遞增 fa 空遞減 ed 空遞增 ea fd 堆疊位址從上往下遞減,且指標指向最後乙個入棧元素。fa 堆疊位址從下往上遞增,且指標指向最後乙個入棧元素。ed 堆疊位址從上往下遞減,且指標指向下乙個可用空位。ea 堆疊位址從下網上遞增,且指標指向下乙個可用空位...