鱼C论坛

 找回密码
 立即注册
查看: 3286|回复: 2

关于汇编程序单步调试的问题

[复制链接]
发表于 2016-12-2 22:24:58 | 显示全部楼层 |阅读模式

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

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

x
看图, 为什么单步运行到 076A:001D 这个位置的时候和用 u 命令查看到的指令不一样?

用 u 命令查看的

用 u 命令查看的
2.png
3.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-12-3 00:22:41 | 显示全部楼层
我来回答你的问题吧。首先你得理解debug是带有中断机制的调试工具。既然有中断机制,那么中断前的寄存器状态会保存到什么地方呢?
答案很明显,栈!

我来给你做一个演示:
我用debug写一段代码进去(我直接在debug中输入的指令),如下:
1.png

这里和你的代码类似,让CS=SS,即指令段和栈段重叠。
并且,我将SP设置为10f,也就是说,栈底,基本上在我的指令段最尾端。

然后我们开始单步调试,当我完成对栈段的定义后,也就是mov sp,10f之后,发生了什么?你看:
2.png
嘿嘿, ,后面的指令变了,为什么?因为debug的中断机制,栈内已经有了数据,而这个数据覆盖了CS段的内容,因为CS和SS段是同一个内存段。

OK,解说到此我想你应该懂部分了,而此时,我们可以查看栈内数据,如下:
3.png

从里面看,显然和第一图中的机器码不同!

所以,我给你的提示是:在使用debug时,应该注意的一点就是,定义任何栈之后,栈都不是空的,里面保存了debug的中断信息!
那么在使用debug调试的时候,要注意不要将栈段与其他段重叠。否则一旦debug保存的数据将其他段内数据覆盖,debug的意义也就没有了。


求采纳,求评分!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-12-3 18:31:32 | 显示全部楼层
zealstar 发表于 2016-12-3 00:22
我来回答你的问题吧。首先你得理解debug是带有中断机制的调试工具。既然有中断机制,那么中断前的寄存器状 ...

比较透彻, 但是我还得花点时间再研究下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-10-6 14:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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