棧
- 棧:是一種具有特殊的訪問方式的存儲(chǔ)空間(后進(jìn)先出, Last In Out Firt,LIFO)

- 8086會(huì)將CS作為代碼段的段地址,將CS:IP指向的指令作為下一條需要取出執(zhí)行的指令
- 8086會(huì)將DS作為數(shù)據(jù)段的段地址,mov ax,[address]就是取出DS:address的內(nèi)存數(shù)據(jù)放到ax寄存器中
- 8086會(huì)將SS作為棧段的段地址,任意時(shí)刻,SS:SP指向棧頂元素
- 8086提供了PUSH(入棧)和POP(出棧)指令來操作棧段的數(shù)據(jù)
- 比如push ax是將ax的數(shù)據(jù)入棧,pop ax是將棧頂?shù)臄?shù)據(jù)送入ax
push ax

push ax 的執(zhí)行由以下兩個(gè)步驟完成
- SP = SP - 2,SS:SP 指向當(dāng)前棧頂前面的單元,以當(dāng)前棧頂前面的單元為新的棧頂;
- 將ax中的內(nèi)容送入 SS:SP 指向的內(nèi)存單元處,SS:SP此時(shí)指向新棧頂


pop ax
pop ax的執(zhí)行過程和push ax剛好相反,由以下兩步完成
- 將SS:SP指向的內(nèi)存單元處的數(shù)據(jù)送入ax中;
- SP=SP+2,SS:SP 指向當(dāng)前棧頂下面的單元,以當(dāng)前棧頂下面的單元為新的棧頂

思考
如果將10000H 到 1000FH 這段空間當(dāng)做棧,初始狀態(tài)棧是空的,此時(shí),SS=1000H,SP=?思考后看分析

- ???SS:SP執(zhí)行棧控件最高地址單元的下一個(gè)單元

棧頂超界
push

pop


書上圖1.png

書上圖2.png
push&pop匯編

注意:在8086中,push、pop操作的數(shù)據(jù)都是2個(gè)字節(jié)的
練習(xí)
編程:
(1)將10000H到1000FH 這段空間當(dāng)做棧,初始狀態(tài)棧是空的;
(2)設(shè)置AX=001AH,BX=001BH;
(3)利用棧,交換AX和BX中的數(shù)據(jù).
mov ax,1000H
mov ss,ax
mov sp,0010H
mov ax,001AH
mov bx,001BH
push ax
push bx
pop ax
pop bx
棧段
- 對(duì)于8086來說,在編程時(shí),可以根據(jù)需要,將一組內(nèi)存單元定義為一個(gè)段
- 我們可以將一組長(zhǎng)度為N(N<=64KB)、地址連續(xù)、起始地址為16倍數(shù)的內(nèi)存單元,當(dāng)做棧空間來使用,稱為棧段。比如用10010H1001FH這段內(nèi)存空間當(dāng)做棧來使用,我們就可以認(rèn)為10010H1001FH是一個(gè)棧段,它的段地址為1001H,長(zhǎng)度為16字節(jié)
- 如何使用push、pop等棧操作指令訪問我們定義的棧段?
- 用SS存放棧段的段地址,用SP存放棧頂?shù)钠频刂?/li>
段總結(jié)


練習(xí)

練習(xí)1.png

答案1.png

練習(xí)2.png

答案2.png