飞翔的石牌人 发表于 2016-12-2 22:24:58

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

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

zealstar 发表于 2016-12-3 00:22:41

我来回答你的问题吧。首先你得理解debug是带有中断机制的调试工具。既然有中断机制,那么中断前的寄存器状态会保存到什么地方呢?
答案很明显,栈!

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


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

然后我们开始单步调试,当我完成对栈段的定义后,也就是mov sp,10f之后,发生了什么?你看:

嘿嘿,{:10_256:} ,后面的指令变了,为什么?因为debug的中断机制,栈内已经有了数据,而这个数据覆盖了CS段的内容,因为CS和SS段是同一个内存段。

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


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

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

求采纳,求评分!{:10_325:} {:10_301:}

飞翔的石牌人 发表于 2016-12-3 18:31:32

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

比较透彻, 但是我还得花点时间再研究下
页: [1]
查看完整版本: 关于汇编程序单步调试的问题