. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  栈顶环绕如何理解?  [待解决] 回复[ 5次 ]   点击[ 587次 ]  
chns811
[帖 主]   [ 发表时间:2009-09-06 22:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-04 00:24
设栈段地址为:1000H,最大栈段为64KB(0~FFFFH)
那么栈底SS:SP为1000:0000

压栈至满的时候:SP-2(0000-2=FFFE?应该是-2)纯减法来说,总要借位吧,原来的SP是0,它跟谁借?

出栈至空的时候:SP+2(FFFE+2=10000?)SP也是0??

糊涂了。。。。。。反正走路都在想,也令我词不达意

P69问题3:12的分析:
从栈操作指令所完成的功能的角度上来看,push、pop等指令在执行的时候只修改SP,所以栈顶的变化范围是0~FFFFH,从栈空时候的SP=0,一直压栈,直到栈满时SP=0;如果再次压栈,“栈顶将环绕”,覆盖了原来栈中的内容。所以一个栈段的容量最大为64KB。
wsrf
[第1楼]   [ 回复时间:2009-09-07 09:59 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
当SP=0时,此时再入栈,SP-2=FFFE,它肯定是进行借位操作了。当SP=FFFE时,此时再出栈,SP+2=10000,但是寄存器SP只能保存两个字节,所以进位1被抛弃,SP的值为0000,上面所说的“栈顶环绕”就是指由于寄存器位数的限制,如果栈空间0-FFFF中都已压入了内容,此时SP=0,如果再次进行入栈操作,SP=0000-0010=FFFE,此时原来存储在FFFE中的内容将会被覆盖,这就是所说的“栈顶将环绕”。
wsrf
[第2楼]   [ 回复时间:2009-09-07 10:01 ]   [引用]   [回复]   [ top ] 
荣誉值:33
信誉值:0
注册日期:2008-10-16 10:01
上面说到的 SP=0000-0010=FFFE 应该为 SP=0000-0002=FFFE
chns811
[第3楼]   [ 回复时间:2009-09-07 23:42 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2009-08-04 00:24
谢谢热心的WSRF老大指教!

“当SP=FFFE时,此时再出栈,SP+2=10000,但是寄存器SP只能保存两个字节,所以进位1被抛弃,SP的值为0000,”

书中前面说到,进位其实并没有抛弃,只是先不研究这个问题,只是由于寄存器只能存两个字节,所以为0,总是感觉不怎么严谨,这样不是数据丢失吗?
wnfzy-126
[第4楼]   [ 回复时间:2009-09-28 15:03 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:0
注册日期:2009-08-22 20:30
堆栈段总是用SS : SP来定位的,所以只关心SS SP 的内容好了
william
[第5楼]   [ 回复时间:2012-02-06 15:18 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-01-02 13:45
当SP=0时,此时再入栈,SP-2=FFFE,它肯定是进行借位操作了。当SP=FFFE时,此时再出栈,SP+2=10000,但是寄存器SP只能保存两个字节,所以进位1被抛弃,SP的值为0000,上面所说的“栈顶环绕”就是指由于寄存器位数的限制,如果栈空间0-FFFF中都已压入了内容,此时SP=0,如果再次进行入栈操作,SP=0000-0010=FFFE,此时原来存储在FFFE中的内容将会被覆盖,这就是所说的“栈顶将环绕”。
------------------
回复:
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved