. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  当SP=0时,如何判断是栈满还是栈空呀。  [待解决] 回复[ 6次 ]   点击[ 742次 ]  
lcf20092009
[帖 主]   [ 发表时间:2009-12-19 11:00 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-12-06 09:36
1。当SP=0时,如何判断是栈满还是栈空呀。   


还有就是当SP=0时,再次压栈将发生栈顶超界,但压栈操作有效。  这句话正确吗? 

个人认为这句话对栈满时而言是正确的。但是对栈空而言是错误的。  我这个理解对吗? 

为什么答案显示是正确的,是我理解错误了吗?倒底错在那了? 


2。栈是可以循环的吗? 


求知道的朋友讲解一下上面两个问题。谢谢了。
scuzg
[第1楼]   [ 回复时间:2009-12-19 19:47 ]   [引用]   [回复]   [ top ] 
荣誉值:307
信誉值:0
注册日期:2009-03-15 23:46
先说 2 ,我认为栈是不可以“循环”的,循环意味着覆盖,而堆栈保存的信息如中断或子程序返回、状态信息等,这些信息一旦丢失,对正在运行的程序来说,会导致致命错误。

再说 1 。首先我认为单从 sp = 0 是无法区分栈满还是栈空的;我认为解决这个问题最简单、最有效的办法是在设置堆栈的容量(也即 sp 的初值)时,最多设置到 65534,即 0fffeh,这样只损失了一个字的空间,但大大简化了栈满还是栈空的判断。

另外堆栈容量的设置必须有足够的富裕量,以确保不发生栈满的情形导致程序崩溃。其实堆栈容量是较难精确估算的,因为是个“公共场合”,系统程序、应用程序和其他驻留程序都要使用它,并且各种中断响应的时机难于预估,所以一般给一个较大的容量值,对于我们演练程序而言,下述容量的堆栈段可使我们不钻这个牛角尖,去关注汇编里更有价值的知识:
stacks  segment stack
        dw 80 dup(?)
stacks  ends
abob
[第2楼]   [ 回复时间:2009-12-23 10:35 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
我的思路和楼主的一样,sp=0且栈空的时候,压栈是正常的,不算越界。 

题目中说“再次压栈”,也就是说前面已经有压栈操作了,所以说sp=0不可能是栈空的时刻,只能是栈满的时刻。 
那么这个题支就是完全正确的了。 

2。栈是可以循环的吗?  
---------------- 
从逻辑上是不可以的,这样会造成数据的覆盖。如果栈是64k,那么覆盖的就是自己压栈的数据。如果栈小于64k,那么覆盖的就是非自己申请的栈空间,不可控的问题更多。
实际上,栈64k,栈满后压栈也是依然有效的,如上面题支。
willflyz
[第3楼]   [ 回复时间:2009-12-25 14:26 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:0
注册日期:2009-02-14 14:25
学习
hygf99
[第4楼]   [ 回复时间:2010-01-18 23:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-10-17 21:41
我的理解是:入栈时SP-2,如果sp=0是栈空,那么一次PUSH就超界了
arcman2009
[第5楼]   [ 回复时间:2010-01-20 19:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-11-22 15:29
单看SP=0时是无法判断栈满还是栈空~~如果把题目连起来看的话"当SP=0时,再次压栈将发生栈顶超界"也就是说栈满.

但压栈操作有效.这句话也是对的~~栈顶超界只是覆盖栈段外的其他数据,压栈操作是有效的,但这样很危险
regex
[第6楼]   [ 回复时间:2010-01-21 00:56 ]   [引用]   [回复]   [ top ] 
荣誉值:61
信誉值:0
注册日期:2009-12-19 01:51
避免越界的方法, 就是定义合理的栈空间。 (如需要的话0
如果用栈不多, 就没必要特意去定义一个栈。
我是这么认为的, 呵呵!
记住【先入后出】的原则, 就可以啦
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved