DOS提示符下的debug

(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:\>

 

其实操作还是比较简单的,前面需要配合上我之前发的一个,然后直接下来就好了,要弄懂,亲需要点时间哦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值