| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 852 人关注过本帖
标题:关于一个栈空间的问题!
只看楼主 加入收藏
wsm340223
Rank: 1
等 级:新手上路
帖 子:20
专家分:6
注 册:2012-6-29
收藏
得分:0 
回复 8楼 有容就大
哈哈,,,,,,
2012-10-10 19:05
wsm340223
Rank: 1
等 级:新手上路
帖 子:20
专家分:6
注 册:2012-6-29
收藏
得分:0 
回复 4楼 有容就大
谢谢你!
2012-10-10 19:22
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:2 
以下是引用wsm340223在2012-10-10 19:22:52的发言:

谢谢你!

不用谢 其实你应该去实验一下 。。。
你会发现一个小小的问题。
在理论上8个字的栈如果是空的话 无疑栈顶指针指向0fh是错误的 而应该指向10h
但是如果改成10h后再去单步调试你的程序(你的栈应该只有8个零) 仍然会在压完第6个字的时候
就会跳出来 什么原因呢?
因为你用8个字空间的栈来装载8个字的ds段数据 这是没有问题的
只要你加载数据段和堆栈段段地址后 用-u命令来查看循环结束的CS:IP 也就是mov ax, 4c00h
的cs:ip 并用-g命令跳转到这里程序是很正常的, 结果可以看到数据段已经全部逆序存放了。
但是如果你用单步调试来执行程序那么就会出现问题 。 在单步调试的时候 -t是一个单步中断
这个中断过程是这样的
取得中断类型码N
pushf  标志寄存器入栈  
TF = 0, IF = 0
push cs 代码段寄存器入栈
push ip 指令指针寄存器入栈
ip = N * 4, cs = N * 4 + 2.

iret 后再pop出原来保护的现场数据。
可以看到在应用程序压栈的同时使用-t来单步调试 要额外要入三个字即6个字节的空间
如果只给这个过程准备了2个字即4个字节的话 只实现了pushf 和 push cs 而 ip这个现场数据没有被保护好,那么到iret后原来的cs 和 ip 就被生生的割断了 程序将跳转到一个未知的地方 保护模式下的cmd就会跳出用户程序返回DOS。

其实这个问题以前我也有很大的疑惑 而感觉初学的人大多有这方面的相似疑问 就写了上面这些东西 希望自己没有理解错。。。




                    


[ 本帖最后由 有容就大 于 2012-10-10 20:52 编辑 ]

梅尚程荀
马谭杨奚







                                                       
2012-10-10 20:46
chaoc
Rank: 1
等 级:新手上路
帖 子:46
专家分:0
注 册:2012-10-20
收藏
得分:0 
回复 13楼 有容就大
这正是我的疑惑之处。多谢解答!
2012-10-24 09:09
快速回复:关于一个栈空间的问题!
数据加载中...
 
   



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

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