鱼C论坛

 找回密码
 立即注册
查看: 2590|回复: 1

10.5这题为什么不能用单步调试?

[复制链接]
发表于 2011-9-15 22:33:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
用debug t命令调试就会导致程序出错.是什么原因?
在以后的单步调试中有哪些需要注意?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-15 23:12:52 | 显示全部楼层
本帖最后由 ytrfamli 于 2011-9-15 23:54 编辑

这题实际上数据段ds跟栈段ss是共用的(因为程序开始有指令如此设定)

所以
call word ptr ds:[0Eh]

实际上就是
call word ptr ss:[0Eh]

call word ptr指令执行的时候发生什麽事呢?
写在call下方的指令的内存地址(即ip)被压入栈
然後CPU读取我们传给call指令的内存地址里边存的数据
当作新的ip,把ip指向那边.

在这个例子里边,我们传给call指令的内存地址刚好
就是栈里只压了一个数据时的栈顶,所以拿到的新ip刚好就是刚刚压入的旧ip

如果一路执行到底,这不会有什麽问题
但是,单步调试的时候,系统会向栈段压入一些额外资讯
(细节在後面中断部分会提)
这个动作比call指令压入旧ip还要早一步,因此,单部调试的结果是不正确的.

注:
虽然理论上是这样解释,但是实际上我在测试时有的时候
使用g指令一路到底来调试, 或是直接执行一样会出错,
为什麽如此我就无从解释起了,希望了解的网友也能来指导下.

无论如何,该题最重要的是要能了解call指令的相关机制,
确定了解了就能继续了,不必拘泥在调试的问题上.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 06:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表