栈 Stack
- 先进后出 LIFO(last in first out)
- 详细可见wiki https://en.wikipedia.org/wiki/Stack_(abstract_data_type)
8086 CPU
栈
- 用一段 内存单元 来当做栈使用
出栈、入栈指令
- 入栈
push ax
: 表示将 寄存器ax 中的数据送入栈 - 出栈
pop ax
: 表示从栈顶取出数据,并送入寄存器ax
出栈、入栈使用内存单元
- 出栈、入栈以字为单位进行
- 1个 字占用2个内存单元,是16位
- 内存单元高地址放高8位(ah)的数据,低地址放低8位(al)的数据
SS:SP 始终指向栈顶元素
- SS 寄存器:栈顶的段地址
- SP 寄存器:栈顶的偏移地址
出栈、入栈的寄存器IP变化
- 出栈:
SP=SP+2
,SS:SP 指向更高的内存地址 - 入栈:
SP=SP-2
,SS:SP 指向更低的内存地址
栈为空
- SS:SP 指向栈的最底部单元下面的单元
用10000H~1000FH 表示栈
栈空时,SS:SP 指向 1000FH 的下一个内存单元 10010H
POP操作后内存单元的数据不会消失
- 在内存中的数据还在内存之中,只是不在栈里面了
CS:IP 与 SS:SP
- CS:IP 指向当前要执行的指令在何处(但是不知道有多少条要执行的指令)
- SS:SP 指向栈顶元素在何处(但是不知道栈的空间有多大,以及哪里是上界、哪里是下界)
问题3.10
问题3.10 题目要求
寄存器传递数据到内存单元
- 在10000H 处写入字型数据2266H ,就是说执行完push之后,SS:SP要指向的地址就是10000H
- SS 是段地址寄存器,不能直接输入数据
题目给的代码 :
mov ax,1000H
mov ds,ax
mov ax,2266H
mov [0],ax
答案要求的等价代码 :
mov ax,1000H
mov ss,ax
mov sp,0002H
mov ax,2266H
push ax
-
代码执行后的内存结果
PUSH 过程发生了什么?
- 1、执行
push ax
之前,SS:SP
指向10002H
(可以通过代码设置SS=1000H,SP=0002H
); - 2、接着,
CPU
先将SP=SP-2
,使得SS:SP
指向10000H
; - 3、最后,将
寄存器ax
中的数据送入SS:SP
指向的内存单元,即10000H
处。
MOV 与PUSH、POP的区别
mov 指令,只是传送;
push 指令,CPU 两步走:
⑴先改变SP(SP=SP-2),
⑵后向SS:SP处传送;pop 指令,CPU 两步走:
⑴先读取 SS:SP 处的数据,
⑵后改变SP(SP=SP+2);
PUSH POP 用于 内存单元 与 内存单元 之间传递数据
- 默认SS:SP指向一个栈顶地址 ;
- 设置段地址寄存器DS=1000H;
- 入栈,将内存单元1000:0H处的字压入栈;
- 出栈,将栈顶元素送入1000:0002H内存单元;
mov ax,1000H
mov ds,ax
push [0]
pop [2]