您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 软件工程 > 王爽汇编语言答案汇集
实验一debug的使用(1)答:仅举第一行:机器码汇编指令b8204emovax,4e20h答:1)进入debug,在写入机器码和汇编指令之前,先用r命令查看cpu中各个寄存器(可能回发生变化的寄存器)的情况如下AX=0000CS=13c3IP=01002)用E命令写入机器码,格式如:E13c3:0100b8204e或用A命令写入汇编指令,格式如:A13c3:0100movax,4e20[注:这里不能用movax,4e20h;debug中默认数据为十六进制]3)用t命令单步运行,之后可以看到变化:AX=4E20IP=0103[注:由此可见我们可以用debug中的t命令单步跟踪程序,通过观察其中各个寄存器的变化而发现程序中可能存在的逻辑错误](2)答:进入debug后,首先把这三行指令按如下格式在debug中输入:a2000:02000:0000movax,12000:0003addax,ax2000:0005jmp2000:0003然后修改其中cs:ip,使之指向我们程序(代码段)的入口2000:0000,这里可以用r命令实现,具体实现如下:rcsCS13c3:2000ripIP0100:0000之后可以通过控制jmp2000:0003的执行次数实现求2的8次方,具体可以让jmp2000:0003执行8次。[实际上,这这里是死循环,只是在debug中可以通过逐条执行的机制控制程序的随时终止;在后面我们可以通过寄存器cx和loop指令对循环进行控制,具体见第五章](3)答:这里直接用d命令进行查看,具体格式:dFFFF:0000之后可以在屏幕右侧看,类似08/06/04之类的时间信息即为生产日期,可以用a命令试图修改,并用d命令查看修改是否成功,实际上是不能修改的,因为ROM是只读存储器,不能直接修改。(4)答:输入书中给出的程序后,可以在屏幕上看到不同色彩的奇怪字符,原因是这样子的:b800:0000开始的一段内存空间是8086pc机显存地址空间,往其中填写不同的数据时,可以对在屏幕上显示不同的内容,具体见175页的实验9“根据材料编程”,里面介绍了一些屏幕操作的知识。debug指令详解一、DEBUG概述DEBUG是在DOS状态下面供程序员使用的程序调试工具。它可以用来检查内存中任何地址中的内容以及修改特定地址中的内容。DEBUG还可以用于逐指令执行某个程序,追踪程序的执行过程,比较一条指令执行前后数值变化情况,读写文件与磁盘扇区。此外,DEBUG还可以用于读写端口中的数值。在DEBUG状态下,所有数据都作为字节序列,可以用DEBUG把任何类型的文件读入内存中。DEBUG能够处理的数据为两种:十六进制数和ASCⅡ码,使用两位数表示十六进制数据(0~9,A~F)。在DEBUG中涉及内存中的数据时,要指定数据所在的内存单元的地址,地址的输入格式是:[段地址]:[位移]。如果没有输入地址,DEBUG将假定为当前内存段,从位于地址100H的字节开始。前100H字节保留给程序段前缀使用(称PSP结构,包含程序执行的各种信息),该区域用于建立DOS与程序之间的联系。在DEBUG中,使用四位十六进制数表示地址(0~9,A~F)。DEBUG输入数据时有两种方法:提示方法和非提示方法。在提示方法下,输入要求输入数据的命令,后跟保存数据的地址。执行后可以看到该地址中已有的内容及一个冒号提示符。此时可以在提示符下输入一个新的值或者按下回车键或CTRL+C回到“—”提示符。在非提示方法下,输入保持数据的内存地址以及要输入的数据。DEBUG的启动:进入DOS状态下,键入DEBUG,按ENTER键,如:C:\DEBUG,则屏幕显示:-符号“-”是进入DEBUG的提示符,在该提示符下可键入任意DEBUG命令。DEBUG的退出:在DEBUG的提示符后输入Q命令,按ENTER键,则退出DEBUG返回DOS。DEBUG的使用:在DEBUG的提示符后输入DEBUG命令,按ENTER键。二、DEBUG命令详解★A命令格式:A[地址]功能:将指令直接汇编成机器码输入到内存中。参数说明:[地址]指定存放键入汇编语言指令的内存单元的位置。★C命令格式:C[源地址范围][目的地址]功能:比较两内存区域中的内容是否相同。若不同则按字节显示其地址和内容,若相同则不显示任何内容。参数说明:[源地址范围]指定要比较的内存第一个区域的起始和结束地址,或起始地址和长度。[目的地址]指定要比较的第二个内存区域的起始地址。★D命令格式:D[地址]或D[起始地址][目的地址]功能:以内存映象方式显示内存中的数据。参数说明:指定要显示内容的内存单元的起始地址和结束地址,或起始地址和长度。如果不指定[地址],Debug将从以前d命令中所指定的地址范围的末尾开始显示128个字节的内容;第一次从DS:100处开始显示。★E命令格式:E[地址][字节串]或E[地址]功能:从指定的地址开始修改内存值。参数说明:[地址]指定存放[字节串]第一个内存的位置,[字节串]是要放入内存单元中的数据。★F命令格式:F[地址范围][字节或字节串]功能:将要填写的字节或字节串填入由地址范围指定的存储器中。参数说明:[地址范围]指定要填充内存区域的起始和结束地址,或起始地址和长度。[字节或字节串]指定要输入的数据,可以由十六进制数或引号包括起来的字符串组成。★G命令格式:G[=起始地址][[断点]„„]功能:执行正在调试的程序,当达到断点时停止执行,并且显示寄存器标志和下一条要执行的命令。参数说明:[=起始地址]指定当前在内存中要开始执行的指令所在的内存单元的地址。如果不指定[=起始地址],DEBUG将从CS:IP寄存器中的当前地址开始执行程序。[[断点]„„]指定可以设置为g命令的部分的1到10个临时断点。★H命令格式:H[数值][数值]功能:分别显示两个十六进制数相加的和以及第一个数减去第二个数的差。参数说明:[数值]表示从0到FFFFh范围内的任何十六进制数字。★I命令格式:I[端口地址]功能:从指定的端口输入并显示(用十六进制)指定端口中的数据(字节)。参数说明:[端口地址]指定要读取数据的端口地址。★L命令格式:L[地址][盘号:][逻辑扇区号][扇区数]功能:将一个文件或盘的绝对扇区装入存储器。参数说明:[地址]指定要在其中加载文件或扇区内容的内存空间的起始位置。[盘号:]指定包含读取指定扇区的磁盘的驱动器。该值是数值型,表示为:0=A,1=B,2=C,„„等。[逻辑扇区号]指定要加载其内容的第一个扇区的十六进制数。[扇区数]指定要加载其内容的连续扇区的十六进制数。★M命令格式:M[地址范围][起始地址]功能:把地址范围内的存储器单元的内容移到起始地址的指定地址中参数说明:[地址范围]指定要复制内容的内存区域的起始和结束地址,或起始地址和长度。[起始地址]指定要将range内容复制到该位置的起始地址。★N命令格式:N[盘号:][路径][文件名][扩展名]功能:定义DEBUG使用的文件。参数说明:[盘号:][路径][文件名][扩展名]指定文件所在的盘符,路径,文件名和扩展名。★O命令格式:O[端口地址][数据]功能:发送数据(字节)到指定的输出端口。参数说明:[端口地址]指定要写入数据的端口地址,[数据]指定要向[端口地址]中写入的字节值。★P命令格式:P[=地址][数据]功能:执行一个子程序调用指令,循环指令,中断指令或一个重复字符串指令,停止在下一条指令上。参数说明:[=地址]指定第一条要执行指令的位置。如果不指定地址,则默认地址是在CS:IP寄存器中指定的当前地址,[数据]指定在将控制返回给Debug之前要执行的指令数,默认值为1。★Q命令格式:Q功能:退出DEBUG返回DOS。参数说明:无参数。★R命令格式:R[寄存器]功能:1.显示单个寄存器的内容,并提供修改功能。2.显示所有寄存器内容,再加上字母标志位状态以及要执行的下一条指令。3.显示8个标志位状态,并提供修改功能。参数说明:[寄存器]指定要显示其内容的寄存器名。★S命令格式:S[地址范围][字符串]功能:在指定的地址范围内查找给定的字符串。参数说明:[地址范围]指定要搜索范围的开始和结束地址。[字符串]指定要搜索的字节值或字符串。字符串应包括在引号中。★T命令格式:T[=地址][指令条数]功能:逐条跟踪程序的执行,每条指令执行后都将显示各寄存器的内容。参数说明:[=地址]指定第一条要执行指令的位置。如果不指定地址,则默认地址是在CS:IP寄存器中指定的当前地址,[指令条数]指定在将控制返回给Debug之前要执行的指令数,默认值为1。★U命令格式:U[起始地址]或者[地址范围]功能:将内存中的内容转换为汇编语句。参数说明:[起始地址]或者[地址范围]指定要反汇编代码的起始地址和结束地址,或起始地址和长度。★W命令格式:W[地址][盘符:][起始扇区][扇区数]功能:将内存中的数据写入磁盘中。参数说明:[地址]指定要写到磁盘文件的文件或部分文件的起始内存地址。如果不指定address,Debug程序将从CS:100开始。[盘符:]指定包含目标盘的驱动器。该值是数值型:0=A,1=B,2=C,等等。[起始扇区]指定要写入第一个扇区的十六进制数。[扇区数]指定要写入的扇区数。★XA命令格式:XA[页面数]功能:分配扩展内存的指定页面数参数说明:[页面数]指定要分配的扩展内存的16KB页数。★XD命令格式:XD[释放的句柄]功能:释放指向扩展内存的句柄。参数说明:[释放的句柄]指定要释放的句柄。★XM命令格式:XM[要映射扩展内存的逻辑页面号][映射到的物理页面号][句柄]功能:将属于指定句柄的扩展内存逻辑页映射到扩展内存的物理页。参数说明:[要映射扩展内存的逻辑页面号]指定要映射到物理页的扩展内存的逻辑页面号。[映射到的物理页面号]指定将映射到的物理页面号。[句柄]指定句柄。★XS命令格式:XS功能:显示有关扩展内存状态的信息。参数说明:无参数★A命令使用说明:用于小段程序的汇编及修改目标程序,所有输入的数字均默认为十六进制,并且不需要以“h”字符结尾。用户装入内存的汇编语句是连续存放的,若没有指定地址,并且前面没有使用汇编命令,该语句被汇编到CS:0100区域,则在它上次停止处开始汇编。注意:1.直接在A命令下输入跳转指令时,跳转指令后应跟跳转到的语句所在内存单元的地址,不能跟标号;使用跳转指令时,可以指定跳转指令的属性:near,far。near前缀可以缩写为ne。如下例所示:-a0100:01000100:0100jmp1020100:0102jmpnear1050100:0105jmpfar10a2.汇编语言指令所涉及到的操作数可以是字操作数也可以是字节操作数,在语句不能判别操作数的类型时,可以使用前缀wordptr或者前缀byteptr指定操作数的类型。缩写分别是:wo和by。如下列所示:-a0100:01000100:0100decwordptr[100]0100:0102decwoptr[100]0100:0105decbyteptr[100]2.在DEBUG下,应注意区分立即操作数和内存地址的操作数,使用包括在中括号([])中的操作数表示内存地址。3.在DEBUG下,能够使用的伪指令仅有DB和DW两个,分别用于定义字节和字操作数,此时定义的操作数被存放在该定义指令所在的内存空间中。如下列所示(注意内存空间的变换,why?):-a0100:01000100:0100DB‘ABCDEFG’0100:0107★C命令使用说明:如果[源地址范围]和[目的地址]中内存单元的数据相同,Debug将不显示任何内容而直接返回到Debug提示符。如果有差异,Debug将按如下格式显示:[源地址]源地址中内容目的地址中内容[目的地址]如下列所示:-CCS:100105DS:300;(假定CS=0AF6;DS=1000)0AF6:010088001000:03000AF6:0101C0001000:03010AF6:010289001
本文标题:王爽汇编语言答案汇集
链接地址:https://www.777doc.com/doc-4598015 .html