419 lines
9.0 KiB
Markdown
419 lines
9.0 KiB
Markdown
# 实验一:DEBUG基础
|
||
|
||
## 一、实验名称
|
||
|
||
DEBUG基础
|
||
|
||
## 二、实验目的
|
||
|
||
1. 掌握DEBUG程序的加载方法
|
||
2. 熟悉DEBUG状态下各种常用命令的使用方法
|
||
3. 学会使用DEBUG命令进行程序调试
|
||
|
||
## 三、实验内容
|
||
|
||
### 3.1 基础性实验:DEBUG常用命令练习
|
||
|
||
#### (1)DEBUG的加载
|
||
|
||
DEBUG是为DOS提供的一种调试工具,它不能独立运行,需要在DOS环境下加载运行。
|
||
|
||
加载方法:在DOS命令提示符下键入:
|
||
|
||
```
|
||
C:\>DEBUG [程序文件名]
|
||
```
|
||
|
||
#### (2)DEBUG常用命令练习
|
||
|
||
**D命令(显示内存)**
|
||
|
||
格式:`D [地址]` 或 `D [范围]`
|
||
|
||
功能:显示指定地址的内存内容
|
||
|
||
示例:
|
||
```
|
||
D 100 ;显示CS:100开始的内存内容
|
||
D 100 120 ;显示CS:100到CS:120范围的内容
|
||
```
|
||
|
||
**E命令(修改内存)**
|
||
|
||
格式:`E 地址 [数据表]`
|
||
|
||
功能:修改指定地址的内存内容
|
||
|
||
示例:
|
||
```
|
||
E 100 ;逐个修改CS:100开始的内存内容
|
||
E 100 'ABCD' ;从CS:100开始写入字符串ABCD
|
||
```
|
||
|
||
**F命令(填充内存)**
|
||
|
||
格式:`F 范围 数据表`
|
||
|
||
功能:将数据填充到指定范围的内存
|
||
|
||
示例:
|
||
```
|
||
F 100 110 0 ;将100-110区域填充0
|
||
```
|
||
|
||
**R命令(显示/修改寄存器)**
|
||
|
||
格式:`R [寄存器名]`
|
||
|
||
功能:显示或修改寄存器的内容
|
||
|
||
示例:
|
||
```
|
||
R ;显示所有寄存器内容
|
||
R AX ;显示并修改AX内容
|
||
```
|
||
|
||
**G命令(执行程序)**
|
||
|
||
格式:`G [=起始地址] [断点地址]`
|
||
|
||
功能:运行程序,可设置断点
|
||
|
||
示例:
|
||
```
|
||
G=100 ;从CS:100开始执行
|
||
G=100 10A ;从100开始执行,在10A处设置断点
|
||
```
|
||
|
||
**A命令(汇编命令)**
|
||
|
||
格式:`A [地址]`
|
||
|
||
功能:在指定地址开始汇编输入指令
|
||
|
||
示例:
|
||
```
|
||
A 100 ;从CS:100开始输入汇编指令
|
||
```
|
||
|
||
**T命令(跟踪执行)**
|
||
|
||
格式:`T [=地址] [条数]`
|
||
|
||
功能:单步执行指令
|
||
|
||
示例:
|
||
```
|
||
T ;执行一条指令
|
||
T=100 5 ;从100开始执行5条指令
|
||
```
|
||
|
||
**U命令(反汇编)**
|
||
|
||
格式:`U [地址]` 或 `U [范围]`
|
||
|
||
功能:将机器码反汇编为汇编语言
|
||
|
||
示例:
|
||
```
|
||
U 100 ;从100开始反汇编
|
||
U 100 120 ;反汇编100-120范围
|
||
```
|
||
|
||
**N命令(命名命令)**
|
||
|
||
格式:`N 文件名`
|
||
|
||
功能:给要操作的文件命名
|
||
|
||
示例:
|
||
```
|
||
N FILE.COM ;将FILE.COM作为要操作的文件名
|
||
```
|
||
|
||
**L命令(装入内存)**
|
||
|
||
格式:`L [地址 [驱动器 扇区号 扇区数]]`
|
||
|
||
功能:将文件或扇区内容装入内存
|
||
|
||
示例:
|
||
```
|
||
L ;将已命名文件装入CS:100
|
||
L 100 1 10 5 ;将A盘5个扇区装入CS:100
|
||
```
|
||
|
||
**W命令(写盘命令)**
|
||
|
||
格式:`W [地址 [驱动器 扇区号 扇区数]]`
|
||
|
||
功能:将内存内容写入磁盘
|
||
|
||
示例:
|
||
```
|
||
W ;将CS:100开始的内容写入文件
|
||
W 100 1 10 5 ;将CS:100内容写入A盘
|
||
```
|
||
|
||
**Q命令(退出DEBUG)**
|
||
|
||
格式:`Q`
|
||
|
||
功能:退出DEBUG,返回DOS
|
||
|
||
示例:
|
||
```
|
||
Q ;退出DEBUG
|
||
```
|
||
|
||
### 3.2 加强性实验:DEBUG命令综合练习
|
||
|
||
**【程序要求】**
|
||
|
||
利用DEBUG的A命令,在内存2000:0000处输入以下程序:
|
||
|
||
```
|
||
MOV AL, [0000]
|
||
MOV BL, [0001]
|
||
ADD AL, BL
|
||
MOV [0002], AL
|
||
INT 20
|
||
```
|
||
|
||
**【程序说明】**
|
||
|
||
| 指令 | 功能 |
|
||
|------|------|
|
||
| MOV AL, [0000] | 将内存地址2000:0000处的字节数据传送到AL寄存器 |
|
||
| MOV BL, [0001] | 将内存地址2000:0001处的字节数据传送到BL寄存器 |
|
||
| ADD AL, BL | 将AL和BL的内容相加,结果存入AL |
|
||
| MOV [0002], AL | 将AL的内容传送到内存地址2000:0002 |
|
||
| INT 20 | 终止程序运行,返回DOS |
|
||
|
||
## 四、实验步骤
|
||
|
||
### 4.1 基础性实验步骤
|
||
|
||
1. 在DOS环境下加载DEBUG程序
|
||
```
|
||
C:\>DEBUG
|
||
-
|
||
```
|
||
|
||
2. 使用R命令查看当前寄存器状态
|
||
```
|
||
-r
|
||
```
|
||
|
||
3. 使用D命令查看内存内容
|
||
```
|
||
-d 100
|
||
```
|
||
|
||
4. 使用E命令修改内存数据
|
||
```
|
||
-e 100 41 42 43 44
|
||
```
|
||
|
||
5. 使用A命令输入汇编指令
|
||
```
|
||
-a 2000:0000
|
||
```
|
||
|
||
6. 使用T命令单步执行程序
|
||
```
|
||
-t
|
||
```
|
||
|
||
7. 使用G命令运行程序
|
||
```
|
||
-g=2000:0000
|
||
```
|
||
|
||
8. 使用U命令查看反汇编结果
|
||
```
|
||
-u 2000:0000
|
||
```
|
||
|
||
9. 使用Q命令退出DEBUG
|
||
```
|
||
-q
|
||
```
|
||
|
||
### 4.2 加强性实验步骤
|
||
|
||
1. 进入DEBUG环境
|
||
|
||
2. 设置段寄存器DS指向2000H
|
||
```
|
||
-r ds
|
||
DS 0000
|
||
:2000
|
||
```
|
||
|
||
3. 使用E命令在2000:0000和2000:0001处写入两个数
|
||
```
|
||
-e 2000:0000
|
||
2000:0000 00.05
|
||
2000:0001 00.03
|
||
```
|
||
|
||
4. 使用A命令在2000:0000处输入程序
|
||
```
|
||
-a 2000:0000
|
||
2000:0000 MOV AL, [0000]
|
||
2000:0003 MOV BL, [0001]
|
||
2000:0006 ADD AL, BL
|
||
2000:0008 MOV [0002], AL
|
||
2000:000B INT 20
|
||
2000:000D
|
||
```
|
||
|
||
5. 使用U命令验证输入的程序
|
||
```
|
||
-u 2000:0000
|
||
```
|
||
|
||
6. 使用T命令单步执行程序,观察各寄存器的变化
|
||
|
||
7. 使用D命令查看程序执行后的内存结果
|
||
```
|
||
-d 2000:0000 2000:0002
|
||
```
|
||
|
||
8. 程序执行完成后,使用Q命令退出DEBUG
|
||
|
||
## 五、程序代码
|
||
|
||
### 5.1 基础性实验程序代码
|
||
|
||
基础性实验主要练习DEBUG的各个命令,不需要编写独立的程序代码。
|
||
|
||
### 5.2 加强性实验程序代码(汇编源程序)
|
||
|
||
```assembly
|
||
; 实验一加强性实验程序
|
||
; 程序功能:将内存2000:0000和2000:0001处的两个字节相加,结果存入2000:0002
|
||
; 在DEBUG中使用A命令输入以下代码
|
||
|
||
CODE SEGMENT
|
||
ASSUME CS:CODE
|
||
ORG 2000H ; 指定程序装入地址
|
||
|
||
START:
|
||
MOV AX, 2000H ; 设置数据段地址
|
||
MOV DS, AX ; 将2000H传送到DS段寄存器
|
||
MOV AL, [0000] ; 将DS:0000处的字节传送到AL
|
||
MOV BL, [0001] ; 将DS:0001处的字节传送到BL
|
||
ADD AL, BL ; AL = AL + BL
|
||
MOV [0002], AL ; 将AL的内容传送到DS:0002
|
||
INT 20 ; 退出程序,返回DOS
|
||
|
||
CODE ENDS
|
||
END START
|
||
```
|
||
|
||
### 5.3 DEBUG中直接输入的机器码
|
||
|
||
```
|
||
2000:0000 A0 00 00 MOV AL, [0000]
|
||
2000:0003 8A 1E 01 00 MOV BL, [0001]
|
||
2000:0007 00 D8 ADD AL, BL
|
||
2000:0009 A2 02 00 MOV [0002], AL
|
||
2000:000C CD 20 INT 20
|
||
```
|
||
|
||
## 六、实验结果
|
||
|
||
### 6.1 基础性实验结果
|
||
|
||
【此处需要截图:运行DEBUG程序,展示各命令的使用效果】
|
||
|
||
截图应包含:
|
||
- DEBUG启动界面
|
||
- R命令显示寄存器内容
|
||
- D命令显示内存内容
|
||
- E命令修改内存数据
|
||
- A命令输入汇编指令
|
||
- U命令反汇编结果
|
||
- T命令单步执行效果
|
||
- Q命令退出DEBUG
|
||
|
||
### 6.2 加强性实验结果
|
||
|
||
【此处需要截图:展示加强性实验的程序执行过程】
|
||
|
||
截图应包含:
|
||
- 使用E命令设置初始数据(2000:0000=05H, 2000:0001=03H)
|
||
- 使用A命令输入程序
|
||
- 使用U命令反汇编验证程序
|
||
- 使用T命令单步执行,观察AL、BL的变化
|
||
- 程序执行后D命令显示内存2000:0000-2000:0002的内容
|
||
- 预期结果:2000:0002处应为08H(05H+03H=08H)
|
||
|
||
### 6.3 实验数据记录表
|
||
|
||
| 地址 | 初始值 | 操作后值 |
|
||
|------|--------|----------|
|
||
| 2000:0000 | 05H | 05H |
|
||
| 2000:0001 | 03H | 03H |
|
||
| 2000:0002 | 00H | 08H |
|
||
|
||
## 七、思考题答案
|
||
|
||
### 7.1 思考题一:在DEBUG中如何正确使用段寄存器作为地址前缀?
|
||
|
||
**答:** 在DEBUG中,当使用其他段寄存器作为地址前缀时,需要在指令中显式指明段寄存器。格式为"段寄存器:偏移地址"。
|
||
|
||
例如:
|
||
```
|
||
MOV AL, DS:[0000] ; 使用DS段寄存器访问内存
|
||
MOV BL, ES:[0001] ; 使用ES段寄存器访问内存
|
||
MOV [CS:1000], AL ; 使用CS段寄存器访问内存
|
||
```
|
||
|
||
如果未指明段寄存器,DEBUG会使用默认的段寄存器:
|
||
- 对于数据访问,默认使用DS段寄存器
|
||
- 对于堆栈操作,默认使用SS段寄存器
|
||
- 对于代码获取,默认使用CS段寄存器
|
||
|
||
### 7.2 思考题二:如何使用D命令查看程序执行后的内存结果?
|
||
|
||
**答:** 使用D命令可以查看指定地址范围的内存内容。
|
||
|
||
查看程序执行后的内存结果方法:
|
||
|
||
1. 首先确定要查看的内存地址和范围
|
||
```
|
||
-d 2000:0000 2000:0002
|
||
```
|
||
这将显示从2000:0000到2000:0002地址范围的内存内容
|
||
|
||
2. 如果不指定结束地址,D命令默认显示128个字节
|
||
```
|
||
-d 2000:0000
|
||
```
|
||
|
||
3. 连续使用D命令时,会接着显示下一个地址范围
|
||
```
|
||
-d
|
||
```
|
||
|
||
实验中的程序将结果存入2000:0002,执行完后使用`D 2000:0000 2000:0002`命令可以查看:
|
||
- 2000:0000处的原始数据(如05H)
|
||
- 2000:0001处的原始数据(如03H)
|
||
- 2000:0002处的结果(如08H,即05H+03H)
|
||
|
||
## 八、实验心得
|
||
|
||
1. DEBUG是一个功能强大的调试工具,熟练掌握各命令的使用对于汇编语言程序开发至关重要。
|
||
|
||
2. 通过R命令可以随时观察寄存器的状态,D命令可以查看内存数据,这对于跟踪程序执行过程非常有帮助。
|
||
|
||
3. A命令允许直接输入汇编指令,非常适合编写和测试小程序。
|
||
|
||
4. T命令是单步执行命令,可以逐条观察程序执行过程中各寄存器和内存的变化,是调试程序的重要手段。
|
||
|
||
5. 在使用其他段寄存器访问内存时,必须显式指明段寄存器前缀,否则会使用默认段寄存器导致错误。
|
||
|
||
6. 通过本次实验,对DEBUG的各常用命令有了初步认识,为后续深入学习汇编语言和程序调试打下基础。 |