微机原理软件实验报告_第1页
微机原理软件实验报告_第2页
微机原理软件实验报告_第3页
微机原理软件实验报告_第4页
微机原理软件实验报告_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微机原理软件实验·报告信息与通信工程学院微机原理软件实验报告班级: 姓名: 学号: 日期: 2011年12月第46页实验一 DEBUG 的使用1一、实验目的1二、实验内容1三、预习思考3四、实验过程4五、实验总结7实验二 分支、循环程序设计8一、实验目的8二、实验内容8三、预习思考8四、实验过程9(一)、流程图9(二)、源代码10(三)、实验分析13五、实验总结14实验三 代码转换程序设计15一、实验目的15二、实验内容15三、预习思考15四、实验过程16(一)流程图16(二)模块层次图16(三)源代码17(四)实验分析21五、实验总结22实验四 子程序设计23一、实验目的23二、实

2、验内容23三、预习思考23四、实验过程24(一)流程图24(二)模块层次图25(三)源代码25(四)实验分析39五、实验总结40实验五 中断程序设计41一、实验目的41二、实验内容41三、预习思考41四、实验过程42(一)流程图42(二)源代码43(三)实验分析49五、实验总结50实验一 DEBUG 的使用一、实验目的1. 掌握汇编程序的编辑、编译、连接和执行的全过程;2. 学习和掌握用DEBUG调试程序的方法。二、实验内容1. 用编辑软件,输入以下汇编语言源程序: DAT SEGMENT A DB 20 B DB 15 Y DB 3 DUP(0) Z DB 0,0 DAT ENDS STA

3、SEGMENT STACK DW 50 DUP(?) STA ENDS COD SEGMENT ASSUME CS:COD,DS:DAT STAR PROC FAR PUSH DS XOR AX,AX PUSH AX MOV AX,DAT MOV DS,AX MOV AX,STA MOV SS,AX MOV AL,A MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,B MOV Z,AL MOV Z+1,AL CALL SUB1 MOV AL,A MOV Z,AL MOV AL,B MOV Z+1,AL CALL SUB1 ADD WORD PTR Y,AX ADC B

4、YTE PTRY+2,0 RET STAR ENDP SUB1 PROC MOV AL,Z MOV AH,Z+1 MUL AH ADD WORD PTR Y,AX ADC BYTE PTRY+2,0 RET SUB1 ENDP COD ENDS END STAR2. 通过编译,连接形成可执行文件。3. 用 DEBUG 将可执行文件调入,并进行调试。1) 用 D 命令观察数据区在内存中的具体内容,记录单元 A 和 B 的具体地址。2) 用 U 命令对目标代码反汇编,观察反汇编后的结果。注意发现源程序的起始位置,并记录这个起始地址。3) 用 T 命令作单步跟踪调试。比较每条指令执行后的结果和原来的

5、理解是否 一致,得出程序运行的结果:它们是写在什么单元,具体内容是什么;并判断结果是否正确。在子程序 SUB1 的入口处设一断点,用 G 命令执行程序。 在断点处观察堆栈的内容,比较堆栈的内容和程序返回地址是否一致。4) 用 E 命令修改单元 A,B 的内容,重新执行程序,并记录结果。5) 用 M 命令和 A 命令对程序进行修改:将主程序中最后两条指令 (ADD 和ADC) 修改为一条 CALL SUB1 指令,重新执行程序。6) 退出 DEBUG。4. 重新使用编辑软件,把源程序最后一句中的 STAR 去掉。再次生成可执行文件,并用 DEBUG 调入内存。当使用 U 命令时,显示的结果与前一

