Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging DOS调试跟踪命令不';I don’我不能像我预料的那样工作_Debugging_Assembly_Dos_X86 16_Tasm - Fatal编程技术网

Debugging DOS调试跟踪命令不';I don’我不能像我预料的那样工作

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,而不是

我有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
,而不是
incdl
?A好的,它应该
INC dl
然后
循环xxxx
三次,然后
INT 20

当我连续按
-t
时,它会去某个我不知道的地方,直到崩溃,意思是找不到
int20h

这与
debug abc.com
后跟
-u

它的show
INC 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
      @MichaelPetch
      p
      工作正常,但是
      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来避免这种情况。