汇编语言调试程序DEBUG的练习一一、练习目的1、学习使用DEBUG程序的各种命令。
2、利用DEBUG学习8086指令系统。
二、练习任务1、参照说明,掌握DEBUG程序的各种命令,重点是命令R,D,A,U,T,P,G命令的使用。
用命令A汇编下列指令,判断指令正误并说明原因。
1).ROR AX,8;错误,因为ROR指令的源操作数只能是数字1或是CL。
2).LEA DI,[AX];错误,因为LEA指令的目的操作数不能是DI。
3).MOV DS,2010;错误,因为段寄存器和立即数不能在MOV指令间传。
4).PUSH AL;错误,因为PUSH指令的目的操作数只能是通用寄存器或是内存。
5).OUT 900,AL;错误,因为900已经超过了8位二进制数的范围。
6).MOV [BX],0;错误,因为内存和立即数之间的类型没有确定。
2、练习使用汇编命令1)利用加法指令求3+52)利用乘法指令求3*53)利用算术运算指令求3的补码4)学习使用逻辑运算指令。
求5和17相与、相或的结果。
5)学习数据传送指令三、设备PC机一台四、练习步骤1、实现3加5:2、实现3*5:3、实现求3的补码:4、实现5和17相与:5、传送指令(独立练习)1)用A命令在内存100H处键入下列内容:MOV AX,1234MOV BX,5678XCHG AX,BXMOV AH,35MOV AL,48MOV DX,75ABXCHG AX,DX2)用U命令检查键入的程序并记录,特别注意左边的机器码。
3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。
并注意标志位有无变化。
说明:下面所有操作均在DOS状态下进行。
DEBUG.EXE是DOS操作系统提供的一个调试汇编语言程序的工具程序。
其主要功能为:1.可动态调试汇编语言程序;2.可检查或修改CPU各寄存器、标志及内存单元的内容;3.可输入汇编指令到指定的内存;4.可把要调试的程序(通常以可执行文件形式存储在磁盘上)调入到内存中,控制CPU 按单步、设置断点等方式执行程序,检查程序运行过程中的中间结果,以便寻找程序出错的原因。
一、进入DEBUGC:\MASM>DEBUG二、常用DEBUG 命令1、DEBUG命令概述(1)特点A.除命令RF外,DEBUG命令本身均为单字符,后面跟一个或多个参数,有些命令不给参数也能运行,如下表[]中的参数,这种情况下用默认值作为参数;B.DEBUG下输入和显示的数均为十六进制数,故数字后不可加后缀H,O,B等,否则认为命令错;C.命令和参数不区分大小写;分类命令格式功能简介读写寄存器R 显示所有寄存器内容R 寄存器名显示和修改指定寄存器内容RF 显示和修改FR的内容汇编和反汇编A[内存地址] 从指定地址开始汇编指令U[内存块] 对指定内存块进行反汇编执行指令T[=内存地址][条数] 单步或多步执行指令P[=内存地址][条数] 单步或多步执行指令G[=内存地址] 连续执行指令G[=内存地址] 断点地址设断点执行程序读写内存D[内存块] 显示指定内存块内容E 内存地址字符或数值串修改指定内存内容F 内存块字符或数值串填充指定内存块S 内存块字符串或数值在指定内存块中查找串M 内存块1 内存块2的首地址复制内存块内容C内存块1 内存块2的首地址比较两个指定内存块退出DEBUG Q 退出DEBUG,返回DOSDEBUG主要命令一览表(2)常用参数含义A、内存地址内存地址表示一个内存区域的起始地址,由段地址和偏移地址两部分组成。
段地址可用一个1至4位的十六进制数表示,也可用某个段寄存器表示,偏移地址只能用1至4位的十六进制数表示。
段地址和偏移地址之间必须用冒号分隔。
例 300:800 表示300:800H的内存地址CS:100 表示以CS的内容为段地址,偏移地址为100H的内存地址B、内存块内存块表示一个内存区域,有两种表示方法:一种是用首地址和末地址表示,其中首地址用前面介绍的内存地址表示法,而末地址只用偏移地址表示,其段地址默认为首地址的段值,末地址的偏移地址应比首地址的偏移地址大。
另一种是用首地址和长度表示,其中长度由字符L引出。
内存块的最大值是64K。
命令D默认的长度为80H个字节,命令U默认的长度为20H个字节。
例下面两种表示法均表示DS:200H~DS:24FH的内存块DS:200 24FDS:200 L50例下面两种表示法均表示3000H:5100H~3000H:51FFH的内存块3000:5100 51FF3000:5100 L100C、字符串参数一般用单引号‘’给出例:-F DS:1000 ‘P lease Input:’D、数值参数为一个字节的十六进制数。
多个数值参数之间必须用分隔符分隔。
例:-E DS:2000 12 34 56 78 902、常用DEBUG命令介绍(1)显示、修改寄存器内容A、显示所有寄存器内容格式:-R功能:以十六进制形式显示CPU内部各寄存器的值;以符号形式显示标志寄存器各标志位(TF除外);并将CS:IP所指向的内存内容反汇编成一条指令,可视为将要执行的指令。
标志名称标志为1 标志为0 溢出标志(OF)(overflow flag) OV NV方向标志(DF)(direction flag) DN UP中断标志(IF)(interrupt flag) EI DI符号标志(SF)(sign flag) NG PL零标志(ZF)(zero flag) ZR NZ辅助标志(AF)(auxiliary carru flag) AC NA奇偶标志(PF)(parity flag) PE PO进位标志(CF)(carry flag) CY NC标志位的符号表示例进入DEBUG后,查看各寄存器的值,并记录当前CS和IP的值。
-RAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000SI=0000 DI=0000DS=1270 ES=1270 SS=1270 CS=1270 IP=0100 NV UP EI PL NZNA PO NC1270:0100 0409 ADD AL,09从显示可知,CS=1270H,IP=0100H由于所装的系统不同,可用内存会有所不同,应记录自己系统进入DEBUG后的CS和IP值。
B、修改寄存器格式:-R 寄存器名功能:DEBUG首先显示指定寄存器的当前值,并在下一行首给出提示符“:”,等待用户输入新值。
若直接回车相当于不修改寄存器的值。
例–R DS1270:12A3DS的内容由原来的1270H修改为12A3H。
(2)汇编、反汇编指令A、汇编命令A格式:-A 内存地址功能:先显示汇编的内存地址,等待用户输入一条助记符指令。
用户输入指令并回车后,DEBUG将把这条指令对应的机器码顺序存放在指定的内存单元中,并提示下一地址,等待用户继续输入下一条指令。
若直接回车,则退出A命令。
若输入指令有误,则显示出错信息,仍然提示当前的汇编地址,用户可重新输入指令。
-A 1270:1001270:0100 MOV AH,21270:0102 MOV DL,’a’error1270:0102 MOV DL,611270:0104 INT 211270:0106 INT 201270:0108B、反汇编指令U格式1:-U 内存地址格式2:-U 内存块功能:格式1从指定地址处开始将20H个字节的目标代码转换成汇编指令形式,缺省内存地址时,从当前地址CS:IP开始。
格式2将指定范围的内存单元中的目标代码转换成汇编指令。
例反汇编从1270:100开始长度为20H个字节的内存单元内容。
-U 1270:1001270:0100 B402 MOV AH,021270:0102 B261 MOV DL,61…(3)显示、修改内存内容A、显示命令D格式1:D 内存地址格式2:D 内存块功能:格式1从起始地址开始按十六进制显示80H个单元的内容,每行16个单元,共8行,每行右边显示16个单元的ASCII码,不可显示的ASCII码则显示“·”。
格式2显示指定范围内的存储单元的内容。
若地址缺省,则按格式1显示。
例如-D 200;表示从DS:0200H开始显示128个单元内容-D 100 120;表示显示DS:1000~DS:0120单元的内容例:-D 12AF:100 L3012AF:0100 41 42 43 44 45 00………ABCDE.W….12AF:011012AF:0120B、修改命令E格式1:-E 内存地址字符或数值串格式2:-E 内存地址功能:对于格式1,用命令中的字符串或数字修改指定的内存单元。
对于格式2,先给出命令中指定内存单元的内容,并给出提示符“·”,可在其后输入要修改的值,若直接按空格则不修改该单元内容,而接着提示下一单元的内容,若直接回车表示结束E命令。
例用字符串‘HELLO‘对应的ASCII码修改从DS:1000H开始的5个内存单元。
-E DS:1000 ‘HELLO‘例用数值12H,34H,56H,78H,90H,FAH 修改从12FA:100H开始的6个单元。
-E 12FA:10012FA:0100 41.12 42.34 43.56 44.78 45.90 00.FA 57C、填充命令F格式:-F 内存块字符或数值串功能:用命令中指定的字符或数值串填入指定的内存块,当指定的字符或数值串的总字节数小于指定的内存块,则在指定的内存块重复输入。
例将字符串‘H ELLO WORLD’填入DS:2000至2100H的内存块中:-F DS:2000 2100 ‘HELLO WORLD’D、搜索命令S格式:-S 内存块字符或数据串功能:在指定的内存块内搜索指定的字符或数据串,如找到则显示字符或数据串在内存中的首地址。
例:在DS:2000H开始,大小为20H的内存块中查找字符串‘HELLO WORLD’-S DS:2000 L20 ‘HELLO WORLD’12A3:200012A3:200CE、复制命令M格式:-M 内存块1 内存块2的首地址功能:将内存块1的内容复制到内存块2,内存块1的内容不变。
例将2000:100H开始,大小为20H的内存块复制到DS:200H-M 2000:100 L20 DS:200F、比较命令C格式:-C内存块1 内存块2的首地址功能:顺序比较两内存块各单元的内容,如两个内存块内容相同,则不显示任何信息,直接返回DEBUG状态;如有不同,则将各自的地址和内容显示出来。
例比较DS:200H和2000H:100H开始,大小为20H的两内存块。
-C DS:200 L20 2000:100(5)执行程序A、单步执行格式:-T=内存地址-P=内存地址功能:用命令中内存地址的段地址和偏移地址修改CS和IP,然后执行由CS:IP指向的内存单元处的一条指令,显示各寄存器的值,并反汇编下一条指令,返回DEBUG状态。