1. 棧有2個基本操作:入棧、出棧
2. 棧頂的元素總是最后入棧,最先出棧;后進先出。
3. 8086CPU提供入棧和出棧的指令,最基本的兩個是 PUSH(入棧) 和 POP(出棧)
push ax 表示將AX寄存器的內容送入棧中, pop ax 表示從棧頂取出數據送入AX寄存器中。
8086CPU的入棧和出棧操作都是以字(word)為單位的。
4. 8086CPU中,段寄存器SS:存放棧頂段地址,段寄存器SP: 存放棧頂的偏移地址。
5. 任意時刻:SS:SP 指向棧頂元素。
6. 8086CPU不保證我們對棧的操作是否會越界。
7. 棧頂是低地址單元, 棧底是高地址單元。
8. push 指令的執行步驟:
(1) SP = SP - 2 (偏移地址減少,即往低地址處偏移[棧頂方向])
(2) 向SS:SP指向的字單元中送入數據
9. pop 指令的執行步驟:
(1) 從SS:SP指向的字單元中讀取數據
(2) SP = SP + 2 (偏移地址增加,即往高地址處偏移[棧低方向])
10. 8086CPU只記錄棧頂,棧空間的大小要我們自己管理。
11. 例子:
如果將10000H ~ 1000FH 這段空間作為棧,初始狀態棧是空的,此時SS=1000H,SP = ?
解答:
首先,低地址單元在棧頂方向,高地址單元在棧低方向 。
低地址
10000H
。
。
。
1000DH
1000EH
1000FH
-------------------
10010H <-------------SS:SP指向棧空間最高地址單元的下一個單元。
假設 AX = 2266H, 因為8086CPU的入棧和出棧操作都是以字為單位的 。所以,結果看下圖示。
10000H
。
。
。
1000DH
1000EH 66H (AL) <-------------SS:SP
1000FH 22H (AH)
--------------------------------------------
10010H
以10000H ~ 1000FH這段空間為棧空間,SS=1000H,棧空間大小為16個字節。
當初始狀態棧為空時,SP = 0010H。
12. 編程
(1) 將10000H~1000FH這段空間當作棧,初始狀態棧是空的。
(2) 設置AX寄存器 = 001AH, BX寄存器 = 001BH。
(3) 利用棧,交換AX、BX寄存器中的數據。
- mov ax, 1000H
- mov ss, ax
- mov sp, 0010H
- mov ax, 001AH
- mov bx, 001BH
- push ax
- push bx
- pop ax
- pop bx
13. 編程
如果要在10000H入寫入字型數據2266H,可以使用以下代碼完成:
- mov ax, 1000H
- mov ds, ax
- mov ax, 2266H
- mov [0], ax
要求:不能使用“ mov 內存單元, 寄存器"這類指令,完成上面的功能。
- mov ax, 1000H
- mov ss, ax
- mov sp, 2
- mov ax, 2266H