爱了爱了,这篇寄存器讲的有点意思( 七 )


现在 , 我们可以完整的描述一下 push 和 pop 过程了 , 下面 cxuan 就给你推导一下这个过程 。
爱了爱了,这篇寄存器讲的有点意思文章插图
上面这个过程主要涉及到的关键变化如下 。
当使用 「PUSH」 指令向栈中压入 1 个字节单元时 , SP = SP - 1;即栈顶元素会发生变化;
而当使用 「PUSH」 指令向栈中压入 2 个字节的字单元时 , SP = SP – 2 ;即栈顶元素也要发生变化;
当使用 「POP」 指令从栈中弹出 1 个字节单元时 ,SP = SP + 1;即栈顶元素会发生变化;
当使用 「POP」 指令从栈中弹出 2 个字节单元的字单元时 ,SP = SP + 2 ;即栈顶元素会发生变化;
栈顶越界问题现在我们知道 , 8086 CPU 可以使用 SS 和 SP 指示栈顶的地址 , 并且提供 PUSH 和 POP 指令实现入栈和出栈 , 所以 , 你现在知道了如何能够找到栈顶位置 , 但是你如何能保证栈顶的位置不会越界呢?栈顶越界会产生什么影响呢?
比如如下是一个栈顶越界的示意图
爱了爱了,这篇寄存器讲的有点意思文章插图
第一开始 , SS:SP 寄存器指向了栈顶 , 然后向栈空间 push 一定数量的元素后 , SS:SP 位于栈空间顶部 , 此时再向栈空间内部 push 元素 , 就会出现栈顶越界问题 。
栈顶越界是危险的 , 因为我们既然将一块区域空间安排为栈 , 那么在栈空间外部也可能存放了其他指令和数据 , 这些指令和数据有可能是其他程序的 , 所以如此操作会让计算机懵逼 。
我们希望 8086 CPU 能自己解决问题 , 毕竟 8086 CPU 已经是个成熟的 CPU 了 , 要学会自己解决问题了 。
爱了爱了,这篇寄存器讲的有点意思文章插图
然鹅(故意的) , 这对于 8086 CPU 来说 , 这可能是它一辈子的 夙愿 了 , 真实情况是 , 8086 CPU 不会保证栈顶越界问题 , 也就是说 8086 CPU 只会告诉你栈顶在哪 , 并不会知道栈空间有多大 , 所以需要程序员自己手动去保证 。。。


推荐阅读