渔灞灞 发表于 2011-9-15 22:33:15

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

用debug t命令调试就会导致程序出错.是什么原因?
在以后的单步调试中有哪些需要注意?

ytrfamli 发表于 2011-9-15 23:12:52

本帖最后由 ytrfamli 于 2011-9-15 23:54 编辑

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

所以
call word ptr ds:

实际上就是
call word ptr ss:

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

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

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

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

无论如何,该题最重要的是要能了解call指令的相关机制,
确定了解了就能继续了,不必拘泥在调试的问题上.
页: [1]
查看完整版本: 10.5这题为什么不能用单步调试?