6、次(未加 STAR) 的结果有何不同?三、预习思考1. 熟悉常用的 DEBUG 命令。答:常用的DEBUG命令如下图表所示。2. 阅读并分析程序的功能。答:程序完成的功能是计算两个数的完全平方和,即计算a2+b2+ab3. 若 SS=2000H,SP=FFFFH, 向堆栈中压入 4 字节数据后,如何用 D 命令显示压入堆栈的内?答:使用的命令是:D 2000:FFFB,即使用段基址加偏移量查看。四、实验过程以下由实验截图展现具体的实验过程,截图进行了详细标注,便于阅读。编译上图为编译、链接形成可执行文件的过程。(1)下图展现了进行反编译然后使用D命令查看数据段中A、B值的过程。AB段地址:14

7、2EHA:偏移地址0000H 物理地址142E0H,B:偏移地址0001H 物理地址142E1H(2)下图为用u命令进行反汇编的结果,CS段地址1436H,起始偏移地址0000H(3)下图是用T命令作单步跟踪调试,并在SUB1出设置一断点,可以看到程序执行到CALL 0003F时跳到了子程序进行执行,并将断点地址压入堆栈中,各寄存器的值均有显示。CALL SUB1语句地址CALL语句的下一个语句的地址(4)下图使用E命令对数据段数据A和B进行了修改,分别由20和15改为了4和8,修改后重新运行用D命令进行了查看。修改之后修改之前修改之后运行结果(6)用 M 命令和 A 命令对程序进行修改: 将

8、主程序中最后两条指令 (ADD 和 ADC) 修改为一条 CALL SUB1 指令,重新执行程序.下图是原程序下图将sub1的代码转移到0055h的位置,防止修改后两句命令时影响sub1子程序下图是用A命令修改call子程序的命令及后两句命令下图为重新运行结果,与预测结果相符(6)重新使用编辑软件,把源程序最后一句中的 STAR 去掉。再次生成可执行文件,再次DEBUG时。当使用 U 命令时,结果如下图所示。可以看到,没有END STAR语句,编译器将不知道代码段的入口地址是多少,导致从数据段开始译码,后续译码全部紊乱。END STAR的作用是指示编译器程序结束,同时告诉编译器程序执行时代码段

9、的入口地址。(7)下图为退出debug的结果五、实验总结此次实验是微机原理软件实验的第一次实验。由于平时只是注重理论的学习,没有多少实际编程和调试经验,上机操作还不熟练。以后需要加强实践。这次实验我学会了汇编程序的基本调试方法,也体会到汇编的调试和C/C+或者Java调试的差异。汇编的调试需要深入堆栈和内存区,关心每一寄存器和每一个指令。这也体现汇编是底层语言的特点。在这次实验中,我学会了各种调试命令,这对以后编程有着重要的意义,对于程序中的逻辑错误知道怎么去找问题。实验二 分支、循环程序设计一、实验目的1. 开始独立进行汇编语言程序设计;2. 掌握基本分支,循环程序设计;3. 掌握最简单的

10、DOS 功能调用。二、实验内容1. 安排一个数据区,内存有若干个正数,负数和零。每类数的个数都不超过 9。2. 编写一个程序统计数据区中正数,负数和零的个数。3. 将统计结果在屏幕上显示。4. (扩展题)统计出正奇数、正偶数,负奇数、负偶数以及零的个数。三、预习思考1. 十进制数 0 9 所对应的 ASCII 码是什么? 如何将十进制数 0 9 在屏幕上显示出来?答:09分别对应ASCII码的30H39H。欲将十进制数09显示在屏幕上,只需要用二进制数09分别加上30H即可。2. 如何检验一个数为正,为负或为零? 你能举出多少种不同的方法?答:方法有多种,只要能通过指令影响标志寄存器,就可以通

11、过标志寄存器来判断出正负和零,现举出两种。一是直接用CMP命令和0比较,然后用JZ等命令进行判断;二是和0相比是否相等,然后用该数(假设为8位)和10000000相与,取出符号位判断,可区分正负。四、实验过程(一)、流程图(二)、源代码;1.安排一个数据区,内存有若干个正数,负数和零.每类数的个数都不超过 9.;2.编写一个程序统计数据区中正数,负数和零的个数.;3.将统计结果在屏幕上显示.DATA SEGMENTNUM DB -3,0,5,6,4,-6;要比较的数据COUNT EQU $-NUM;存放数据的长度NUM_A DB 0;存放大于的个数NUM_E DB 0;存放等于的个数NUM_B

