Debugging DOS调试跟踪命令不';I don’我不能像我预料的那样工作
我有ASM代码,它使用循环语法打印Debugging DOS调试跟踪命令不';I don’我不能像我预料的那样工作,debugging,assembly,dos,x86-16,tasm,Debugging,Assembly,Dos,X86 16,Tasm,我有ASM代码,它使用循环语法打印abc。这是我的密码 ;abc.com .model small .code org 100h start: mov ah, 02h mov dl, 'a' mov cx, 3h ulang: int 21h inc dl loop ulang int 20h end start COM程序运行正常 debug abc.com的结果,后跟-t如下所示 问题是为什么它在int21之后是NOP,而不是
abc
。这是我的密码
;abc.com
.model small
.code
org 100h
start:
mov ah, 02h
mov dl, 'a'
mov cx, 3h
ulang:
int 21h
inc dl
loop ulang
int 20h
end start
COM程序运行正常
debug abc.com
的结果,后跟-t
如下所示
问题是为什么它在int21
之后是NOP
,而不是incdl
?A好的,它应该INC dl
然后循环xxxx
三次,然后INT 20
当我连续按-t
时,它会去某个我不知道的地方,直到崩溃,意思是找不到int20h
这与debug abc.com
后跟-u
它的showINC dl
和LOOP 0107
表示循环
供参考:
- 赢7个终极SP 1 32位
- GUI Turbo ASM x86 3.0
- 赛扬双核n2840
- 调试中的
T
race命令相当于现代调试器的逐步进入功能。int
指令(如call
)执行一系列指令,然后返回调用者T
race将进入软件中断处理程序或函数,一次执行一条指令。调试文档中提到了关于T
race:
执行一条指令,并显示所有寄存器的内容、所有标志的状态以及所执行指令的解码形式
在您的例子中,点击int21h
,跳转到CS:ip00a7:107C处的软件中断处理程序代码。如果您跟踪所有中断处理程序代码,您最终将到达1400:0109的CS:IP,其中包含INC DL
指令
为了执行一个函数或中断而不单步执行与之相关的每条指令,可以使用p
roceed命令。继续类似于现代调试器的跨步功能。中断处理程序或函数/子例程的代码将在INT或CALL指令之后在指令上执行并中断
文件中说明了以下内容:
当p命令将控制从调试转移到被测试程序时,该程序将不中断运行,直到指定地址的循环、重复字符串指令、软件中断或子例程完成,或者直到执行了指定数量的机器指令。控件然后返回到调试
INT21H是一个具有自己代码的中断处理程序。使用<代码> t>代码>命令,您进入了int 21处理程序代码。您将注意到:CS:IP从1400到0107到900A7:107C.您可能希望考虑<代码> P<代码>命令,而不是<代码> t>代码> > < <代码> int 21H <代码> > < <代码> >code>p本身应该执行中断处理程序中的所有代码,然后在中断处理程序之后的下一条指令中断,这条指令将是
inc dl
@MichaelPetchp
工作正常,但是p
和t
之间的区别是什么?我的意思是继续跟踪/步?t
将步进(跟踪)函数(调用
)的代码和软件中断处理程序(int
)之间的区别<当使用call
或单步执行int
的代码时,code>p不会单步执行函数p
将完整地执行一个函数或中断处理程序,然后在int
或调用后的下一条指令中断p
roceed更像是一步一步地过去,而t
race更像是一步一步地进入FWIW,DOS调试通过在调用/INT之后放置一个INT 3来实现p
。然后它允许程序全速运行。当INT 3被击中时,它会移除INT 3。所以通常用户看不到INT 3。然而,在极少数情况下,INT 3会把事情搞砸。例如,一些汇编例程可以返回到调用后的指令,也可以返回到调用后从+2开始的指令。如果例程返回+2,则INT 3不会被命中,也不会被调试器删除。更现代的调试器将使用硬件断点而不是INT3来避免这种情况。