棧
-
棧:是一種具有特殊的訪問(wèn)方式的存儲(chǔ)空間(先進(jìn)后出 first in last out)
- 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(出棧)指令來(lái)操作棧段的數(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 as的執(zhí)行過(guò)程和push as剛好相反衣迷,由以下倆部完成
- 將SS:SP指向的內(nèi)存單元處的數(shù)據(jù)送入ax中
-
SP = SP + 2,SP:SP指向當(dāng)前棧頂下面的單元酱酬,以當(dāng)前棧頂下面的單元為新的棧頂
思考
如果將10000H 到 1000FH 這段空間當(dāng)做棧,初始狀態(tài)棧是空的,此時(shí),SS=1000H,SP=?思考后看分析
-
空棧壶谒,SS:SP執(zhí)行棧控件最高地址單元的下一個(gè)單元
結(jié)果
棧頂超界
push
pop
書(shū)上圖一
書(shū)上圖二
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來(lái)說(shuō)汗菜,在編程時(shí),可以根據(jù)需要挑社,將一組內(nèi)存單元定義為一個(gè)段
- 我們可以將一組長(zhǎng)度為N(N<=64KB)陨界、地址連續(xù)、起始地址為16的倍數(shù)的內(nèi)存單元痛阻,當(dāng)做椌瘢空間來(lái)使用,成為棧段紊婉。比如10010H1001FH這段內(nèi)存空間當(dāng)做棧來(lái)使用零蓉,我們就可以認(rèn)為10010H10001FH是一個(gè)棧段,他的段地址為1001H鬼悠,長(zhǎng)度為16字節(jié)
- 如何使用push录淡、pop等棧操作指令訪問(wèn)我們定義的棧段
- 用SS存放棧段的段地址捌木,用SP存放棧頂?shù)钠频刂?/li>
段總結(jié)
練習(xí)
練習(xí)題1
答案
練習(xí)題2
答案