12、 DB 0;存放小于的个数STRING DB 0DH,0AH,'$'STRING1 DB 'NEGATIVE',3AH,20H,'$'STRING2 DB 'EQUAL',3AH,20H,'$'STRING3 DB 'POSITIVE',3AH,20H,'$'DATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTAR

13、TPROCMOV AX,DATAMOV DS,AXMOV CX,COUNTMOV DX,0MOV AX,0MOV BX,OFFSET NUMLOOP1:AND BYTE PTRBX,0FFHJZ EA_INJNS A_ININC ALJMP NEXTEA_IN:INC DLJMP NEXTA_IN:INC DHNEXT:INC BXLOOP LOOP1MOV NUM_B,ALMOV NUM_E,DLMOV NUM_A,DHMOV AH,09HMOV DX,OFFSET STRING1INT 21HMOV AH,02HMOV DL,NUM_BADD DL,30HINT 21H;MOV AH,09

14、HMOV DX,OFFSET STRINGINT 21HMOV AH,09HMOV DX,OFFSET STRING2INT 21HMOV AH,02HMOV DL,NUM_EADD DL,30HINT 21H;MOV AH,09HMOV DX,OFFSET STRINGINT 21HMOV AH,09HMOV DX,OFFSET STRING3INT 21HMOV AH,02HMOV DL,NUM_AADD DL,30HINT 21HMOV AH,09HMOV DX,OFFSET STRINGINT 21HMOV AX,4C00HINT 21HSTART ENDPCODE ENDSEND S

15、TART (三)、实验分析数据区待统计的数据为:-3,0,5,6,4,-6实验结果如下图所示。本实验较为简单,意在练习基本的分支、循环结构。关键的点在于和0FFH相与,区分正负和零。使得程序更加流畅和简洁,思路也更清晰。五、实验总结实验中设计好的计算思路是很重要的,汇编的代码由各种跳转和逻辑结构组成,需要考虑代码间的逻辑关系,否则容易出错。语法错误是很显而易见的,但逻辑错误却不容易发现。当有大量判断和循环存在时,需要考虑清楚程序跳转的条件和方向,这点和高级语言有较大差异,汇编本质上没有循环和分支,都是通过将IP赋予代码区地址进行跳转实现的,程序员需要自主控制如何跳转,向何处跳转,这点和C/C+

16、中饱受诟病的goto语句处理有些类似。考虑到实验练习的重点在分支循环结构,此次写代码时暂时没有使用子程序或宏,导致输出部分代码有些过长。实验三 代码转换程序设计一、实验目的1. 掌握几种最基本的代码转换方法;2. 运用子程序进行程序设计。二、实验内容1. 从键盘上输入若干两位十进制数,寻找其中的最小值,然后在屏幕上显示出来。2. 两个十进制数之间的分隔符,输入结束标志自定,但要在报告中说明。3. 对输入要有检错措施,以防止非法字符输入,并有适当的提示。4. 将整个程序分解为若干模块,分别用子程序实现。在报告中要给出模块层次图。三、预习思考1. 如何将输入的两个字符(09)变为十进制或二进制数?

17、答:输入的字符09是ASCII码表示的,对应于30H39H,通过减去30H,可以转换为相应的计算机数。2. 如何将选出的最小值(二进制或十进制)变为 ASCII 码再进行显示?答:如果采用输入时把ASCII码转换为数字,然后比较数字的大小再输出,那么输出时还需要把数字再次转换为ASCII码。这是不明智的。可以直接读入并存储数字的ASCII码,容易比较其大小,然后直接输出ASCII码即可。3. 你觉得采用二进制运算还是十进制运算更适合于这个实验?答:采用二进制或者十进制都需要进行ASCII码到数字的转换和其反向转换,换用新的思路可以大大简化编程负担。即直接使用数字对应的ASCII比较,分别比较十

