《计算机输入输出系统》实验指导书第一部分80X86汇编语言实验杨全胜编东南大学计算机科学与工程学院、软件学院第一章x8616位汇编语言程序调试工具—DebugDEBUG是为汇编语言设计的一种调试工具,它通过单步和设置断点等方式为汇编语言程序员提供了非常有效的调试手段。在DOS的提示符下,可键入命令:CDEBUG[d:][path][filename[.ext]][parml][parm2]其中,文件名是被调试文件的名字。如用户键入文件名,则DEBUG将指定的文件装入存储器中,用户可对其进行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用DEBUG命令N和L把需要的文件装入存储器后再进行调试。命令中的d指定驱动器,Path为路径,parml和parm2则为运行被调试文件时所需要的命令参数。在DEBUG程序调入后,将出现提示符“-”,此时就可用DEBUG命令来调试程序。下面介绍DEBUG的主要命令。1.显示存储单元的命令D(DUMP)格式为:-D[address]或-D[range]例如,按指定范围显示存储单元内容的方法为:-d10011F1636:0100008B36EBD88B0EE9-D88BD6E34251565B..6.........BQV[1636:01102BDE5903CB8BD6C6-06CDDC0034002516+.Y.........4.%.其中,0100H至011FH是DEBUG显示的单元内容。左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,.表示不可显示的字符。这里没有指定段地址,D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的128个字节的内容。如果完全没有指定地址,则显示上一个D命令显示的最后一个单元后的内容。以上命令也可写为-D100L20,其中L表示长度。注意:在DEBUG中,与汇编语言不同,所有数默认为16进制数。2.修改存储单元内容的命令E(Enter)输入命令E有两种格式。第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为:-Eaddress[list]例如,-EDS∶100F3'XYZ'8D其中F3,'X','Y','Z'和8D各占一个字节,该命令可以用这五个字节来替代存储单元DS∶0100H到0104H的原先的内容。第二种格式则是采用逐个单元相继修改的方法。命令格式为:-Eaddress例如,-ECS∶100则可能显示为:14A0∶010000.如果需要把该单元的内容修改为78,则用户可以直接键入78,再按“空格”键可接着显示下一个单元的内容,如下:14A0∶010000.788B.这样,用户可以不断修改相继单元的内容,直到用Enter键结束该命令为止。3.检查和修改寄存器内容的命令R(Register)它有三种格式。第一,显示CPU内所有寄存器内容和标志位状态,其格式为:-R。例如:-rAX=0000BX=0000CX=0000DX=0000SP=FFEEBP=0000SI=0000DI=0000DS=14A0ES=14A0SS=14A0CS=14A0IP=0100NVUPEIPLNZNAPONC14A0∶0100F3REPZ14A0∶01017879JS017C第二,显示和修改某个寄存器内容,其格式为:-Rregister。例如,键入-rAX,系统将响应如下:AX0000:即AX寄存器的当前内容为0000H,如不修改则按Enter键,否则,可键入欲修改的内容,如:-rbxBX0000:369则把BX寄存器的内容修改为0369H。第三,显示和修改标志位状态,命令格式为:-RF。系统将响应如:NVUPEIPLNZNAPONC-此时,如不修改其内容可按Enter键,否则,可键入欲修改的内容。如:NVUPEINGNZNAPONC-ngovdnpo即可,可见键入的顺序可以是任意的。但必须按照标志位的置复位表示方法书写。4.运行命令G(Go)其格式为:-G[=address1][address2][address3...]]其中,地址l指定了运行的起始地址,如不指定则从当前的CS∶IP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及标志位的内容和下一条将要执行的指令。5.跟踪命令T(Trace)有两种格式。第一,逐条指令跟踪,其格式为:-T[=address]从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。如未指定地址,则从当前的CS∶IP开始执行。第二,多条指令跟踪,其格式为:-T[=address][value]从指定地址起执行n条指令后停下来,n由value指定。6.汇编命令A(Assemble)其格式为:-A[address]该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。7.反汇编命令U(Unassemble)①从指定地址开始,反汇编32个字节,其格式为:-u[address]例如:-U100如果地址被省略,则从上一个u命令的最后一条指令的下一个单元开始显示32个字节。②对指定范围内的存储单元进行反汇编,格式为:-u[range]例如:-U10010C或U100LD8.命名命令N(Name)其格式为:-Nfilespecs[filespecs]命令把两个文件标识符格式化在CS∶5CH和CS∶6CH的两个文件控制块中,以便在其后用L或W命令把文件装入或存盘。filespecs的格式可以是:[d:][path]filename[.ext]例如,-NmyprogL-L可把文件myprogL装入存储器。9.装入命令L(Load)①把磁盘上指定扇区范围的内容装入到存储器从指定地址开始的区域中。其格式为:-L[address][drivesectornumber]②装入指定文件,其格式为:-L[address]此命令装入已在CS∶5CH中格式化了的文件控制块所指定的文件。如未指定地址,则装入CS∶0000H开始的存储区中。10.写命令W(write)①把数据写入磁盘的指定扇区。其格式为:-Waddressdrivesectornumber②把数据写入指定的文件中。其格式为:-W[address]此命令把指定的存储区中的数据写入由CS∶5CH处的文件控制块所指定的文件中。如未指定地址则数据从CS∶0100H开始。要写入文件的字节数应先放入BX和CX中。CX中为低16位,若数据长度大于64K,则使用BX记录高16位。11.帮助命令格式为-?显示DEBUG所有命令简明列表。12.退出DEBUG命令Q(Quit)其格式为:-Q它退出DEBUG,返回DOS。本命令并无存盘功能,如需存盘应先使用W命令。第二章汇编实验实验一汇编语言程序上机过程一)实验目的学会安装“16位汇编程序开发软件”的安装,完成将汇编语言源程序录入进计算机、利用ml.exe进行汇编,LINK进行链接,并用DEBUG调试16位程序的全部过程。本实验大家不必了解程序细节,只是为了熟悉开发环境和上机过程。二)实验内容1.按照安装说明中所述,安装好16位汇编开发环境。配置好相关的BAT文件。(本文假设大家是按照安装手册建议的路径安装的)2.熟悉16位汇编程序的上机过程。参照《汇编语言上机过程(自学)》PPT中“16位汇编语言上机过程”的内容,输入,汇编和调试下面的程序(命名为sample.asm,程序功能是将BUFF中的值(3C6DH)以十六进制的形式打印到屏幕上).8086.MODELSMALL.STACK.DATABUFFWORD3C6DHSTRINGBYTE'PRINTHEX.',0AH,0DH,'$'.CODESTART:MOVAX,@DATAMOVDS,AXMOVDX,OFFSETSTRINGMOVAH,09HINT21HLEASI,BUFFMOVBX,[SI]MOVCH,4A1:MOVCL,4ROLBX,CLMOVAL,BLANDAL,0FHADDAL,30HCMPAL,3AHJLA2ADDAL,7HA2:MOVDL,ALMOVAH,2INT21HDECCHJNZA1MOVAH,4CHINT21HENDSTART注:执行文件后,用DEBUGSAMPLE16.EXE命令将该程序调入到DEBUG环境中调试。1)用U命令察看源代码2)用D命令察看数据段的数据3)用R命令察看寄存器状态4)用T命令单步跟踪程序执行5)用G命令设置断点,调试软件中断指令(int21h)(不要用T)3.写16位汇编程序,从键盘输入一个字符串,然后换行后将该字符串输出到屏幕。实验二顺序程序设计一)实验要求通过这一部分的实验,进一步熟悉汇编过程和DEBUG调试过程;掌握用汇编语言编写顺序程序。二)实验内容1.x,y,z,v均为16位带符号数,用16位汇编计算(v-(x*y+z-540))/x,用Debug调试并看结果,AX中是否为-2(FFFEH),DX中是余数-5(FFFBH)。.8086.MODELSMALL.DATAXWORD30YWORD20ZWORD40VWORD35.CODESTART:MOVAX,@DATAMOVDS,AXMOVAX,XIMULY;x*yMOVCX,AXMOVBX,DXMOVAX,ZCWDADDCX,AXADCBX,DX;x*y+zSUBCX,540SBBBX,0;x*y+z-540MOVAX,VCWDSUBAX,CXSBBDX,BX;v-(x*y+z-540)IDIVX;(v-(x*y+z-540))/x.STACKENDSTART2.写完整程序16位程序,在内存中从Table开始的10个单元中连续存放0到9的平方值,任给一个0到9的数X,该数存放在内存单元XX中,用XLAT指令查表求X的平方值,并将结果存于内存YY单元中。编写程序,并在DEBUG中进行调试和验证结果。3.假设CX:BX中放了4位非压缩的BCD码表示的十进制数4386,请编写完整程序将这个数转成2进制数放到DI寄存器中,并用DEBUG调试和验证之。实验三分支程序设计一)实验目的通过本实验,熟练运算类指令对标志位状态的影响,以及标志位状态的表示方法;掌握无条件转移、条件转移指令的使用方法;掌握分支程序设计和调试方法。二)实验内容1.如果X50,则显示TOO_HIGH;否则计算X-Y,溢出显示OVERFLOW,若无溢出则|X-Y|→RESULT。.8086.MODELSMALL.DATAXDB?;X和Y请同学们自己设定YDB?STR1BYTE'TOO_HIGH!',0DH,0AH,'$'STR2BYTE'OVERFLOW!',0DH,0AH,'$'RESULTDB?.CODESTART:MOVAX,@DATAMOVDS,AXMOVAL,XCMPAL,50JGTOO_HIGHSUBAL,YJOOVERFLOWJNSNONNEGNEGAL;计算绝对值NONNEG:MOVRESULT,ALJMPEXITTOO_HIGH:LEADX,STR1;显示'TOO_HIGH'JMPDISPLAYOVERFLOW:LEADX,STR2;显示'OVERFLOW'DISPLAY:MOVAH,09HINT21HEXIT:MOVAH,4CHINT21H.STACKENDSTART2.利用跳转表技术实现根据用户输入的星期几的数字代号在屏幕上显示星期几的英文名称的功能。(提示:1)键盘输入的是数字的ASCII码,需要转换成数字。2)建立一张跳转表,表中存放打印每个星期的程序段的入口地址。3)考虑怎么使程序代码量最小。)3.已知数据段有以下定义:NUMDW3570STRINGDB5DUP(20H),’$’;20H为空格的ASCII码请编写完整程序,在屏幕上以十进制的形式将NUM这个数打印出来,可以借助STRING这个字符串。(NUM这个数可以定义为一个任意字型数)。实验四循环程序设计一)实验目的通过实验,可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关