此命令将文件名格式化在CS:5CH的文件控制块内,以便使用L或W命令把文件装入内存进行调试或者存盘。
装入命令L,它有两种功能:
1)把磁盘上指定扇区的内容装入到内存指定地址起始的单元中,格式为: -L 地址 驱动器 扇区号 扇区数 2)装入指定文件,格式为: -L [地址]
此命令装入已在CS:5CH中格式化的文件控制块所指定的文件。 在用L命令前,BX和CX中应包含所读文件的字节数。 写命令W,有两种格式: 1)把数据写入磁盘的指定扇区: -W 地址 驱动器 扇区号 扇区数 2)把数据写入指定文件中: -W [地址] 此命令把指定内存区域中的数据写入由CS:5CH处的FCB所规定的文件中。在用W命令前,BX和CX中应包含要写入文件的字节数。
退出DEBUG命令Q,该命令格式为 Q 它退出DEBUG程序,返回DOS,但该命令本身并不把在内存中的文件存盘,如需存盘,应在执行Q命令前先执行写命令W。
三.操作步骤
1. 调用字处理程序建立源程序文件如图1-1所示。 DATA SEGMENT
STRING1 DB 'Move the cursor backward' STRING2 DB 'Move the cursor backward' MESS1 DB 'Match.',13,10,'$' MESS2 DB 'No Match.',13,10,'$' DATA ENDS
STACK SEGMENT STACK DB 40 DUP (?) STACK ENDS
PROGNAM SEGMENT
ASSUME CS:PROGNAM,DS:DATA,ES:DATA,SS:STACK MAIN PROC FAR START: XOR AX,AX PUSH AX PUSH DS MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX
4
LEA SI,STRING1 LEA DI,STRING2 CLD
MOV CX,25 REPZ CMPSB JZ MATCH LEA DX,MESS2 JMP SHORT DISP MATCH: LEA DX,MESS1 DISP: MOV AH,09h INT 21H RET MAIN ENDP PROGNAM ENDS
END START
图1-1
2.在DOS环境下,用汇编程序MASM对源文件汇编产生目标文件OBJ,命令格式如下: D:\\ASM\\MASM 源程序文件名.asm
如汇编程序指示出错则需要重新调用编辑程序修改错误,直至汇编通过为止。 3. 用连接程序link产生执行文件exe D:\\ASM\\LINK 源程序文件名.obj 4.执行程序
可直接从DOS执行程序如下: D:\\ASM\\源程序文件名 Match
此时可看到程序的运行结果。为了调试程序的另一部分,可重新进行编辑程序修改两个字符串的内容,使它们互不相同,如修改后的数据段为
DATA SEGMENT
STRINT1 DB ‘Move the cursor backward.’ STRINT2 DB ‘Move the cursor fordward.’ Mess1 DB ‘Match.’,13,10,’$’ Mess2 DB ‘No Match.’,13,10,’$’ DATA ENDS
然后,重新汇编、连接、执行,结果为: No match!
至此,程序已调试完毕,运行结果正确。 5.用DEBUG调试程序
另一种调试程序的方法是使用DEBUG程序。调用格式如下: D:\\asm\\DEBUG 源程序文件名.exe
此时,DEBUG已将执行程序装入内存,可直接用g命令运行程序。 -g Match.
5
为了调试程序的另一部分,可在DEBUG中修改字符串内容。可先用u命令显示程序,以便了解指令地址。显示结果如图1-2所示
-u
14F0:0000 1E PUSH DS 14F0:0001 33C0 XOR AX,AX 14F0:0003 50 PUSH AX
14F0:0004 B8E814 MOV AX,14E8 14F0:0007 8ED8 MOV DS,AX 14F0:0009 8EC0 MOV ES,AX 14F0:000B B8ED14 MOV AX,14ED 14F0:000E 8ED0 MOV SS,AX 14F0:0010 8D360000 LEA SI,[0000] 14F0:0014 8D3E1800 LEA DI,[0018] 14F0:0018 FC CLD
14F0:0019 B91900 MOV CX,0019 14F0:001C F3 REPZ 14F0:001D A6 CMPSB
14F0:001E 7406 JZ 0026 -u
14F0:0020 8D163900 LEA DX,[0039] 14F0:0024 EB04 JMP 002A
14F0:0026 8D163000 LEA DX,[0030] 14F0:002A B409 MOV AH,09 14F0:002C CD21 INT 21 14F0:002E CB RETF 图1-2
将断点设置在程序的主要部分运行以前,并查看数据区的内容。如图1-3所示。 -g0b
AX=14E8 BX=0000 CX=00AF DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000 DS=14E8 ES=14E8 SS=14E8 CS=14F0 IP=000B NV UP EI PL ZR NA PE NC 14F0:000B B8ED14 MOV AX,14ED -d0
14E8:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor 14E8:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th 14E8:0020 65 20 63 75 72 73 6F 72-20 62 61 63 6B 77 61 72 e cursor backwar 14E8:0030 64 2E 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 4D 61 d.Match...$No Ma 14E8:0040 74 63 68 2E 0D 0A 24 00-00 00 00 00 00 00 00 00 tch...$......... 14E8:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 图1-3
用e命令修改数据区的字符串,操作如下: -e29
14E8:0029 62.66 61.6f 63.72 6B.77 77.61 61.72 72.64
6
14E8:0030 64.2e 2E.20 再次用d命令查看修改结果。 -d0
14E8:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor 14E8:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th 14E8:0020 65 20 63 75 72 73 6F 72-20 66 6F 72 77 61 72 64 e cursor forward 14E8:0030 2E 20 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 4D 61 . Match...$No Ma 14E8:0040 74 63 68 2E 0D 0A 24 00-00 00 00 00 00 00 00 00 tch...$......... 14E8:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 图1-4 用g命令运行程序,结果为: -g
No Match....
用q命令退出debug. -q
至此,程序已调试完毕。为了进一步说明debug命令的使用方法,我们再次重复上述程序的调试过程,只是使用e、a、f来修改数据区的内容而已。必须注意,由于在用debug调试程序时,只能修改当时有关的内存单元内容,因此重新用debug装入执行程序时,仍是原来在磁盘文件中的内容。操作如下:
命令提示符:debug a1.exe -g0b
AX=14E8 BX=0000 CX=00AF DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000 DS=14E8 ES=14E8 SS=14E8 CS=14F0 IP=000B NV UP EI PL ZR NA PE NC 14F0:000B B8ED14 MOV AX,14ED -d0
14E8:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor 14E8:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th 14E8:0020 65 20 63 75 72 73 6F 72-20 62 61 63 6B 77 61 72 e cursor backwar 14E8:0030 64 2E 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 4D 61 d.Match...$No Ma 14E8:0040 74 63 68 2E 0D 0A 24 00-00 00 00 00 00 00 00 00 tch...$......... 14E8:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -e29 'forward.'20 -d0
14E8:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor 14E8:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th 14E8:0020 65 20 63 75 72 73 6F 72-20 66 6F 72 77 61 72 64 e cursor forward 14E8:0030 2E 20 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 4D 61 . Match...$No Ma 14E8:0040 74 63 68 2E 0D 0A 24 00-00 00 00 00 00 00 00 00 tch...$......... 14E8:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
7
14E8:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 图1-5
可见这种e命令方式避免使用ASCII码进入,对用户是比较方便的。其中最后一个20是空格争的ASCII码,以补足原来的字节数。
也可使用a命令把数据区恢复原状,具体如下: -d0
14E8:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor 14E8:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th 14E8:0020 65 20 63 75 72 73 6F 72-20 66 6F 72 77 61 72 64 e cursor forward 14E8:0030 2E 20 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 4D 61 . Match...$No Ma 14E8:0040 74 63 68 2E 0D 0A 24 00-00 00 00 00 00 00 00 00 tch...$......... 14E8:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ -a14e8:29
14E8:0029 db 'backward.' 14E8:0032 -d0
14E8:0000 4D 6F 76 65 20 74 68 65-20 63 75 72 73 6F 72 20 Move the cursor 14E8:0010 62 61 63 6B 77 61 72 64-2E 4D 6F 76 65 20 74 68 backward.Move th 14E8:0020 65 20 63 75 72 73 6F 72-20 62 61 63 6B 77 61 72 e cursor backwar 14E8:0030 64 2E 4D 61 74 63 68 2E-0D 0A 24 4E 6F 20 4D 61 d.Match...$No Ma 14E8:0040 74 63 68 2E 0D 0A 24 00-00 00 00 00 00 00 00 00 tch...$......... 14E8:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 14E8:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 图1-6
由于a是汇编命令,因此信息是用汇编格式进入的。如果修改的是程序中的语句,方法也是相同的,下面我们还会看到这类的操作。
为了进一步说明程序的调试过程,现假设程序编制错误:在源文件中把 jz match 改为 jnz match。该程序经过汇编、连接后,进入debug调试如下:
-g
No match!
结果是错误的(因为源文件中两个字符串是相同的)。为检查程序的错误,将断点设在比较串之前。
-g19
AX=14DF BX=0000 CX=0019 DX=0000 SP=FFFC BP=0000 SI=0000 DI=0019 DS=14DF ES=14DF SS=14DF CS=14E4 IP=0019 NV UP EI PL NZ NA PO NC 14E4:0019 A6 CMPSB
用t命令再执行一条指令以观察ZF标志的状况。 -t
AX=14DF BX=0000 CX=0019 DX=0000 SP=FFFC BP=0000 SI=0001 DI=001A DS=14DF ES=14DF SS=14DF CS=14E4 IP=001A NV UP EI PL ZR NA PE NC 14E4:001A 7506 JNZ 0022
8
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库微机实验作业(2)在线全文阅读。
相关推荐: