汇编语言-栈

栈:

栈是一种具有特殊的访问方式的存储空间。它的特殊性就在于,最后进入这个空间的数据,最先出去。

入栈和出栈指令:

push 入栈

比如,push ax 表示将寄存器 ax 中的数据送入栈中

pop 出栈

比如,pop ax 表示从栈顶取出数据送入 ax

那么问题来了,CPU 如何知道当前要执行的指令所在位置

那就是 CS、IP 中存放着当前指令的段地址和偏移地址

现在CPU如何知道栈顶的位置?

很显然也应该有相应的寄存器来存放栈顶的地址

这两个寄存器分别是 段寄存器 SS 和 寄存器 SP

栈顶的段地址存放在 SS 中,

偏移地址存放在 SP 中

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


栈空:

如果将 10000H-1000FH 这段空间当作栈,初始状态栈是空的,

此时,SS=1000H ,SP=?

images


如图所示,将 10000H-1000FH 这段空间当作栈,SS=1000H ,栈空间大小为16字节,

栈最底部的字单元地址为 1000:000E 。任意时刻,SS:SP 指向栈顶,

当栈中只有一个元素的时候,SS=1000H ,SP=000EH 。栈为空,

就相对于栈中唯一的元素出栈,出栈后,SP=SP+2 ,SP 原来为 000EH ,加2后 SP=10H ,

所以,当栈为空的时候,SS=1000H ,SP=10H 。


换一个角度看,任意时刻,SS:SP 指向栈顶元素,当栈为空的时候,栈中没元素,

也就不存在栈顶元素,所以 SS:SP 只能指向栈的最底部单元下面的单元,

该单元的偏移地址为栈最底部的字单元的 偏移地址+2 ,

栈最底部字单元的地址为 1000:000E ,所以栈空时,SP=0010H


栈顶超界的问题:

栈顶超界 简单的讲就是有一段栈空间,

如果 push 或者 pop 数据过多将会超出这段空间


push 超界

将 10010H-1001FH 当作栈空间,该栈空间容量为16字节(8字节),初始状态为空,

SS=1000H 、SP=0020H ,SS:SP 指向 10020H ;

每执行一次 push ax ,SP=SP-2 ,

在执行 8次 push ax 后,向栈中压入8个字,栈满,SS:SP 指向 10010H ;

再次执行 push ax 后 sp=sp-2SS:SP 指向 1000EH ,栈顶超出了栈空间,

ax 中的数据送入 1000EH 单元处,将栈空间外的数据覆盖。

images


pop 超界

将 10010H-1001FH 当作栈空间,该栈空间容量为16字节(8字节),初始状态为空,

SS=1000HSP=0010HSS:SP 指向10010H

在执行 8次 push ax 后,向栈中弹出8个字,栈空,SS:SP 指向 10020H

再次执行 push ax 后 sp=sp+2SS:SP 指向 10022EH,栈顶超出了栈空间,

此后,如果再执行push指令,10020H10021H 中的数据都将被覆盖。

images

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余十步

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值