18、位和个位,最后直接输出字符即可。四、实验过程(一)流程图(二)模块层次图(三)源代码DATA SEGMENTNUM DB 31 DB 0 DB 31 DUP(?)MINT DB ?MING DB ?;NUMC DB 0,1,2,3,4,5,6,7,8,9OKF DB 0ERRS DB 'ERROR TYPE',0DH,0AH,'$'TIP DB 'TYPE IN INTEGER,SPACE TO SEPRATE',0DH,0AH,'$'OUTPUTDB 'THE MIN IS ','$'HH DB

19、0AH,'$'DATA ENDS;10STACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTARTPROCMOV AX,DATAMOV DS,AXMOVES,AX;20MOVOKF,1AG:LEADX,TIP;用户输入提示MOV AH,09HINT21HLEA DX,NUM;输入字符MOVAH,0AHINT 21HLEADX,HH;换行MOVAH,09H;30INT21HLEA BX,NUM;确定输入数的个数,保存到CX中INC

20、 BXMOV AL,BXMOVAH,0MOVCL,3DIVCLMOVCL,ALMOVCH,0;40INCBXCALLCHECKCMPOKF,0JZAGMOVAL,BXMOVMINT,AL;将第一个数存入最小值中MOVAL,BX+1MOVMING,ALADDBX,3;将第二个数的偏移地址存入BX中CALLLF;调用查找最小值函数LEADX,OUTPUTMOV AH,09HINT21HMOVAH,02HMOVDL,MINTINT21HMOVDL,MINGINT21HEXIT:MOVAX,4C00HINT 21HSTART ENDP;检查是否输入出错;是数字+数字+空格则判断正确,其余情况判断错误C

21、HECK PROCPUSHBXPUSHCXCNUM:PUSHCXMOVCX,2CFS:MOVAL,BXCMP AL,30HJB ERRCMP AL,39HJBENPLERR:MOVOKF,0MOVAH,09HMOVDX,OFFSET ERRSINT 21HPOPCXJMPRENPL:INCBXLOOPCFSCSP:MOVAL,BXCMPAL,20HJNZERRNEXT:INCBXPOPCXLOOPCNUMMOVOKF,1RE:POPCXPOPBXRETCHECK ENDP;查找最小值;入口参数BX,出口参数MINT,MINGLFPROCPUSHCXDECCXLFC:MOVAL,BXCMPAL,

22、MINTJBEXCH;十位数比最小数的十位数小,交换JANLF;十位数比最小数的十位数大,进入下一个数的比较MOVAL,BX+1;十位数与最小数的十位数相等,比较个位数CMPAL,MINGJAENLFEXCH:MOVAL,BXMOVMINT,ALMOVAL,BX+1MOVMING,ALNLF:ADDBX,3LOOPLFCPOPCXRETLFENDPCODE ENDSEND START (四)实验分析下图是实验输出结果截图。实验中以空格为分隔符,空格的个数不限制,以回车为输入结束标志符。对输入的数字进行了位数和范围的严格限制,即必须是两位数字,如果数字小于10,需要补齐零。实验中对输入错误执行严

23、格的检查,出错则重新输入。判断输入错误的核心思路为:以空格为分割,以回车结束,要求必须是两位数,也即,一位数字后不能有空格,两位数字后必须有空格,以上三种情况囊括了所有可能的格式错误,不满足任何一个条件即出错。满足格式输入后,再判断字符的是否09,不是则出错。每项错误均已错误列表的形式给出,打印出错误提示。总结实验中的关键设计思路如下:1、严格的输入格式检查,严格的输入字符有效性检查。2、以数组方式进行存储,每两个BYTE存储一个输入的两位数,存储格式为字符ASCII码。不进行字符ASCII码到数字的转换。3、比较数字大小时,采用分别比较高位ASCII码和低位ASCII码的方式,从而不用在输入

24、时将字符存储为数字,输出时也不用再进行逆转换。程序效率大为提高。4、为使得程序结构清晰,减小代码耦合度,采用了多子程序的设计方式。把实验任务分为三步:读取输入、找出最小、输出打印,分别以子程序方式实现,主调函数依次调用完成实验任务。五、实验总结实验中比较大小的方式有多种,如何采用更加简洁有效的方式是值得思考的问题。考虑到ASCII也是可以比较的,且十位数和个位数是可以分别比较的这一情况,我采用了巧妙的方式进行处理。这说明,在实际的编程中,需要根据具体情况调整一般方法,使得方法更加简洁可行且有效。实验四 子程序设计一、实验目的1. 进一步掌握子程序设计方法;2. 进一步掌握基本的 DOS 功能调

25、用。二、实验内容1. 从键盘上输入某班学生的某科目成绩。输入按学生的学号由小到大的顺序输入。2. 统计检查每个学生的名次。3. 将统计结果在屏幕上显示。4. 为便于观察,输入学生数目不宜太多,以不超过一屏为宜。输出应便于阅读.尽可能考虑美观。5. 输入要有检错手段。三、预习思考1. 如何确定一个学生在这门科目中的名次?答:有两种基本思路,一是抽取每个学生的成绩和其他所有学生的成绩进行比较,然后统计比其分数高的学生,得出该学生的名次;二是把学生成绩存入连续内存区域,即数组方式,取得每个学生的成绩偏移量,即成绩指针。然后比较指针所指的成绩的大小,根据比较结果移动指针完成排序。具体排序时可以采用诸多

26、的方式,比如冒泡法,快速排序法等等,均是可行的。本实验采用第二种方式,用冒泡法予以具体实现。2. 输入结束后,采用什么方法进行比较以得到学生的名次最为简单?答:如上问所述,采用冒泡排序法可获得较好的时间和空间性能。冒泡法平均时间性能O(N2)。相比于直接比较,性能有所改善。但相对于快速排序、归并排序等优化的算法的时间复杂度O(N*log2N)还不够好。但后两者使用汇编实现代码的复杂度和编程要求要高。考虑到学生人数比较少,使用冒泡法是比较简洁的,时间性能是可以接受的。3. 准备好模块层次图。答:见下文“实验过程”中所示。4. 给出输出显示的形式。答:输出以列表形式给出。学号、分数、名次各一列。具

27、体形式参见实验分析部分的输出截图。四、实验过程(一)流程图(二)模块层次图(三)源代码DATA SEGMENTRSCOREDB 40 DUP(0);存储分数排名SCORE DB 100 DB 0 DB 100 DUP(?)ASCOREDB 40 DUP(0);存储调整后的分数值OKF DB 0;输入数据有效位;10SCOUNTDB 1REFDB 09H;十进制转BCD参考数TENDB 0ERRS DB 'ERROR TYPE',0DH,0AH,'$'出错提示符TIP DB 'TYPEININTEGER,SPACETOSEPRATE',0DH,0A

28、H,'$'输入提示符HH DB 0DH,0AH,'$'换行字符串STRNUMEQU $-HHNODB 'NO.','$'号数字符串SPOUTDB 3AH,' ','$'冒号+空格字符串STADB 'STATIC',3AH,'$'显示统计数据DATA ENDS;27STACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK;打印

29、字符串的宏PRINT MACRO PARA PUSH AX PUSH DX MOV AH,09H MOV DX,OFFSET PARA INT 21H POP DX POP AXENDM STARTPROCMOV AX,DATAMOV DS,AXMOVES,AXLEADI,ASCORE;ASCORE存放调整后的分数数组LEASI,RSCORE;RSCORE存放排序后的分数数组CLDAG:MOVOKF,1MOVNUMC,1MOVSCOUNT,1MOVCL,7MOVCH,0LEABX,COUNTCLE:MOVBYTE PTRBX,0INCBXLOOPCLEPRINTTIP;提示用户输入LEA DX

30、,SCORE;输入字符MOVAH,0AHINT 21H;60PRINTHH;换行;确定输入字符的个数,保存到CL中LEA BX,SCORE;BX指向SCORE首单元INC BX;BX指向字符数单元MOV CL,BX;CL存字符数目MOVCH,0INCBX;BX指向第一个字符单元CALLCHECK;判断是否输入出错CMPOKF,0;如果出错重新输入JZAG;调整分数及排序MOVCL,COUNT;CL存学生数目MOVCH,0LOOP1:MOVAL,BXSUBAL,30HMOVAH,BX+1;查找出这个数是一位数两个数还是三位数CMPAH,20HJZLOC1;一位数,跳转到LOC1MOVAH,BX+

31、2CMPAH,20HJZLOC2;两位数,跳转到LOC2;MOVAH,BX+3;CMPAH,20H;JZLOC3;三位数,跳转到LOC3LOC3:MOVAX,100;三位数,只有100,存入AL,BX移到下一个成绩处ADDBX,4JMPLOCALOC2:INCBX;两个数的分数,BX加1,指向个位数MOVAH,0;十位数乘10放到DL里,再加上个位数MOVDL,10MULDLMOVDL,ALMOVAL,BX;个位数放到ALSUBAX,30HADDAL,DLLOC1:MOVAH,0ADDBX,2;100LOCA:STOSB;存串操作,将转换后的分数存到ASCORE里CALLLSCORE;调用排序

32、函数LOOPLOOP1;显示排名LEADI,ASCORELEABX,SCOREADDBX,2MOVCL,COUNTMOVCH,0SHOW:PUSHCX;显示号数CALLSHOWNOMOV AH,02HMOVDL,'S'INT21HMOVDL,3AHINT21HCALLSHOWSCMOVAH,02HMOVDL,'R'INT21HMOVDL,3AHINT21H;查找名次CALLLOSCORE;显示名次MOVAH,02HMOVDL,CHINT 21HMOVDL,CLINT 21H;输出格式调整MOVAH,02H;输出制表符MOVDL,09HINT21HMOVAL,NU

33、MC;满三个换行MOVAH,0MOVCL,3DIVCLCMPAH,0JNZNEXTSTMOVAH,09H;换行MOVDX,OFFSET HHINT21H;查找下一个学生NEXTST:INCDIINCNUMCPOPCXLOOPSHOWEXIT:MOVAX,4C00HINT 21HSTART ENDP;查错子程序:对输入的数据进行查错,;含有非数字或非空格字符或者连续出现两个空格则报错;入口参数:BX,COUNT,出口参数:OKF(1有效)CHECK PROCPUSHBX;保护现场PUSHCXCN:MOVAL,BXCMP AL,30H;判断是否大于30H,小于30H就判断是不是空格JB CSPCM

34、P AL,39H;大于30H判断是否大于39H,大于则报错,小于则跳;到下一字节进行判断JBENEXTBCSP:CMPAL,20H;判断是否是空格,是空格学生数加1JZNUMIERR:MOVOKF,0MOVAH,09HMOVDX,OFFSET ERRSINT 21HJMPRENUMI:INCCOUNTCMPBYTE PTRBX+1,20HJZERRNEXTB:INCBXLOOPCNMOVOKF,1RE:POPCXPOPBXRETCHECK ENDP;排序子程序:对COUNT个数字进行排序;入口参数:COUNT,SILSCOREPROCPUSHCXPUSHBXPUSHSIMOVCL,COUNTM

35、OVCH,0LSC:CMPAL,SI;AL与当前SI的值进行比较,如果比SI大,;移动SI并插入,否则直接插到末尾JAEMOVRANKADDSI,1LOOPLSCMOVRANK:CALLSTODTMOVSI,ALPOPSIPOPBXPOPCXRETLSCOREENDP;子程序用途:将从SI开始的字符串向下移一位;入口参数:转移的起始位置SI,字符串总个数COUNTSTODTPROCPUSHFPUSHAXPUSHCXPUSHDIPUSHSIPUSHFMOVCH,0MOVAX,SIMOVDI,AXMOVCL,COUNT;CL存放需要转移的字符个数:COUNT-SI-1个SUBCX,SIDECCXA

36、DDDI,CX;DI加上需要转移的个数,指向最后一个单元MOVAX,CXDECAXADDSI,AX;SI加上需要转移的个数减1,倒数第二个单元STD;方向:递减REPMOVSB;转移串,SI->DIPOPFPOPSIPOPDIPOPCXPOPAXPOPFRETSTODTENDP;显示号数;入口参数:NUMCSHOWNOPROCMOVCL,NUMCCALLBTODDMOVDX,OFFSET NOMOVAH,09HINT21HMOVAH,02HCMPCH,0;如果号数是个位数,则十位数不显示JZSINNOMOVDL,CHINT21HSINNO:MOVDL,CL;显示号数的个位数INT21HP

37、RINTSPOUT;显示冒号和空格RETSHOWNOENDP;显示分数;入口参数:BXSHOWSCPROCMOVAH,02HSOUT:MOVDL,BXINT21HCMPBYTE PTRBX,20H;如果该字符是空格,则跳出子程序JZROUTINCBXJMPSOUTROUT:INCBXRETSHOWSCENDP;确定名次LOSCOREPROCMOVCL,COUNTMOVAL,DIMOVSI,OFFSET RSCORE;找名次RANKS:CMPAL,SIJZGETRANKADDSI,1LOOPRANKSGETRANK:NEGCL;求名次ADDCL,COUNTADDCL,1CALLBTODDRETL

38、OSCOREENDP;二进制转换为非组合BCD码;入口参数CL,出口参数CX,CH存十位数,CL存个位数BTODDPROCMOVREF,09H;参考值MOVTEN,00H;十位数COMPARE:CMP CL,REF;CL与参考值相比,比后者大,则参考值加10,;十位数加1JBEDDOUTBTNEXT:ADDREF,0AHINCTENJMPCOMPAREDDOUT:MOVCH,TEN;CH存十位数,CL存个位数ADDCL,09HSUBCL,REFADDCX,3030H;CX加3030H,用于屏幕显示RETBTODDENDPCODE ENDSEND START (四)实验分析输入输出格式如下图所示

39、。首先提示输入学生人数,然后逐个提示输入学号和分数,输入完毕之后打印出最终结果,结果输出按照表格的形式给出,三列分别为学号、分数、排名。设计输入的学生个数上限是100人。分数从0100分。学号可以输入任意长度的15位数字,存储为字符串格式,每个学生固定长度。分数经过转换后存储为数字,每人占用一个BYTE。名次亦存储为数字,每人占用一个BYTE。下图演示了错误输入时的处理,根据错误类型打印出提示,并允许进行重新输入,而不用退出程序。本程序设计的主要特点如下:1、在程序设计思路上,采用了多子程序模块化设计,充分利用了宏和DOS功能调用等高级汇编技巧。2、在数据结构设计上,采用数组的方式进行存储,可

40、直接又下标(即学生的班内序号)进行直接寻址,效率较高。3、在进行排名比较时,利用了指针技术,即对分数的偏移量进行排序,而不移动实际的分数。模拟了高级语言中的数组和指针的技术,结构和思路完整规范。排序技术选用了冒泡排序,获得一定的性能提升。4、对用户输入进行严格的检查,对各种可能出现的错误进行了提示和处理。使得程序具有很好的完备性和健壮性。五、实验总结此次实验是在前几次实验的基础上完成的,综合了子程序设计、DOS调用、宏汇编等等编程方法和技术。具有很强的综合性。程序的设计按照小型程序的要求,充分考虑了健壮性和运行效率等因素,精心设计了数据结构和算法。是可用于实际工程的代码雏形。由于完备性、健壮性

