实验目的:借助DEBUG程序发现汇编语言程序的错误并加以改正实验过程:一,在debug环境下建立和汇编程序(1)进入debugC:\debug回车(2)输入程序并汇编-A100回车0AF0:0100movdl,38回车0AF0:0102movah,2回车0AF0:0104int21h回车0AF0:0106int20h回车0AF0:0108回车(3)运行程序-g=1008Programterminatednormally如果想分析该程序的指令,可使用反汇编命令U(4)反汇编-u100,108回车0AF0:0100B238MOVDL,30AF0:0102B402MOVAH,00AF0:0104CD21INT210AF0:0106CD20INT200AF0:010856PUSHSI(5)将机器指令程序送到起始地址为200h的单元-e200b2,38,b4,02,cd,21,cd,20,56-g=2008Programterminatednormally-二,常用debug命令(1)显示,修改寄存器内容显示所有寄存器内容格式:-r回车功能:以十六进制形式显示cpu内部个寄存器的值;以符号形式显示标志寄存器的各标志位(除tf外)的值;并将CS:IP所指的内存内容反汇编成一条指令,可视为将要执行的指令。如:-r回车AX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0AF0ES=0AF0SS=0AF0CS=0AF0IP=0200NVUPEIPLNZNAPONC0AF0:0200B238MOVDL,38知:cs=0AF0h,IP=0100h修改寄存器格式:-r寄存器名回车-rdsDS0AF:0AE0-rds的内容由原来的0af0h修改为0ae0h修改标志值格式:-rf例:-rfNVUPEIPLNZNAPONC-ovng回车将of,sf的值分别修改为1。(2)汇编,反汇编指令汇编命令A格式:-A内存地址回车例:调用dos中02h号功能显示字符‘a’,将该程序汇编到1270:100h开始的内存中。-A1270:1001270:0100mov,ah,21270:0102mov,dl,611270:0104int211270:0106int201270:0108-反汇编命令U格式:-u内存块回车功能:分三列显示反汇编的结果,第一列为指令首地址,第二列为16进制形式的指令机器码,第三列为指令的助记符。-u1270:1001270:0100B402MOVAH,021270:0102B261MOVDL,611270:0104CD21INT211270:0106CD20INT201270:01080000ADD[BX+SI],AL1270:010A0000ADD[BX+SI],AL1270:010C0000ADD[BX+SI],AL1270:010E0000ADD[BX+SI],AL1270:01100000ADD[BX+SI],AL1270:01120000ADD[BX+SI],AL1270:01140000ADD[BX+SI],AL1270:01160000ADD[BX+SI],AL1270:01180000ADD[BX+SI],AL1270:011A0000ADD[BX+SI],AL1270:011C0000ADD[BX+SI],AL1270:011E0000ADD[BX+SI],AL-(3)执行程序1.单步执行格式:-t=内存地址回车格式:-p=内存地址回车功能:用命令中的内存地址的段地址和偏移地址修改cs和ip,然后执行由cs:ip指向的内存单元处的一条指令,显示各寄存器的值,并反汇编下一条指令,返回debug状态。例:-t=1270:100AX=0200BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=0AE0ES=0AF0SS=0AF0CS=1270IP=0102OVUPEINGNZNAPONC1270:0102B261MOVDL,61-执行结果:ah=2,cs值不变,ip的值增加2,cs:ip指向第二条指令2.多步执行格式:-t=内存地址执行指令的条数格式:-p=内存地址执行指令的条数命令t和p的不同:one:带重复前缀rep/repnz/repz的串操作指令和loop/loopz/loopn等循环指令是与cs相关的指令。用t命令执行这类指令时,每执行一次,cx值减一,就停下来返回debug;而p命令执行时,一直执行到cx=0,执行其后的下一条指令,才返回debugtwo:调用指令call及中断调用指令int,由于这类指令修改了cs和ip,使程序结构产生转向。用t命令则在cs:ip(子程序)入口处停下来返回debug,可用t命令进行跟踪。而用p命令则显示call和int的下一条指令如:分别用t和p执行1270:0140h处的指令int21h。-t=1270:104AX=0200BX=0000CX=0000DX=0000SP=FFE8BP=0000SI=0000DI=0000DS=0AE0ES=0AF0SS=0AF0CS=00A7IP=107COVUPDINGNZNAPONC00A7:107C90NOP-p=1270:104AX=0200BX=0000CX=0000DX=0000SP=FFE8BP=0000SI=0000DI=0000DS=0AE0ES=0AF0SS=0AF0CS=1270IP=0106OVUPDINGNZNAPONC1270:0106CD20INT203.连续执行-g=内存地址4.断点执行格式:-g=内存地址断点地址(4)显示,修改内存内容1.显示命令d格式:-d内存块例:显示-d1270:100h到1210内存块的内容-d1270:100l301270:0100B402B261CD21CD20-0000000000000000...a.!.........1270:01100000000000000000-0000000000000000................1270:01200000000000000000-0000000000000000................2.修改命令e格式1:-e内存地址字符或数值串格式2:-e内存地址3.填充指令格式:-f内存块字符或数值串例:-fds:20002100‘helloworld’4.搜索指令s格式:-s内存块字符或数值串5.移动指令m格式:-m内存块1内存块2的首地址功能:将内存块1的内容复制到内存块2,内存块1内容不变6.比较指令c格式:-c内存块1内存块2的首地址(5)读写磁盘1.指定文件命令N格式:-N[d:][PATH]文件名.扩展名回车功能:为命令L和命令W指定文件,其中[d:][PATH]为文件所在的盘号和路径。2.写入命令W格式:-W内存地址回车功能:将指定内存块的内容写到由命令N指定的文件中,其中内存块的首地址命令W指定,内存块的大小由BX,CX两寄存器决定,BX存放内存块大小的高字节,CX存放内存块大小的低字节。3.装入命令L块格式:-L内存地址回车功能:将命令N指定的文件装入到命令L给出的内存地址开始处。文件固定装入到CS:IP处。4.装入可执行的.EXE或.COM文件通常在调试可执行的.EXE或.COM文件时,可以不用N和L命令来装入,而直接在进入debug的命令后加上要装入的文件。格式:[d:][path]debug文件名.扩展名回车功能:将命令中指定的文件装入到内存CS:IP处例:把从1270:100h开始30h个字节的内存块内容写到D盘的根目录AA.DAT文件中-nI:aa.dat;用命令N指定文件名-rbx;修改BX的值BX0000:0;bx=0h,存放文件长度的高位值-rcxCX0010:30;cx=30h,存放文件长度的低位值-w1270:100;将指定的内存块写到aa.dat文件上。Writing00030bytes例:将I盘根目录下的aa.dat文件调到内存CS:100h开始处。-nI:aa.dat回车-lcs:100回车-ucs:100回车1270:0100B402MOVAH,021270:0102B261MOVDL,611270:0104CD21INT211270:0106CD20INT201270:01080000ADD[BX+SI],AL1270:010A0000ADD[BX+SI],AL1270:010C0000ADD[BX+SI],AL1270:010E0000ADD[BX+SI],AL1270:01100000ADD[BX+SI],AL1270:01120000ADD[BX+SI],AL1270:01140000ADD[BX+SI],AL1270:01160000ADD[BX+SI],AL1270:01180000ADD[BX+SI],AL1270:011A0000ADD[BX+SI],AL1270:011C0000ADD[BX+SI],AL1270:011E0000ADD[BX+SI],AL(6)I/O端口地址1.输入命令格式:-I端口地址回车功能:将指定端口的内容输入到AL寄存器,并显示该值。2.输出命令格式:-o端口地址数值回车功能:将命令中的数值输出到指定端口中(7)十六进制加减格式:-h数值1数值2(8)退出命令格式:-q实验体会:通过实验我掌握了调试程序如何使并对调试程序有了更深的了解。