注册 登录
编程论坛 汇编论坛

8086汇编,对用debug的t命令单步执行结果的疑问

kangaroo1212 发布于 2020-05-24 12:28, 4286 次点击
如图一些汇编指令,用t命令一条条执行,并观察如图所示栈中数据,存在如下疑问:栈中数据包含了当前ip和cs,接着不应该是标志寄存器内容吗?那为啥和显示出来的各个标志位不对应呢?
只有本站会员才能查看附件,请 登录
4 回复
#2
Valenciax2020-05-24 17:05
flag的word值是3047h吧
把你的flag直接输入(第1黄框),结果(第2黄框)
红框是pushf前的栈,蓝框是pushf后的栈,也就是flag中的值3047h

只有本站会员才能查看附件,请 登录
#3
kangaroo12122020-05-24 23:14
回复 2楼 Valenciax
flag的word值是3047h吧?
是的,我那个图中直接pushf这条执行后栈中的对应数据是3047h,你可以看到的。

重点是我问的前半句疑问,因为我理解图上红线的“58 06”应该是“47 30”。换句话说,图中每条指令下查看栈数据,其中后面都有5806(就是0658h),
这个0658h是什么数据啊,因为我以为这个是上条指令执行后用来恢复现场的标志寄存器值。我的依据是t命令执行后会单步中断,相应的中断过程会干这事吧。
#4
Valenciax2020-05-25 06:20
push动作是每次sp-2,'自身程序'管控的栈域是sp或以后的内存,换言之,sp前面的区域是'未定义'的.
用户按一下t,p,甚至输入任何字符,debug都会取回控制权去处理插入的命令,它的动作是先push一堆暂存器,标志等等,
然后运作对应程序,完了后就pop回一堆暂存器,再交回控制权,这一连串PUSH/POP是平冲的,以保证用户的SP或以后的内存不变,
你看见sp之前的东西就是DEBUG残留的
.
上图红框和蓝框前FFF0一列的变化,就是DEBUG做完T后遗留的东西.

即使dos不是多功系统,但计时中断,或其他不定时的中断都会随时插入,完成后也一样还原用户的栈针.
用户SP之前的东西是随时变化的.

用户也应该只关心本身SP或之后的内存,SP之前的是没有意义的.
#5
kangaroo12122020-05-25 13:50
回复 4楼 Valenciax
嗯,谢谢你~我主要在纠结中断过程入栈参数,毕竟看到了ip和cs,唯独不见flag,所以一直纠结这个,算了,不纠结这个了,我想应该是被你说的中断例程污染了吧
1