鱼C论坛

 找回密码
 立即注册
查看: 2384|回复: 2

64k栈空满疑惑

[复制链接]
发表于 2013-7-13 22:43:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
64k堆栈空时,sp=0
我理解了
不过满的时候,sp也为0吧

那么如何区别是空是满呢???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-14 00:20:14 | 显示全部楼层
64KB的栈是一个值得考虑的问题
栈顶字 1000:0  栈底字 1000:FFFE
我们用的栈比较小的时候,空栈时,把sp指向栈底字下面的一个地址。当栈为64KB大时,则没法指向栈底字下面的一个地址,为因像1000:[sp](sp=fffe)这样的地址,把SP再加2的话,就超出了两个字节SP的表示范围,这也是各种(栈)段64KB大小限制的由来.
fffe +2 等于10000h,SP只能装下后面的4个0,于是奇葩事情发生了,栈底字出栈,SP+2,SP又指向栈顶,而不是往下指,(如果能向下指也就没有64KB的限制了),但这并不影响使用。
这种SP=0时,无论视它为空栈对其进行压栈,还是你视它为满栈进行出栈,都没有问题。
出栈不用说。
压栈时,sp-2 即0-2,压栈,能不能压到栈底? SP-2后SP的值是负2,负2的补码为FFFE,奇葩事出现了,SP不是像以前一样向下移一个字,而是直接移向栈底字1000:FFFE

总之,你仔细想一下,SP为0时,无论视它为空栈对其进行压栈,还是你视它为满栈进行出栈,都没有问题。

至于一个64KB栈空间是否被压满了数据,还是数据出空了,无法通过SP的值来了解,但并不会出问题。就当作数学家设计的补码的神奇效果吧。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2013-7-14 12:52:37 | 显示全部楼层
栈空栈满只是人为的,逻辑上的概念。就像段一样,计算机根本不管这些。所以判断是否栈满需要在程序上设置相应的标志,而不是从内存上直接观察。

评分

参与人数 1荣誉 +1 鱼币 +1 贡献 +1 收起 理由
Dardy + 1 + 1 + 1 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 16:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表