41、、效率、界面等方方面面都考虑到,故代码长度达到了461行。这也使得调试花费了大量时间。综合实验对我的汇编编程能力的提升大有帮助。从四次实验的整个过程来看,我的进步是十分明显的。这也是令我十分欣喜的事情。实验五 中断程序设计一、实验目的1. 初步掌握中断程序的设计方法;2. 初步掌握修改 DOS 系统中断,以适应实际使用的方法。二、实验内容1. 编写一个32位二进制数除以16位二进制数的除法程序。观察当除数为 0,或超过相应寄存器范围时,程序执行的结果。2. 修改零号中断服务程序,使它具有以下功能:1) 判断除数是否为0,当除数为0时,显示相应的结果;2) 当除数不为0时,采用适当的方法完成商超

42、过16位的二进制数的除法运算。3. 注意必须保护原有中断服务程序的入口地址,并在程序完毕前加以恢复。4. 选作题:1) 用二进制将结果在屏幕上显示。2) 从键盘输入二进制数。三、预习思考1. 如何保护原有中断向量表中的中断服务程序的入口地址?答:先读取中断向量表中0号中断的地址,压入堆栈,程序结束时弹出堆栈,写回中断向量表即可。2. 如何将你的中断服务程序入口地址置入中断向量表?答:有两种基本方法:一是直接写入法,使用指令将中断服务程序入口地址的IP写入n×4的RAM位置,中断服务程序入口的CS写入n×4+2的位置;二是DOS功能调用,25H用来写中断向量表,35H读中断向

43、量表。四、实验过程(一)流程图(二)源代码DATA SEGMENT XX DD ?; 被除数32bit YY DW ?; 除数 16bit TMP DW ? FLAG DB 0 ;是否调用了中断处理程序的标志位,即是否溢出 ;一些提示信息 ERR0 DB ' ERROR! Divide by ZERO! ','$' TIP1 DB 'Quotient : ','$' TIP2 DB 'Remainder: ','$' TIP3 DB 'Input high 16-bit of dividen

44、d:','$' TIP4 DB 'Input low 16-bit of dividend:','$' TIP5 DB 'Input 16-bit divisor:','$' CR DB 0DH,0AH,'$'回车换行 ONE DB '1','$' ZER DB '0','$' TAB DB 09H,'$' BUFF DB 17 ;输入缓冲区,可容纳包括回车在内的17个字符PRES DB 0CHAR DB 17

45、DUP(0)DATA ENDS ;-;定义堆栈STACK SEGMENT STACK 'STACK' DB 100 DUP(0)STACK ENDS ;-CODE SEGMENT ASSUME DS:DATA,CS:CODE,ES:CODE,SS:STACK ;打印字符串的宏PRINT MACRO PARA PUSH AX PUSH DX MOV AH,09H MOV DX,OFFSET PARA INT 21H POP DX POP AXENDM ;-;主程序入口MAIN: MOV AX,DATA MOV DS,AX MOV AX,0 MOV ES,AX ;保存原中断向量表

46、MOV AX,WORD PTR ES:0000H PUSH AX MOV AX,WORD PTR ES:0002H PUSH AX ;写入新的中断处理子程序地址 MOV WORD PTR ES:0000H,OFFSET INT0 MOV WORD PTR ES:0002H,SEG INT0 CALL INPUT; 获取输入 MOV DX,WORD PTR XX; 移入被除数高16位 MOV AX,WORD PTR XX+2; 移入被除数低16位 MOV BX,YY ;移入除数 DIV BX; 进行32位除法运算 CMP FLAG,0; 查看是否调用了中断处理程序,即可判断是否溢出 JNE ISOF; 溢出跳转,到扩充除法的结果输出 ; 否则直接输出没有溢出的正常除法结果 PRINT TIP1 MOV BX,AX CALL DISP2 PRINT CR PRINT TIP2 MOV BX,DX CALL DISP2 JMP EOP ;有溢出的时候需要输出32位商和16位余数ISOF: PRIN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论