3.6栈
操作规则:LIFO(后进先出)
8086CPU提供的入栈和出栈的指令:
Push(入栈)
push ax:将寄存器ax中的数据送入栈中
Pop(出栈)
push ax:从栈顶取出数据送入ax。
8086CPU的入栈和出栈操作都是以字为单位进行的
CPU如何知道当前要执行的指令所在的位置?
寄存器CS和IP中存放着当前指令的段地址和偏移地址
执行push和pop的时候,如何知道哪个单元是栈顶单元?
8086CPU中,有两个寄存器:
- 段寄存器SS 存放栈顶的段地址
- 寄存器SP 存放栈顶的偏移地址
任何时刻,SS:SP指向栈顶元素
push ax时:
SP = SP - 2
将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶
将10000H~1000FH这段空间当做栈,初始状态栈是空的,此时,SS=1000H,SP=多少?
pop指令的执行过程
pop ax
- 将SS:SP指向的内存单元处的数据放入ax中;
- SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
注意:
- 出栈后,SS:SP指向新的栈顶1000EH,pop操作前的栈顶元素,1000CH处的2266H依然存在,但是,它已不再栈中。
- 当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖。