小磊 发表于 2013-7-13 22:43:44

64k栈空满疑惑

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

那么如何区别是空是满呢???

Dardy 发表于 2013-7-14 00:20:14

64KB的栈是一个值得考虑的问题
栈顶字 1000:0栈底字 1000:FFFE
我们用的栈比较小的时候,空栈时,把sp指向栈底字下面的一个地址。当栈为64KB大时,则没法指向栈底字下面的一个地址,为因像1000:(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的值来了解,但并不会出问题。就当作数学家设计的补码的神奇效果吧。


monk-half 发表于 2013-7-14 12:52:37

栈空栈满只是人为的,逻辑上的概念。就像段一样,计算机根本不管这些。所以判断是否栈满需要在程序上设置相应的标志,而不是从内存上直接观察。
页: [1]
查看完整版本: 64k栈空满疑惑