405 lines
6.3 KiB
Markdown
405 lines
6.3 KiB
Markdown
# 附录二:调试程序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命令单步执行程序,观察程序执行过程。 |