| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1292 人关注过本帖, 1 人收藏
标题:大家好,我是上上个星期才开始自学的汇编,目前也在学习王爽老师的《汇编语 ...
只看楼主 加入收藏
ououming123
Rank: 2
等 级:论坛游民
帖 子:9
专家分:30
注 册:2012-6-10
结帖率:100%
收藏(1)
已结贴  问题点数:10 回复次数:11 
大家好,我是上上个星期才开始自学的汇编,目前也在学习王爽老师的《汇编语言》。不知道会不会删问好贴。在里面附上我小小的问题
我在学习栈的时候,感觉这个东西真是很奇怪- -
书上好像是这个意思:
空栈的栈底是很明显的,放东西进去的时候会覆盖栈中本来存在的内容。
但是我发现好像有一种上浮的机制,东西放进去造成当前栈顶前低8位的单元内容集体向低位浮动
但是一直放也不会影响到初始栈顶前16位之前的内容。
一旦往栈中放入超过16位数据,就直接跳出DEBUG了。所以也没试出到底能不能影响上一行。
当栈顶前8位的前面都被覆盖了(就是放入4个字,8字节以后)在取出数据,就会是最左边的2个字节重复(此时正好是栈顶前的第8位占据了最左边),原先倍覆盖的数据也不会还原了。   假如此时  0-1是  10 0b   取出一个以后  2-3号位也成了10 0b   
这个。我上面写的这些都是建立在初始栈顶是0结尾的时候
说了这么一大堆- -! 其实我想请教各位大神的是: 栈是如何控制栈的大小的呢。为啥我放入超过16个字节就跳出了。

  的覆盖机制到底是怎么样的呢?     书上并没有详细说,只是说会覆盖。但是我自己测试是覆盖栈顶向低位的第9-10位。而且最多只覆盖到初始栈顶位置向前16位  。超过16位就开始覆盖栈顶前8位以内的内容。      

虽然我只是初学还没怎么用到栈  但是碰到这些问题就想了解一下。
搜索更多相关主题的帖子: 影响 
2012-06-10 20:32
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
没看明白 可否给出测试代码或例子呢
2012-06-10 20:48
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
没有恶意的问好帖一般不处理 含有不恰当内容的会转到相应版块 比如程序供求 比如QQ群版块 含有违规内容的删除 比如广告软文类的
2012-06-10 20:51
ououming123
Rank: 2
等 级:论坛游民
帖 子:9
专家分:30
注 册:2012-6-10
收藏
得分:0 
回复 2楼 zklhp
程序是很基础的
    mov ax,1000h
    mov ss,ax
    mov sp,10h
    push ax
    push cs
    push cs
    push cs
    push ax
    push cs
    push cs

    pop bx
    pop bx
    pop bx
这里的push第1.5.9次执行是push ax.   其他都是cs.
图片插不上- -
总之1000:0所在的上下3行。此时初始值均为0
执行的mov ss,ax后:
1000:0 00 00 00 00 00 00 00 10-00 00 08 00 9c 0b 8c 05
执行第一次push ax证明程序可以用把- -
fff: 0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
fff:10  00 00 00 00 00 00 00 10-00 00 08 00 9c 0b 8c 05
fff:20  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
执行4次push后。1次push ax ,其中有3次push cs 。伤感  不能插图。还好可以复制粘贴啊
fff: 0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
fff:10  00 00 0c 00 9c 0b 8c 05-9c 0b 9c 0b 9c 0b 00 10
                                ----
fff:20  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
这里的 9c 0b 就是cs的值   再次执行push 到第6次
fff: 0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
fff:10  9c 0b 8c 05 9c 0b 00 10-9c 0b 9c 0b 9c 0b 00 10
                    -----
fff:20  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
我很惊讶的就是这里面的数据变化真奇怪。明明栈顶1000:0004 。但是0-1位置上的数据变化让我疑惑了.上一行始终未受影响
在运行一次push
fff: 0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
fff:10  00 00 8c 05 9c 0b 00 10-9c 0b 9c 0b 9c 0b 00 10
              -----     
fff:20  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00
很奇怪。在运行一次之后0-1就变成00 00 了  而且此时不能再运行我编写的程序了。  下一步变成了 int 3
好吧。我又发现一个奇怪的地方。就是此时 CS自动变成了 0000!!!
这个我想直到为啥只能执行7次push呢?
栈前面的几位数据倒地啥意思呢?
不是说栈会覆盖么,为啥确是向前浮动而不是覆盖,实在是装不下了才会覆盖,而且只会覆盖本行(这个如果说是操作系统的保护机制我理解- -)。而且覆盖了以后也不会被还原,执行POP指令时是前面的数据向后覆盖。

2012-06-10 22:22
ououming123
Rank: 2
等 级:论坛游民
帖 子:9
专家分:30
注 册:2012-6-10
收藏
得分:0 
天哪
我的排版- -  我的字体颜色- -
我的代码的框框都没了···
易回复就显示没登录
复制了登录了在发就这样了
2012-06-10 22:23
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:10 
手机发回复 你先看我今天回的那个压栈问题的回复

由于dos是个比较简单的单进程操作系统 所以debug程序和它调试的程序共用一个堆栈 而debug也会进行堆栈操作 于是 可能会有一些问题 具体我没仔细看也不知道。。。

[ 本帖最后由 zklhp 于 2012-6-10 22:43 编辑 ]
2012-06-10 22:42
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
结论就是 对于堆栈操作不要用debug 你试试直接打出调试信息的方法?
2012-06-10 22:47
ououming123
Rank: 2
等 级:论坛游民
帖 子:9
专家分:30
注 册:2012-6-10
收藏
得分:0 
回复 7楼 zklhp
我算是看出来一点了
最主要的问题貌似是覆盖问题
栈基本上好像很少会覆盖原本存在的内容
只有当不停的放入新内容时才会在栈的左端覆盖
2012-06-11 07:32
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
栈是单向生长 正常情况下压栈不覆盖啊

你说的左端覆盖是个啥。。
2012-06-11 09:13
ououming123
Rank: 2
等 级:论坛游民
帖 子:9
专家分:30
注 册:2012-6-10
收藏
得分:0 
回复 9楼 zklhp
在DEBUG里
栈是横行的嘛···
像1000:0~1000:f   习惯性的就分出左右了
假如栈所在的空间本来里面就有内容。    push就会从右往左把数据挤进去   
例如  放入第一个字时      1000:7和1000:6就被覆盖   之前的 1000:8-1000:f集体向低位移动2单元。
   而且好像在左边的某一个单元的内容还是增长变化的,每一次位置的移动他的值都会发生变化。
  其实这个应该是硬件的深层的原因了   单纯学习汇编其实应该只要知道栈是怎么放东西进去又怎么拿出来就可以了 - -

不过我还有一个问题,就是执行7次push后   程序就会自动跳到一个 int 3的地方去了,CS变成0000。
这样那栈不是最多只能存放7个字了么- -     所以才会想要搞清这个问题

Z大你人真好,每天都在这里给新人回答问题 ,辛苦了   
2012-06-11 10:47
快速回复:大家好,我是上上个星期才开始自学的汇编,目前也在学习王爽老师的《汇 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026453 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved