(1) 在DOS提示符下,进入Debug程序。
(2) 详细记录每一步所用的命令,以及查看结果的方法和具体结果。
(3)现有一个双字加法源程序如下,其中存在错误。现假设已汇编、连结生成了可执行文件HB.EXE,存放在d:\MASM目录下。请使用Debug对其进行调试。
Code SEGMENT
ASSUME CS:code,DS:code
ORG 100H ;从100H处开始存放下列指令
Start:MOV AX,code ;将DS置成code段的首地址
MOV DS,AX
MOV SI,200H ;取第一个数的首地址
MOV AX,[SI] ;将第一个数的低16位取到AX
MOV DI,204H ;取第二个数的首地址
ADD AX,[DI] ;第一个数和第二个数的低16应相加
MOV [SI+8],AX ;低16位相加的结果送到208H和209H单元
MOV AX,[SI+2] ;取第一个数的高16位送到AX中
ADD AX,[DI+2] ;两个数的高16位相加
MOV [SI+0AH],AX ;高16位相加的结果送到20AH,20BH单元
MOV AX,4C00H ;使用DOS的4CH号功能调用
INT 21H ;进入功能调用,返回DOS
ORG 200H ;从200H处开始存放下列数据
DD 12345678h,654387A9h,0h ;被加数、加数、和
Code ENDS
END start
调试过程:
① 进入Debug并装入可执行文件HB.EXE
D:\MASM>Debug HB.EXE<Enter>
-
② 观察寄存器初始状态
-R <Enter>
AX=0000 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1892 ES=1892 SS=18A2 CS=18A2 IP=0100 NV UP EI PL NZ NA PO NC
18A2:0100 B8A218 MOV AX,18A2
注:(1)以上显示的寄存器值,可能和你的电脑显示的不一样。
(2)Debug中默认的进制是十六进制。
③ 以单步工作方式开始运行程序
首先用T命令顺序执行用户程序的前l两条指令,将段寄存器DS预置为用户的数据段。
-T <Enter>
AX=18A2 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1892 ES=1892 SS=18A2 CS=18A2 IP=0103 NV UP EI PL NZ NA PO NC
18A2:0103 8ED8 MOV DS,AX
-T <Enter>
AX=18A2 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=0105 NV UP EI PL NZ NA PO NC
18A2:0105 BE0002 MOV SI,0200
相当于运行了两行
④ 观察用户程序数据段初始内容
-D 200 20F <Enter>
18A2:0200 78 56 34 12 A9 87 43 65-00 00 00 00 00 74 13 50 xV4...Ce.....t.P
-
⑤ 连续工作方式运行程序至返回DOS前(设断点),查看运行结果。为此,现使用U命令反汇编。
-U 100 <Enter>
18A2:0100 B8A218 MOV AX,18A2
18A2:0103 8ED8 MOV DS,AX
18A2:0105 BE0002 MOV SI,0200
18A2:0108 8B04 MOV AX,[SI]
18A2:010A BF0402 MOV DI,0204
18A2:010D 0305 ADD AX,[DI]
18A2:010F 894408 MOV [SI+08],AX
18A2:0112 8B4402 MOV AX,[SI+02]
18A2:0115 034502 ADD AX,[DI+02]
18A2:0118 89440A MOV [SI+0A],AX
18A2:011B B8004C MOV AX,4C00
18A2:011E CD21 INT 21
-
可见,要执行10条指令,至011B处停止
-G=100,011B <Enter>
AX=7777 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204
DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=011B NV UP EI PL NZ NA PE NC
18A2:011B B8004C MOV AX,4C00
-D 200 20F <Enter>
18A2:0200 78 56 34 12 A9 87 43 65-21 DE 77 77 43 43 83 06 xV4...Ce!.wwCC..
-
和为7777DE21H,正确。
⑥ 再取一组数据,查看运行结果。为此,首先用E命令修改数据。
-E 200 CD,AB,78,56,90,EF,34,12 <Enter>
-D 200 20F <Enter>
18A2:0200 CD AB 78 56 90 EF 34 12-21 DE 77 77 43 43 83 06 ..xV..4.!.wwCC..
-G=100,11B <Enter>
AX=68AC BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204
DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=011B NV UP EI PL NZ NA PE NC
18A2:011B B8004C MOV AX,4C00
-D 200 20F <Enter>
18A2:0200 CD AB 78 56 90 EF 34 12-5D 9B AC 68 43 43 83 06 ..xV..4.]..hCC..
-
和为68AC9B5DH,错误。说明程序有问题。
⑦ 再将断点设在完成低位字加法后,查看运行结果。
-G=100,112 <Enter>
AX=9B5D BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204
DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=0112 NV UP EI NG NZ NA PO CY
18A2:0112 8B4402 MOV AX,[SI+02] DS:0202=5678
-D 200 20F <Enter>
18A2:0200 CD AB 78 56 90 EF 34 12-5D 9B AC 68 43 43 83 06 ..xV..4.]..hCC..
-
低位和为9B5D,正确。说明错误可能出在后面
⑧ 使用T命令从刚才的断点处向后单步调试,查看运行结果。
-T=112 <Enter>
AX=5678 BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204
DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=0115 NV UP EI NG NZ NA PO CY
18A2:0115 034502 ADD AX,[DI+02] DS:0206=1234
-T <Enter>
AX=68AC BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204
DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=0118 NV UP EI PL NZ NA PE NC
18A2:0118 89440A MOV [SI+0A],AX DS:020A=68AC
-
AX寄存器的结果为68AC,而应为68AD。可见是本条加法指令使用错误,这里应使用带进位加法指令。
⑨ 使用A命令装入正确指令后再次运行,察看结果。
-A 115 <Enter>
18A2:0115 ADC AX,[DI+02] <Enter>
18A2:0118 <Enter>
-G=100,11B <Enter>
AX=68AD BX=0000 CX=020C DX=0000 SP=0000 BP=0000 SI=0200 DI=0204
DS=18A2 ES=1892 SS=18A2 CS=18A2 IP=011B NV UP EI PL NZ NA PO NC
18A2:011B B8004C MOV AX,4C00
-D 200 20F <Enter>
18A2:0200 CD AB 78 56 90 EF 34 12-5D 9B AD 68 43 43 83 06 ..xV..4.]..hCC..
-
和为68AD9B5DH,正确。对于这样一个简单程序一般来说不会再有问题。退出后修改源程序即可。
⑩ 退出
-Q <Enter>
D:\>
其实操作还是比较简单的,前面需要配合上我之前发的一个,然后直接下来就好了,要弄懂,亲需要点时间哦