在8086汇编中DEBUG是个非常实用的工具,并且可以非常明了的查看每一步指令每一个段的相对状态,有利于学习。下面列举一下DEBUG的一些使用方法:
-
-A:可以开始在相应位置编写代码,其中后面可以接一个地址,表示写的位置;从下图可以看到,A后加参数2000,即从段偏移2000的位置开始存放代码。
-
-C:
-c [add1]L[length] [add2]
是将add1和add2开始的length个数据显示出来,进行比较;下图键入:
-C 50L20 100
第二列显示的是0050-006F的数据内容,第三列显示的是0010-011F的数据内容,而长度为20。非常直观的显示了数据。 -
-D:显示存储空间中的内容。
如上所示,0200中本来是空的,通过a命令写进代码后再次查看可以发现里面存放了新的操作码。
另外还可以通过指示明确段和偏移直接查询特定位置的内容。(如
CS:200
) -
-E:修改特定存储空间中的内容
-E 100 073F:0100 B8.12
也可以通过连续输入的方式更改连续的一片内容:
-
-F:用于填充一段存储单元,但是要注意他的格式把段地址和段偏移要写清楚
如下图所示,L10表示填充的长度是10 后面加填充的内容,通过两个命令可以发现,如果填充的内容我只写了 \(n\) 个而填充的长度我写了\(m\)个(\(n<m\) )则会顺序循环的自动填充。
-
-G:这个命令使用不当会导致系统崩溃使用方法为:G[=address],代表从当前 \(cs:ip\) 所指的位置执行到address处.
技巧:先用 -U 查看部分指令内容,然后用 -G 快速执行内容
-
-H: 这个选项比较简单,即输入两个参数,对这两个参数进行加减运算,把想加的结果显示在第一列,相减的结果放在第二列,其中我们可以看到,当减为负数时候是以补码的形式表示的。
-
-I: 从某一端口输入并显示一个字节,后面的参数接端口号。
-
-L: 发现L命令并不能使用,查阅了资料,dos下运行debug时,涉及到直接写硬盘扇区的操作都是被禁止的,这是windows的保护功能。如果想要运行全部debug命令,必须在实模式dos下运行。
-
-M:把 \(cs\) 中的一段内容移动到内存单元中,这里默认指的就是 \(DS\) 段。
-
-N:用于对文件命名,-n[name]。
-
-O: 用于给端口发送数据,
; 向2F8端口发送数据4F -O 2F8 4F
-
-Q :使用Q命令来退出debug调试
-
-R:R命令是个非常方便的命令,它可以查看和修改8086中寄存器的值。使用-R可以直接查看所有的寄存器,使用 -R+[指定寄存器] 可以实现对某个寄存器的修改,如上图所示,已经成功修改了AX中的值。其中使用-R F可以查看标志寄存器的状态如图所示,它不是单纯的0和1不太好记,可以查实验书来对照,可以看到当前寄存器属于:未溢出、方向正、允许中断、符号为正、不是0、没有辅助进位、奇、没有进位的状态。
-
-F:用于搜索指定位置中的字符,返回的是精确的地址
-
-T:单步调试
-
-U:反汇编指令,可以将存在内存中的机器码反编译成汇编语言,其中一个参数是起始地址
-
-W:一直没调试成功,原因应该和L命令相同,windows为了保护硬盘,并不允许在这种情况下使用此命令。
通过学习可以发现立即数在使用时候默认为 \(16\) 进制,并且不需要加H,末尾加H反而会报错,并且debug中并不区分大小写。
emu8086也是一个非常好的调试软件,操作简单方便网上就可以下载。。
debug在CMD中打不开是因为windows版本过高,可以下载Dosbox
在其中运行调试