NBeeeeee 发表于 2015-10-23 01:43:48

debug 调试程序出现的奇怪现象

图片中附带程序代码,功能是把前八个字形数据首尾对调,先不管代码是否简介,关键是我再debug调试的时候遇见一个很有意思的事
我在debug中只能用G命令直接跳到int 21h 处才能看到程序所执行的功能。。如果用T单步执行,且在执行到第一次循环时候用P指令执行,,然后,奇怪的事发生了,我再用T指令继续往下执行2条指令的时候,他直接给我正常返回debug了。。。这是什么情况?


从第一张图片可以看到我用G命令   g 002a


第二张图执行到add bx,2 再用T执行就出现正常返回的字样,这特么是什么梗?我再用POP出栈的时候难道把mov ax,4c00和int 21h 给出栈到当前CS:ip所指向的地方了么?不然怎么会正常返回debug?

康小泡 发表于 2015-10-23 01:43:49

本帖最后由 康小泡 于 2015-10-23 13:32 编辑

当用T命令调试的时候,实际上触发了单步中断,而单步中断的时候,也会往栈里存东西,比如CS、IP、标志位之类的。程序的压栈操作,把单步中断保存的CS或IP覆盖掉了,所以使用T命令之后,就无法正确返回。
解决办法:把栈的大小设大点

附上我修改了一点点后的
assume cs:codesg,ss:stack,ds:data

data segment
        dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0eh,0fh,0ffh
data ends

stack segment
        dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends

codesg segment
start:
                mov ax,data
                mov ds,ax
               
                mov ax,stack
                mov ss,ax
                mov sp,20h
               
                mov bx,0
                mov cx,8
               
       s: push
                add bx,2
                loop s
               
                mov cx,8
                mov bx,0
        s0:        pop
                add bx,2
                loop s0
               
                mov ax,4c00h
                int 21h
codesg ends
end start


ps:以后遇到有代码的这个问题,最好是把代码贴出来,不要用图片的形式,不方便回答问题的。因为有时候直接看代码也看不出来是什么。

NBeeeeee 发表于 2015-10-23 01:56:59

继续上图,现在我只要在T一下就会显示正常返回。。所以我当即U了一下现在内存内容,发现将要执行
add bx,2
loop 0020
这个还要循环8次
而且mov ax,4c00 和int 21 这俩的地址分别是0027 和002a
loop 是跳到0020的地方,
他怎么就直接返回了?


NBeeeeee 发表于 2015-10-23 01:57:48

看,我接下来T了一下就直接返回了!!直接上图

2418267670 发表于 2015-10-23 08:07:41

:cry不用g 002a时一切正常,用完后就不行了,一用G命令就直接结束程序:cry:cry:cry:cry:cry

y290176346 发表于 2015-10-23 14:00:48

本帖最后由 y290176346 于 2015-10-23 14:38 编辑

o

NBeeeeee 发表于 2015-10-24 19:23:25

2418267670 发表于 2015-10-23 08:07
不用g 002a时一切正常,用完后就不行了,一用G命令就直接结束程序

我是用T命令就不正常。。。

NBeeeeee 发表于 2015-10-24 19:35:37

康小泡 发表于 2015-10-23 13:27
当用T命令调试的时候,实际上触发了单步中断,而单步中断的时候,也会往栈里存东西,比如CS、IP、标志位之 ...

泡姐你的意思是,原先栈中保存的cs和IP的值被覆盖了,而覆盖CS和IP的值又能使 CS和IP两个寄存器指向保存程序正常返回指令的地址?所以再次执行时直接正常返回了?{:9_241:}

NBeeeeee 发表于 2015-10-24 19:36:12

y290176346 发表于 2015-10-23 14:00
o

hi~

y290176346 发表于 2015-10-24 22:20:33

想了半天,我开始想回答肯定是和-t 命令工作原理有关,但是原理也不知道,发完后,看泡姐回答了,看自己的答案怕叫别人笑话,所以就把答案改成了o

NBeeeeee 发表于 2015-10-25 14:43:32

y290176346 发表于 2015-10-24 22:20
想了半天,我开始想回答肯定是和-t 命令工作原理有关,但是原理也不知道,发完后,看泡姐回答了,看自己的 ...

大哥6666

康小泡 发表于 2015-10-25 15:02:38

NBeeeeee 发表于 2015-10-24 19:35
泡姐你的意思是,原先栈中保存的cs和IP的值被覆盖了,而覆盖CS和IP的值又能使 CS和IP两个寄存器指向保存 ...

不是这个意思,我昨天没看到你的回复。

是t命令相当于是一个单步中断的意思,单步中断的时候,他会先把标志寄存器的值和cs,ip的值都放入栈中,所以你原先定义的那个栈就被装入了其他的数据,装入了其他的数据后栈满了,所以就导致了错误。中断相关的内容你会下下面的内容里面学到。所以你现在只要懂是因为t命令导致你的栈空间不够,就可以了。

NBeeeeee 发表于 2015-10-25 18:13:23

康小泡 发表于 2015-10-25 15:02
不是这个意思,我昨天没看到你的回复。

是t命令相当于是一个单步中断的意思,单步中断的时候,他会先 ...

好的好的,多谢泡姐{:9_235:}

康小泡 发表于 2015-10-25 18:33:36

NBeeeeee 发表于 2015-10-25 18:13
好的好的,多谢泡姐

不客气,还有就是设置了悬赏的帖子,最好在你得到你想要的答案的时候记得给你觉得最好的回答选为最佳,这样人家才能的到你的鱼币,同时该帖才会被设置为已经解决。不然会浪费其他鱼油的时间来看这些问题和回复,然后最后发现已经被解决了
页: [1]
查看完整版本: debug 调试程序出现的奇怪现象