《《计算机输入输出系统》汇编实验指导书.doc》由会员分享,可在线阅读,更多相关《《计算机输入输出系统》汇编实验指导书.doc(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、计算机输入输出系统实验指导书第一部分80X86汇编语言实验杨全胜 编东南大学计算机科学与工程学院、软件学院第一章 x86 16位汇编语言程序调试工具DebugDEBUG是为汇编语言设计的一种调试工具,它通过单步和设置断点等方式为汇编语言程序员提供了非常有效的调试手段。在DOS的提示符下,可键入命令: CDEBUG d:pathfilename.extparmlparm2其中,文件名是被调试文件的名字。如用户键入文件名,则DEBUG将指定的文件装入存储器中,用户可对其进行调试。如果未键入文件名,则用户可以用当前存储器的内容工作,或者用DEBUG命令N和L把需要的文件装入存储器后再进行调试。命令中
2、的d指定驱动器,Path为路径,parml和parm2则为运行被调试文件时所需要的命令参数。在DEBUG程序调入后,将出现提示符“-”,此时就可用DEBUG命令来调试程序。下面介绍DEBUG的主要命令。1. 显示存储单元的命令D(DUMP)格式为:-Daddress或-Drange例如,按指定范围显示存储单元内容的方法为:-d100 11F1636:0100 00 8B 36 EB D8 8B 0E E9-D8 8B D6 E3 42 51 56 5B .6.BQV1636:0110 2B DE 59 03 CB 8B D6 C6-06 CD DC 00 34 00 25 16 +.Y.4.%
3、.其中,0100H至011FH是DEBUG显示的单元内容。左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,.表示不可显示的字符。这里没有指定段地址,D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的128个字节的内容。如果完全没有指定地址,则显示上一个D命令显示的最后一个单元后的内容。以上命令也可写为-D100L20,其中L表示长度。注意:在DEBUG中,与汇编语言不同,所有数默认为16进制数。2. 修改存储单元内容的命令E(Enter)输入命令E有两种格式。第一种格式可以用给定的内容表来替代指定范围的存储单元内容。命令格式为:-E address list例如,
4、-EDS100 F3XYZ8D其中F3,X,Y,Z和8D各占一个字节,该命令可以用这五个字节来替代存储单元DS0100H到0104H的原先的内容。第二种格式则是采用逐个单元相继修改的方法。命令格式为:-E address 例如,-ECS100则可能显示为: 14A00100 00.如果需要把该单元的内容修改为78,则用户可以直接键入78,再按“空格”键可接着显示下一个单元的内容,如下:14A00100 00.78 8B.这样,用户可以不断修改相继单元的内容,直到用Enter键结束该命令为止。3. 检查和修改寄存器内容的命令R(Register)它有三种格式。 第一,显示CPU内所有寄存器内容和
5、标志位状态,其格式为:-R。例如:-rAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=14A0 ES=14A0 SS=14A0 CS=14A0 IP=0100 NV UP EI PL NZ NA PO NC14A00100 F3 REPZ14A00101 7879 JS 017C第二,显示和修改某个寄存器内容,其格式为:-R register。例如,键入-rAX,系统将响应如下:AX 0000:即AX寄存器的当前内容为0000H,如不修改则按Enter键,否则,可键入欲修改的内容,如:-rbxBX 0000:3
6、69则把BX寄存器的内容修改为0369H。第三,显示和修改标志位状态,命令格式为:-RF。系统将响应如: NV UP EI PL NZ NA PO NC -此时,如不修改其内容可按Enter键,否则,可键入欲修改的内容。如:NV UP EI NG NZ NA PO NC -ngovdnpo即可,可见键入的顺序可以是任意的。但必须按照标志位的置复位表示方法书写。 4. 运行命令G(Go)其格式为:-G=address1address2address3.其中,地址l指定了运行的起始地址,如不指定则从当前的CSIP开始运行。后面的地址均为断点地址,当指令执行到断点时,就停止执行并显示当前所有寄存器及
7、标志位的内容和下一条将要执行的指令。 5. 跟踪命令T(Trace)有两种格式。第一,逐条指令跟踪,其格式为:-T=address从指定地址起执行一条指令后停下来,显示所有寄存器内容及标志位的值。如未指定地址,则从当前的CSIP开始执行。第二,多条指令跟踪,其格式为:-T=addressvalue从指定地址起执行n条指令后停下来,n由value指定。 6. 汇编命令A(Assemble)其格式为:-A address该命令允许键入汇编语言语句,并能把它们汇编成机器代码,相继地存放在从指定地址开始的存储区中。7. 反汇编命令U(Unassemble) 从指定地址开始,反汇编32个字节,其格式为:
8、-uaddress例如:-U100如果地址被省略,则从上一个u命令的最后一条指令的下一个单元开始显示32个字节。 对指定范围内的存储单元进行反汇编,格式为:-urange例如:-U100 10C或U100LD8. 命名命令N(Name)其格式为:-N filespecs filespecs命令把两个文件标识符格式化在CS5CH和CS6CH的两个文件控制块中,以便在其后用L或W命令把文件装入或存盘。filespecs的格式可以是:d:pathfilename.ext例如,-N myprogL-L可把文件myprogL装入存储器。 9. 装入命令L(Load) 把磁盘上指定扇区范围的内容装入到存储
9、器从指定地址开始的区域中。其格式为:-Laddressdrive sector number 装入指定文件,其格式为:-Laddress此命令装入已在CS5CH中格式化了的文件控制块所指定的文件。如未指定地址,则装入CS0000H 开始的存储区中。 10. 写命令W(write) 把数据写入磁盘的指定扇区。其格式为:-W address drive sector number 把数据写入指定的文件中。其格式为:-Waddress此命令把指定的存储区中的数据写入由CS5CH处的文件控制块所指定的文件中。如未指定地址则数据从CS0100H开始。要写入文件的字节数应先放入BX和CX中。CX中为低16
10、位,若数据长度大于64K,则使用BX记录高16位。11. 帮助命令格式为-?显示DEBUG所有命令简明列表。12. 退出DEBUG命令Q(Quit)其格式为:-Q它退出DEBUG,返回DOS。本命令并无存盘功能,如需存盘应先使用W命令。 第二章 汇编实验实验一 汇编语言程序上机过程一)实验目的学会安装“16位汇编程序开发软件”的安装,完成将汇编语言源程序录入进计算机、利用ml.exe进行汇编,LINK进行链接,并用DEBUG调试16位程序的全部过程。本实验大家不必了解程序细节,只是为了熟悉开发环境和上机过程。二)实验内容1. 按照安装说明中所述,安装好16位汇编开发环境。配置好相关的BAT文件
11、。(本文假设大家是按照安装手册建议的路径安装的)2. 熟悉16位汇编程序的上机过程。参照汇编语言上机过程(自学)PPT中“16位汇编语言上机过程”的内容,输入,汇编和调试下面的程序(命名为sample.asm, 程序功能是将BUFF中的值(3C6DH)以十六进制的形式打印到屏幕上).8086.MODEL SMALL.STACK .DATA BUFF WORD 3C6DH STRING BYTE PRINT HEX.,0AH,0DH,$.CODE START: MOV AX,DATA MOV DS,AX MOV DX, OFFSET STRING MOV AH, 09H INT 21H LEA
12、SI,BUFF MOV BX,SI MOV CH,4A1: MOV CL,4 ROL BX,CL MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH JL A2 ADD AL,7HA2: MOV DL,AL MOV AH,2 INT 21H DEC CH JNZ A1 MOV AH,4CH INT 21HEND START 注:执行文件后,用DEBUG SAMPLE16.EXE命令将该程序调入到DEBUG环境中调试。1) 用U命令察看源代码2) 用D命令察看数据段的数据3) 用R命令察看寄存器状态4) 用T命令单步跟踪程序执行5) 用G命令设置断点,调试软件中
13、断指令(int 21h)(不要用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.MODEL SMALL.DATAXWORD30YWORD20ZWORD40VWORD35.CODESTART:MOVAX,DATAMOVDS,AXMOV A
14、X, X IMUL Y ; x*y MOV CX, AX MOV BX, DX MOV AX, Z CWD ADD CX, AX ADC BX, DX ; x*y+z SUB CX, 540 SBB BX, 0 ;x*y+z-540 MOV AX, V CWD SUB AX, CX SBB DX, BX ; v-(x*y+z-540) IDIV X ; (v-(x*y+z-540)/x.STACKENDSTART2. 写完整程序16位程序,在内存中从Table开始的10个单元中连续存放0到9的平方值,任给一个0到9的数X,该数存放在内存单元XX中,用XLAT指令查表求X的平方值,并将结果存于内
15、存YY单元中。编写程序,并在DEBUG中进行调试和验证结果。3 . 假设CX:BX中放了4位非压缩的BCD码表示的十进制数4386,请编写完整程序将这个数转成2进制数放到DI寄存器中,并用DEBUG调试和验证之。实验三 分支程序设计一)实验目的通过本实验,熟练运算类指令对标志位状态的影响,以及标志位状态的表示方法;掌握无条件转移、条件转移指令的使用方法;掌握分支程序设计和调试方法。二)实验内容1. 如果X50,则显示TOO_HIGH;否则计算X-Y,溢出显示OVERFLOW,若无溢出则|X-Y|RESULT。.8086.MODEL SMALL.DATAXDB? ; X和Y请同学们自己设定YDB
16、?STR1BYTETOO_HIGH!,0DH,0AH,$STR2BYTEOVERFLOW!,0DH,0AH,$RESULTDB?.CODESTART: MOVAX,DATA MOVDS,AXMOV AL, XCMP AL, 50JG TOO_HIGHSUB AL, YJO OVERFLOWJNS NONNEGNEG AL;计算绝对值 NONNEG:MOV RESULT, AL JMPEXITTOO_HIGH: LEADX,STR1;显示TOO_HIGH JMPDISPLAYOVERFLOW: LEADX,STR2;显示OVERFLOWDISPLAY:MOVAH,09HINT21HEXIT:MO
17、VAH,4CHINT21H.STACKENDSTART2. 利用跳转表技术实现根据用户输入的星期几的数字代号在屏幕上显示星期几的英文名称的功能。(提示:1)键盘输入的是数字的ASCII码,需要转换成数字。2)建立一张跳转表,表中存放打印每个星期的程序段的入口地址。3)考虑怎么使程序代码量最小。)3. 已知数据段有以下定义:NUM DW 3570STRING DB 5 DUP(20H),$ ; 20H为空格的ASCII码请编写完整程序,在屏幕上以十进制的形式将NUM这个数打印出来,可以借助STRING这个字符串。(NUM这个数可以定义为一个任意字型数)。实验四 循环程序设计一)实验目的通过实验,
18、可以掌握循环结构的各种实现方法,进一步了解循环结构中初始化部分、循环体部分、循环控制部分的功能以及他们彼此之间的关系。尤其是多重循环中外层循环和内层循环之间的关系。二)实验内容1. 已知字符串string包含有60 BYTE的内容(不含回车换行和$结束符,将其中所有的?符号替换成空格( ),编程先打印原始串,转换后再打印转换后的串。.8086.MODEL SMALL.DATABUF BYTE 20 dup (1), 30 dup (?), 10 dup (a),13,10, $.CODESTART: MOVAX,DATA MOVDS,AXMOV AH,9MOVDX,OFFSET BUFINT2
19、1HMOV CX,60LEA SI, BUFA30:CMP BYTE PTR SI,?JE CHANGEJMP A31CHANGE: MOV BYTE PTR SI, 20H ; 空格的ASCII码是20HA31:INC SILOOP A30MOV AH,9MOVDX,OFFSET BUFINT21HEXIT:MOVAH,4CHINT21H.STACKENDSTART2. 已知数据段有以下定义: STRING BYTE It is palindrome,0DH,0AH,$ LENWORD ? NUM BYTE 5 DUP(20H),$ ; 20H为空格的ASCII码请编写完整16位汇编程序,统
20、计以$字符结束的字符串STRING的字符个数(不算$), 将个数放入LEN中,并在屏幕上以十进制的形式将LEN打印出来,可以借助NUM这个字符串。3. 所谓回文字符串是指一个字符串正读和倒读都是一样的,例如字符串ABCDEFFEDCBA就是一个回文字符串,而字符串ABCFDDCAB就不是回文字符串。现在编写完整的16位汇编程序,输入一个字符串,判断该字符串是否为回文字符串,并用“It is a palindrome”或“It is NOT a palindrome”作为输出。4. 请编写16位完整汇编程序,在一个升序字节数组BUFF中查找数N,找到后将此数从数组中删除,并使得CF=0;没找到返
21、回CF1。实验五 子程序设计一)实验目的通过本实验,掌握子程序的定义和调用方法。通过程序调试,进一步理解CALL指令和RET指令的功能,掌握子程序调用时参数传递的方法。三) 实验内容请编写完整16位汇编程序从键盘读取字符,如果是十进制的09则在屏幕上输出该数的8位二进制码,并将数字依次存放到BUF开头的数组中,如果读入的字符是Q或者q,则程序退出,其他情况在屏幕上打印“You must input 09, or q or Q”。(如输入的字符是9,则输出“”).提示:输出一个数的2进制形式应该从最高位开始输出。要求打印一个数的2进制形式和输出回车换行分别定义成一个子程序可以将此段程序定义成一个过程。