【问题标题】:DOS DEBUG trace command doesn't work as I would expectDOS DEBUG 跟踪命令无法正常工作
【发布时间】:2016-03-11 17:26:19
【问题描述】:

我有使用循环语法打印 abc 的 ASM 代码。这是我的代码

;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 的结果看起来像

问题是为什么在INT 21 之后是NOP,而不是INC dl? AFAIK 它应该INC dl 然后LOOP xxxx 三次然后INT 20

当我连续按-t 时,它会到我不知道的地方,直到崩溃,意味着找不到INT 20h

debug abc.com 后跟 -u 不同

显示INC dlLOOP 0107 表示循环。

仅供参考:

  • Win 7 Ultimate SP 1 32 位
  • GUI Turbo ASM x86 3.0
  • 赛扬双核 n2840

【问题讨论】:

  • int 21h 是一个带有自己代码的中断处理程序。使用t 命令,您进入了 int 21 处理程序代码。您会注意到 CS:IP 从 1400:0107 变为 00A7:107C
  • 当您到达像int 21h 这样的int 时,您可能希望考虑使用pcommand 而不是tp 本身应该执行中断处理程序中的所有代码,然后在 inc dl 之后的下一条指令上中断
  • @MichaelPetch p 按预期工作,但pt 之间有什么区别?我的意思是继续进行跟踪/步骤之间的区别?
  • t 将单步(跟踪)进入函数 (call) 和软件中断处理程序 (int) 的代码。 p 在使用call 时不会进入函数或进入int 的代码。 p 将完整地执行一个函数或一个中断处理程序,然后在 intcall 之后的下一个指令上中断。 proceed 更像 STEP OVERtrace 更像 STEP INTO
  • FWIW,DOS 调试通过在 CALL/INT 之后放置一个 INT 3 来实现 p。然后它允许程序全速运行。当 INT 3 被击中时,它会移除 INT 3。所以通常情况下,用户看不到 INT 3。然而,在极少数情况下,INT 3 可能会搞砸一些事情。例如,一些汇编例程可以返回到调用后的指令或调用后从+2 开始的指令。如果例程返回 +2,则 INT 3 不会被命中,也不会被调试器删除。更现代的调试器将使用硬件断点而不是 INT3 来避免这种情况。

标签: debugging assembly dos x86-16 tasm


【解决方案1】:

调试中的Trace 命令相当于现代调试器的STEP INTO 功能。 int 指令(如call)执行一系列指令,然后返回给调用者。 Trace 将进入软件中断处理程序或函数,并一次执行每条指令。用于调试的MSDN 文档说明了Trace:

执行一条指令并显示所有寄存器的内容、所有标志的状态以及执行指令的解码形式。

在您的情况下,您点击 int 21h 并跳转到 CS:IP 00A7:107C 处的软件中断处理程序代码。如果您跟踪所有中断处理程序代码,您最终会到达 CS:IP of 1400:0109,INC DL 指令所在的位置。

要在不单步执行与其关联的每条指令的情况下执行函数或中断,可以使用proceed 命令。 Proceed 类似于现代调试器的 STEP OVER 功能。中断处理程序或函数/子程序的代码将在 INTCALL 指令之后的指令上执行然后中断。

文档是这样说的PROCEED

当 p 命令将控制权从 Debug 转移到正在测试的程序时,该程序将不间断地运行,直到循环、重复字符串指令、软件中断或指定地址的子程序完成,或直到指定数量的机器指令已被执行。然后控制返回到 Debug。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多