彙編 學習筆記(九) 堆疊

2021-08-01 15:38:22 字數 2582 閱讀 6351

堆疊:「先進後出」的儲存區,存在於堆疊段中,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 ...