实 验 DEBUG程序的使用
一、 实验目的
1. 学习使用DEBUG程序的各种命令。
2. 利用DEBUG学习
3. 了解计算机取指令、执行指令的工作过程。
4. 掌握用DEBUG调试自编程序的方法。
二、 实验任务
1. 参照附录1,掌握DEBUG程序的各种命令,重点是命令R,D ,A,U,T,P,G命令的使用。
2. 用命令A汇编下列指令,判断指令正误并说明原因。
(1) ROR AX,8
(2) LEA DI,[AX]
(3) MOV DS,2010
(4) PUSH AL
(5) OUT 900,AL
(6) MOV [BX],0
3. 用命令查看8086/8088 CPU在开机后执行的第一条指令。
4. 用命令D查看DS:200~22F和F000:200~22F两内存块内容,用命令F将字符“A”分别填入这两个内存块,比较填入前后结果,了解可读写内存RAM和只读内存ROM的区别。
5. 用A命令汇编一条INT 1C指令,用命令T单步执行该指令,比较指令执行前后CS和IP、堆栈指针SP及堆栈内容变化情况,了解什么是中断向量表,中断向量和中断子程,掌握中断指令的执行过程。
6. 利用T,P,G命令,执行下列指令段,注意它们的不同之处。
(1) MOV DI,300
MOV SI,400
MOV CX,3
CLD
REP MOVSB
INT 3
(2) MOV AH,2
MOV DL,41
INT 21
INT 3
(3) 先在CS:200处汇编一条RET指令,再在CS:100处汇编。
MOV BX,200
CALL BX
INT 3
然后从MOV BX,200处开始执行。
7. 用命令A汇编下列程序段,并将程序写到硬盘上,然后调试程序段,观察程序段能否完成指定功能,若不能,说明原因,并修改程序。
(1) 完成将DS:2000开始的5个字节内存内容相加,并把相加的结果存放在DS2005内存单元中。
MOV CX,5
MOV AL,0
MOV BX,2000
nest: ADD AL,[BX]
INC BX
DEC CX
LOOP nest
MOV [BX],AL
INT 3
(2) 以双重循环来实现延时,然后再给AX赋值。
MOV AX,0
again1:MOV SI,3
again2:MOV DI,3
DEC DI
JNZ again2
DEC SI
JNZ again1
MOV AX,100
INT 3
8.进入DEBUG后,首先用命令R查看当前DS内容,记录此值,假设为X。
在DEBUG下汇编、调试完成下列功能的程序。
(1) 将内容F000:2000H起30H个字数据传送到内存X:1000H开始处。
(2) 测试内存X:300H开始的10H个字节数据,计算其中正数、负数、0的个数,并将结果分别存放在X:400H开始的三个内存单元中。
三、 实验说明
1. 关于任务1,参照附录1中的实例,了解DEBUG的各种命令。
2. 在DEBUG下,用户可对所有寄存器、RAM内存随意查看和修改,但由于对DOS操作系统在内存中存放情况不了解,可能会将存放有操作系统程序的内存内容破坏,从而可能引起系统运行异常,往往是出现死机现象,故建议使用DOS分配给用户的内存可用区,其低端地址是刚进入DEBUG时,用命令R查看到的CS:IP。涉及到修改内存的命令有A,E,F,M,L等。
3. 初学者在使用DEBUG命令修改内存或执行程序时,由于多种原因,出现死机是较经常的现象,可按RESET复位按钮,重新启动系统。
4. 用连续执行命令G执行程序时,注意给出执行的首地址,或查看当前CS和IP值是否为要执行程序段的首地址,并注意查看执行的指令流程中有无返回DEBUG功能的程序段,如指令INT 20T或断点设置INT3,否则发出命令后,很容易出现死机,原因是如无程序段使系统返回命令接受状态,CPU将不断到内存取指令、执行指令,使作户失去对系统的控制,出现死机。为避免这种情况,可在用户程序段的最后加上一条INT 20H指令,或用断点方式执行。避免出现死机。
5. 关于任务2,在命令A下汇编各条指令,对于错误的指令,DEBUG指令出其错误位置,对于正确的指令,将其汇编到相应内存,据此可判断指令正误,而具体原因需自己分析。
6. 关于任务3,8086/8088 CPU在开机后执行的第一条指令在内存FFFF:0H开始处。
7. 关于任务4,由于可读写内存RAM的内容可修改,而只读内存ROM的内容不能修改,故命令F未能将字符‘A’填入F000:200H~22FH的内存中,内存F000:200H~22FH的内容填写前后保持不变。
8. 关于任务5,中断指令INT N是指令系统中较复杂的一条指令,结合教材中对中断指令的介绍,利用DEBUG来学习,加强对中断指令执行过程、中断向量表、中断向量和中断子程序等内容的理解。
9. 关于任务6,用A命令汇编好后,用T,P,G命令分别执行,记录指令执行前后各寄存器(包括标志寄存器各标志位值)、堆栈指针及堆栈内容变化情况,以及与指令有关内存单元的内容,总结T和P执行某些指令的不同之处及适用场合。
10.关于任务7和8,为避免调试过程中出现死机,造成内存中的程序丢失,而重复多次输入程序,在用A命令将程序汇编到内存后,先用命令N和W将程序写到磁盘上,再进行调试运行。当调试过程中出现异常时,重新启动系统,用命令N和L将文件从磁盘装入内存,重新对程序进行调试运行。
11.DEBUG下不支持符号地址,如任务7中的标号next,again1,again2等,在命令A下输入程序时,不输入标号(如next:),在用到标号的指令(如LOOP,JNZ等),在其后直接输入要跳转的目的地址。
对向前跳转的指令,如汇编任务7,输入程序的过程如下:
-A ↙
1270:0100 MOV CX,5 ↙
1270:0103 MOV AL,0 ↙
1270:0105 MOV BX,2000 ↙
1270:0108 ADD AL,[BX] ↙
1270:010A INC BX ↙
1270:010B DEC CX
1270:010C LOOP 0108 ↙
1270:101E MOV [BX],AL ↙
1270:0110 INT 3
1270:0112 ↙
用目的地址0108代替标号next在LOOP指令中的位置,而在输入ADD AL,[BX]这条指令时,不输入标号next.
对向后跳转的指令,由于目的地址尚未确定,可先随意输入一个地址,若是条件转移指令,注意跳转范围应在-128~127之间,待程序输入完毕,目的地址明确后,再用命令A修改跳转指令。
如下程序段,功能是比较AX和CX中的两符号数,将较大的数放在AX和BX中,较小的数放在CX中。
CMP AX,CX
JX continue
XCHG AX,CX
continue: MOV BX,AX
用命令A输入程序的过程如下:
-A ↙
1270:0100 CMP AX,CX ↙
1270:0102 JG 0102 ↙ 输入本条指令的地址0102代替标号continue
1270:0104 XCHG AX,CX ↙
1270:0106 MOV BX,AX ↙
1270:0108 ↙
-A 102↙ 修改跳转指令的目的地址
1270:0102 JG 0106 ↙ 输入目的地址0106
1270:0104 ↙
-U 1270:0100 L 0 A ↙ 用命令U查看程序,跳转正确
1270:0100 39C8 CMP AX,CX
1270:0102 7F02 JG 0106
1270:0104 87C1 XCHG AX,CX
1270:0106 89C3 MOV BX,AX
12.执行任务7中的任务时,会发现执行的结晶与设计的结果不相符,但又无法从源程序段发现出错原因时,可用命令T跟踪执行程序,查看每条指令执行完后的结果是否与设想的一致,如发现有误,找出原因,然后修改程序,再跟踪执行,直到结果与设想相符,并能实现程序段功能.这个过程就是程序的调试过程。调试程序时,要有耐心。
13.将任务8中调试好的程序以文件形式存储在磁盘上。结束实验前,将实验结果演示给指导教师检查。
四、 问题思考
1. 假设某内存单元的内容为CCH,试问该内容如看作一条指令、看作无符号数、看作带符号数,那将分别表示什么?不查看教材中的指令系统代码,如何在DEBUG下知道CCH表示一条什么指令?
2. 在指令MOV[BX],AX中,操作数[BX]的寻址方式是什么?在DEBUG下执行完该指令后,如何查看执行结果?
3. 可否随意在DEBUG提示符“-”后不带参数发出命令G?什么情况下使用命令G时,可不用“=”给出执行的首地址?
4. 分析出现死机的几种情况。如何理解死机现象?试从计算机的工作原理进行解释。
五、 实验报告
1. 分析任务2中各条指令错误原因。
2. 记录CPU在开机后报告文学行的第一条指令。
3. 描述中断指令执行过程,记录1CH的中断子程。
4. 说明可读写内存RAM和只读内存ROM的区别。
5. 说明命令T和P的差别。
6. 指出任务6中程序段的出错原因,给出修改后的程序段。
7. 给出任务7中调试好的程序。
8. 回答问题思考。
9. 针对实验目的认真做小结。
评论
查看更多