Files
Operating-System/Experiment/asm-exp/实验一/实验一_实验报告.md
2026-06-25 00:09:09 +08:00

419 lines
9.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 实验一DEBUG基础
## 一、实验名称
DEBUG基础
## 二、实验目的
1. 掌握DEBUG程序的加载方法
2. 熟悉DEBUG状态下各种常用命令的使用方法
3. 学会使用DEBUG命令进行程序调试
## 三、实验内容
### 3.1 基础性实验DEBUG常用命令练习
#### 1DEBUG的加载
DEBUG是为DOS提供的一种调试工具它不能独立运行需要在DOS环境下加载运行。
加载方法在DOS命令提示符下键入
```
C:\>DEBUG [程序文件名]
```
#### 2DEBUG常用命令练习
**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处应为08H05H+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的各常用命令有了初步认识为后续深入学习汇编语言和程序调试打下基础。