# 实验一: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的各常用命令有了初步认识,为后续深入学习汇编语言和程序调试打下基础。