# 附录二:调试程序DEBUG ## 一、DEBUG的主要命令 DEBUG是为汇编语言程序员设计的一个调试工具,具有各种调试功能。用户可以在DEBUG中直接输入命令来观察、修改寄存器和内存的内容,跟踪指令的执行过程等。 ### 1. 显示和修改寄存器命令R **(1)显示寄存器内容** 在DEBUG提示符"-"下键入: ``` -r ``` 屏幕显示所有寄存器的内容和下一条要执行的指令。 **(2)显示和修改寄存器** 在DEBUG提示符下键入: ``` -r ax ``` 系统响应: ``` AX 0000 ``` 冒号后可以输入新的值,例如输入: ``` :1ff ``` 按回车,则AX的内容被修改为01FF。 **(3)显示和修改标志位** 在DEBUG提示符下键入: ``` -rf ``` 系统响应: ``` NV UP EI PL NZ NA PO NC ``` 冒号后可以输入新的标志位值,例如输入: ``` :NV ``` 表示将标志设置为NV(无溢出,上升沿,允许中断,正数,无辅助进位,奇偶校验为奇)。 ### 2. 显示存储单元命令D **(1)显示内存某指定范围的内容** 格式: ``` -d 地址范围 ``` 例如: ``` -d 100 10F ``` 表示显示从地址100H到10FH的内容。 **(2)显示从上一个D命令结束后地址开始的内容** 格式: ``` -d ``` **(3)显示特定段的内容** 例如: ``` -d ds:100 ``` 表示显示数据段中从偏移地址100H开始的128个字节的内容。 ### 3. 修改存储单元命令E **(1)写入单字节数据** 格式: ``` -e 地址 数据列表 ``` 例如: ``` -e 100 41 42 43 ``` 表示从地址100H开始写入41H、42H、43H三个字节。 **(2)逐个修改存储单元** 格式: ``` -e 地址 ``` 例如: ``` -e 100 ``` 系统响应: ``` 100 41 _ ``` 此时可以输入新值或按空格跳过。例如输入: ``` 100 41.-42 43 44 ``` 表示在地址100H写入41H,地址101H写入42H,地址102H写入43H,地址103H写入44H。 ### 4. 检查和修改寄存器命令R **(1)显示和修改寄存器** 在DEBUG提示符下键入: ``` -r 寄存器名 ``` 例如: ``` -r ax ``` 系统显示AX当前值,等待输入新值。 **(2)显示和修改标志位** ``` -rf ``` 系统显示当前标志位状态,等待输入新值。 ### 5. 填充存储单元命令F 格式: ``` -f 地址范围 数据列表 ``` 例如: ``` -f 100 104 41 42 43 44 45 ``` 表示从地址100H到104H的5个字节分别写入41H到45H。 ### 6. 移动存储单元内容命令M 格式: ``` -m 源地址范围 目标地址 ``` 例如: ``` -m 100 10F 300 ``` 表示将地址100H到10FH的内容移动到300H开始的区域。 ### 7. 填充存储单元命令F 格式: ``` -f 地址范围 数据 ``` 例如: ``` -f 100 104 'ABC' ``` 表示从地址100H开始连续5个字节填入字符'A'、'B'、'C'、'A'、'B'。 ### 8. 十六进制算术运算命令H 格式: ``` -h 操作数1 操作数2 ``` 例如: ``` -h 10 8 ``` 系统显示:0018 0008 ### 9. 端口输入命令I 格式: ``` -i 端口地址 ``` 例如: ``` -i 3F8 ``` 表示从端口3F8H读取并显示一个字节。 ### 10. 端口输出命令O 格式: ``` -o 端口地址 数据 ``` 例如: ``` -o 3F8 4F ``` 表示向端口3F8H输出数据4FH。 ### 11. 执行程序命令G **(1)运行程序到指定地址** 格式: ``` -g =地址 [断点列表] ``` 例如: ``` -g =100 ``` 表示从地址100H开始执行程序。 **(2)设置断点运行** 格式: ``` -g =起始地址 断点1 断点2 ... ``` 例如: ``` -g =100 10A 120 ``` 表示从100H开始执行,在10AH和120H处设置断点。 ### 12. 跟踪命令T **(1)单条指令跟踪** 格式: ``` -t [=地址] ``` 例如: ``` -t ``` 从当前CS:IP指向的指令开始执行一条指令,显示执行后各寄存器的状态。 **(2)从指定地址开始跟踪** ``` -t =100 ``` 从CS:100H处开始单步执行。 ### 13. 汇编命令A 格式: ``` -a [地址] ``` 例如: ``` -a 100 ``` 表示从地址100H开始输入汇编指令,可以逐条输入,按回车结束输入。 ### 14. 反汇编命令U **(1)反汇编指定地址范围** 格式: ``` -u [地址范围] ``` 例如: ``` -u 100 10F ``` 表示将地址100H到10FH的内容反汇编。 **(2)反汇编指定地址开始的指令** 格式: ``` -u [地址] ``` 例如: ``` -u 100 ``` 从地址100H开始反汇编20H条指令。 ### 15. 显示内存单元命令D 格式: ``` -d [地址] ``` 例如: ``` -d 100 ``` 显示从偏移地址100H开始的128个字节。 ## 二、DEBUG命令详解 ### 1. 启动DEBUG 在DOS提示符下键入: ``` C:\>DEBUG [文件名] ``` 如果未指定文件名,DEBUG将所有寄存器初始化为0000,标志位初始化为NV UP DI PL NZ NA PO NC,CS、DS、ES指向同一段,IP=0000,SS指向可用空间的底部,SP指向段顶部。 ### 2. 退出DEBUG 在DEBUG提示符下键入: ``` -q ``` ### 3. 常用DEBUG命令一览 | 命令 | 功能 | |------|------| | R | 显示或修改寄存器内容 | | D | 显示内存单元内容 | | E | 修改内存单元内容 | | F | 填充内存单元 | | M | 移动内存块 | | H | 十六进制运算 | | I | 端口输入 | | O | 端口输出 | | G | 执行程序 | | T | 跟踪执行 | | A | 汇编指令 | | U | 反汇编 | | Q | 退出DEBUG | ## 三、使用DEBUG的实例 ### 例1:显示和修改寄存器 ``` C:\>DEBUG - r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0D3E ES=0D3E SS=0D3E CS=0D3E IP=0000 NV UP DI PL NZ NA PO NC - r ax AX 0000 :1234 - r AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0D3E ES=0D3E SS=0D3E CS=0D3E IP=0000 NV UP DI PL NZ NA PO NC ``` ### 例2:显示内存内容 ``` - d 100 10F 0D3E:0100 41 42 43 44 45 46 47 48-49 4A 4B 4C 4D 4E 4F 50 51 0D3E:0110 52 53 54 55 56 57 58 59-5A 5B 5C 5D 5E 5F 60 61 62 ``` ### 例3:修改内存内容 ``` - e 100 0D3E:0100 41.61 ``` 将地址100H的内容从41H修改为61H。 ### 例4:反汇编 ``` - u 100 10F 0D3E:0100 B86102 MOV AX,0261 0D3E:0103 8ED8 MOV DS,AX 0D3E:0105 8EC0 MOV ES,AX 0D3E:0107 BEC402 MOV SI,02C4 ``` ## 四、练习 1. 使用DEBUG的R命令查看和修改寄存器内容。 2. 使用DEBUG的D命令查看内存中的数据。 3. 使用DEBUG的E命令修改内存单元。 4. 使用DEBUG的A命令输入汇编指令并用U命令反汇编验证。 5. 使用DEBUG的T命令单步执行程序,观察程序执行过程。