堆疊:「先進後出」的儲存區,存在於堆疊段中,sp在任何時候都指向棧頂。
1、格式:push 源運算元(字)
push ax ;ax進棧
2、功能
(1)首先將棧頂指標減2,即(sp)-2=>sp;
(2)然後將源運算元(字)=>((sp)+1,(sp))。(高位元組,低位元組)
即執行操作:
3、說明
高位元組先進棧,低位元組在棧頂
1、格式:pop 目的運算元
pop ax ;恢復ax
2、功能
(1)首先將棧頂的字((sp)+1,(sp))=>目的運算元;
(2)然後將堆疊指標sp加2,即(sp)+2=>sp。
即執行操作:
1、棧頂sp指向資料
因為堆疊指標sp總是指向已經存入資料的棧頂(不是空單元),所以push指令時先將(sp)減2,後將內容壓棧(即先修改sp使之指向空單元,後壓入數),而pop是先從棧頂彈出乙個字,後將堆疊指標sp加2.
2、對**段暫存器
push cs是合法的,但pop cs是不合法的。
3、堆疊特點—–filo
因為sp總是指向棧頂,而用push和pop指令訪問數時都是在棧頂進行的,所以堆疊是「先進後出」或叫「後進先出」的。棧底在高位址,堆疊是從高位址向低位址延伸的,所以棧底就是最初的棧頂。
4、按字訪問
用push指令和pop指令時只能按字訪問堆疊,不能按位元組訪問堆疊。
5、不影響標誌
push和pop都不影響標誌。
6、不能用立即定址方式
push 1234h ;錯誤!!
小例子:
這裡就是對ax清零。
push ds
sub ax,ax
push ax
......
ret
下面就是乙個保護現場的**
push ax
push bx
push cx
......;期間用到了ax、bx、cx
pop cx
pop bx
pop ax
從鍵盤上鍵入10個字元,然後與鍵入字元的先後相反的順序顯示出來。(使用堆疊的辦法)
分析:因為堆疊是「後進先出」的,因此,利用堆疊作為輸出緩衝區極易實現按逆序輸出。
分配乙個256個字的堆疊緩衝區,在其低位元組中存放從鍵盤上鍵入的字元。我們將從鍵盤上接受來的10個字元依次進棧,存放在這片堆疊區里,然後再從最後乙個字單元開始,彈出堆疊,即可逆序把它們顯示出來。
stacks segment para stack 'stack'
dw 256 dup(?) ;堆疊只能是乙個字乙個字的操作,多預留點棧空間
stacks ends
codes segment
assume cs:codes,ss:stacks
start:
mov ax,stacks ;這裡就用stacks,以前都是datas
mov ss,ax ;這裡就用ss了,以前都是用ds
mov cx,10 ;輸入10個字元=>堆疊
read:
mov ah,01h
int21h push ax ;堆疊操作都是『字』,不能用al,浪費了ah的空間
loop read ;讀10個字元
mov dl,0ah ;顯示回車
mov ah,02h
int21h mov dl,0dh ;顯示換行
int21h mov cx,10 ;從棧頂依次彈出10個字元輸出
disp:
pop dx ;顯示
mov ah,02h
int21h loop disp ;顯示10個字元
mov ah,4ch
int21hcodes ends
end start
(1)堆疊指標sp的自動賦值只要在堆疊段的segment偽指令中帶有組合型別引數和組名引數:stack 『stack』,匯程式設計序就會自動把棧底(也是最初的棧頂)的位移量賦給堆疊指標sp。
(2)空間有浪費
因堆疊只對字操作,故10個字元的高位元組雖然入了棧,但未用,浪費了一半空間。
(3)堆疊大小留有餘地
雖然只輸入10個字元,但堆疊定義了256個字(100h)。一般定義時適當留有餘地。
組合語言(七) 堆疊
堆疊資料結構 stack data structure 的原理與盤子堆疊相同 新值新增到棧頂,刪除值也在棧頂移除。堆疊也被稱為 lifo 結構 後進先出,last in first out 其原因是,最後進入堆疊的值也是第乙個出堆疊的值。資料結構就有講 執行時堆疊是記憶體陣列,cpu 用 esp 擴...
javascript底層學習筆記(1) 堆疊和佇列
一,棧 stack 特點 棧是一種lifo last in first out,後進先出 的資料結構,也就是最新新增的項最早被移除 比如說,我們在乙個箱子中放了很多本書,如果你要拿出第二書,那麼你要先把第一本書拿出來,才能拿第二本書出來 拿出第二本書之後,再把第一本書放進去 函式呼叫形成乙個棧幀 f...
彙編學習筆記九
原理 可以修改cs或ip jmp指令 loop指令 和cx有關 操作符 offset 這個指令使用之前需要在乙個指令前面定義乙個標號,使用offset獲取指令的偏移位址 jmp指令跳轉指令,jmp的後面可以跟乙個標號,表示跳轉到的位置 assume cs code code segment mov ...