浅谈汇编(2)――堆栈指令

匿名 (未验证) 提交于 2019-12-03 00:18:01

8086CPU提供入栈和出栈指令: (最基本的)

PUSH(入栈) push ax:将寄存器ax中的数据送入栈中;
POP (出栈) pop ax :从栈顶取出数据送入ax。

8086CPU的入栈和出栈操作都是以(两个字节)为单位进行的。

8086CPU中,有两个寄存器:

段寄存器SS  存放栈顶的段地址
寄存器SP  存放栈顶的偏移地址

任意时刻,SS:SP指向栈顶元素。

问题:如果我们将10000H~1000FH 这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP=?

答:SP = 0010H

我们将10000H~1000FH 这段空间当作栈段,SS=1000H,栈空间大小为16 字节 ,栈最底部的字单元地址为1000:000E。
 任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS = 1000H,SP=000EH

push ax(入栈)

(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新栈顶。

pop ax
(1)将SS:SP指向的内存单元处的数据送入ax中;
(2)SP = SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

                         push 指令的执行过程 

                            pop指令的执行过程 


注意:
出栈后,SS:SP指向新的栈顶1000EH,pop操作前的栈顶元素,1000CH 处的2266H 依然存在 ,但是,它已不在栈中
当再次执行push等入栈指令后,SS:SP移至1000CH,并在里面写入新的数据,它将被覆盖

我们要十分清楚的是,push和pop指令同mov指令不同,CPU执行mov指令只需一步操作,就是传送,而执行push、pop指令却需要两步操作
执行push时:
先改变SP,后向SS:SP处传送。
执行pop时:
先读取SS:SP处的数据,后改变SP。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!