西电微机原理上机

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

4.37(上机题)编写程序实现,将缓冲区BUFFER中的100个字按递增排序,并按下列格式顺序显示:数据1原序号数据2原序号……算法流程图:调试问题、心得体会:通过这道题,熟悉了流程图画法,掌握了产生随机数,“冒泡法”排序,子函数编写调用等的基本过程,尤其对于中断调用,并利用ASCII码回显和对课本字节型数据“冒泡法”排序改进为字形排序的过程,是我受益匪浅。并且亲身实践了源程序的汇编、调试也连接。问题:将字节型冒泡法直接应用于该题,导致出错,该题存储的是字型数据!原因在于只是排列的AL中的数值,并不是产生的随机数!同时对于字型与字节型在运算类指令中的应用还是有误,以及其他的一些小错误,应加以改善!运行结果:程序代码:STACKSEGMENTSTACK'STACK'DW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTBUFFERLABELWORDX=17REPT100X=(X+80)mod43DWXENDMBUFDW100DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOPMOVCX,100LEASI,BUFFERLEADI,BUFL1:MOVAX,[SI]INCSIINCSIMOV[DI],AXINCDIINCDILOOPL1MOVCX,100DECCXLEASI,BUFFERPUSHCXADDCX,CXADDSI,CXPOPCXL2:PUSHCXPUSHSIL3:MOVAX,[SI]CMPAX,[SI-2]JAENOXCHGXCHGAX,[SI-2]MOV[SI],AXNOXCHG:SUBSI,2LOOPL3POPSIPOPCXLOOPL2MOVCX,100LEASI,BUFFERL4:MOVAX,[SI]CALLDISPAXADDSI,2CALLXIAOYUCALLXUHAOCALLDAYUCALLDISPCRLOOPL4MOVAH,4CHMOVAL,0INT21HDISPAXPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHDIMOVBX,10MOVCX,3L7:XORDX,DXDIVBXMOV[DI],DXINCDIINCDILOOPL7MOVCX,3L8:DECDIDECDIMOVAL,[DI]ADDAL,30HMOVAH,02MOVDL,ALINT21HLOOPL8POPDIPOPDXPOPCXPOPBXPOPAXRETDISPAXENDPDISPCRPROCNEARPUSHAXPUSHDXMOVAH,2MOVDL,0AHINT21HMOVAH,2MOVDL,0DHINT21HPOPDXPOPAXRETDISPCRENDPXIAOYUPROCNEARPUSHAXPUSHDXMOVAH,02MOVDL,3CHINT21HPOPDXPOPAXRETXIAOYUENDPXUHAOPROCNEARPUSHAXPUSHBXPUSHCXPUSHSIMOVCX,100MOVBX,AXLEASI,BUFL5:CMPBX,[SI]JZL6ADDSI,2LOOPL5L6:MOVAX,101SUBAX,CXCALLDISPAXPOPSIPOPCXPOPBXPOPAXRETXUHAOENDPDAYUPROCNEARPUSHAXPUSHDXMOVAH,02MOVDL,3EHINT21HPOPDXPOPAXRETDAYUENDPCODEENDSENDSTART4.38(上机题)按同余法产生一组随机数N(1N=50),并按N+50赋给45名同学的5门课程的成绩,要求编程实现计算每个同学的平均成绩,并根据平均成绩统计全班的成绩各等级的人数(A:90~100,B:80~89,C:70~79,D:66~69,E:60~65,F:60分以下),按下列格式显示:Total总人数A:人数1B:人数2C:人数3D:人数4E:人数5F:人数6算法流程图:调试问题、心得体会:通过该问题,进一步练习了通过流程图分析设计程序的功能,掌握了随机数产生,子函数调用,分支程序,循环程序,中断调用等过程,进行了调试,找出了数值无法转化为十进制并显示的问题,原因在于未定义临时存储单元。最后进行了汇编,链接等,得到了最终结果。问题1:NUMEER(用来存储各等级人数)存储单元清零后,忘记让DI再次指向其首地址,也就是各成绩等级的人数并未存入NUMBER,因此显示的都是0改正后得到正确结果!问题2:直接照搬课本数值转换子程序,未定义临时存储单元DECIMAL,导致编译出错,出现语法错误!改正后得到正确结果!运行结果:程序代码:STACKSEGMENTSTACK'STACK'DW100HDUP(?)TOPLABELWORDSTACKENDSDATASEGMENTBUFFERLABELBYTEX=17REPT225X=(X+97)mod50DBXENDMBUFDB45DUP(?)NUMBERDW6DUP(?)TOTALDB54H,6FH,74H,61H,6CHLETTERDB41H,42H,43H,44H,45H,46HDECIMALDB5DUP(?)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKMOVSS,AXLEASP,TOPLEASI,BUFFERLEADI,BUFMOVCX,45L1:PUSHCXMOVCX,5XORAX,AXL2:MOVBL,[SI]MOVBH,0ADDAX,BXADDAX,50INCSILOOPL2POPCXMOVBL,5DIVBLMOV[DI],ALINCDILOOPL1LEASI,BUFLEADI,NUMBERMOVCX,6MOVAX,0L3:MOV[DI],AXINCDIINCDILOOPL3MOVCX,45MOVBX,1LEADI,NUMBERL4:MOVAL,[SI]CMPAL,90JAELACMPAL,80JAELBCMPAL,70JAELCCMPAL,66JAELDCMPAL,60JAELMADD[DI+10],BXJMPL5LA:ADD[DI],BXJMPL5LB:ADD[DI+2],BXJMPL5LC:ADD[DI+4],BXJMPL5LD:ADD[DI+6],BXJMPL5LM:ADD[DI+8],BXL5:INCSILOOPL4LEASI,TOTALMOVCX,5L6:MOVAH,02MOVDL,[SI]INT21HINCSILOOPL6CALLKONGGECALLXIAOYUMOVAX,45CALLDISPAXCALLDAYUCALLDISPCRMOVCX,6LEASI,LETTERLEADI,NUMBERL7:MOVAH,02MOVDL,[SI]INT21HINCSIMOVAH,02MOVDL,3AHINT21HCALLKONGGECALLXIAOYUMOVAX,[DI]CALLDISPAXINCDIINCDICALLDAYUCALLDISPCRLOOPL7MOVAH,4CHMOVAL,0INT21HKONGGEPROCNEARPUSHAXPUSHDXMOVAH,02MOVDL,20HINT21HPOPDXPOPAXRETKONGGEENDPDISPCRPROCNEARPUSHAXPUSHDXMOVAH,2MOVDL,0AHINT21HMOVAH,2MOVDL,0DHINT21HPOPDXPOPAXRETDISPCRENDPXIAOYUPROCNEARPUSHAXPUSHDXMOVAH,02MOVDL,3CHINT21HPOPDXPOPAXRETXIAOYUENDPDAYUPROCNEARPUSHAXPUSHDXMOVAH,02MOVDL,3EHINT21HPOPDXPOPAXRETDAYUENDPDISPAXPROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHDILEADI,DECIMALCALLTRANS16TO10MOVCX,5LEADI,DECIMAL+4MOVAH,2DISPAX2:MOVDL,[DI]ADDDL,30HDECDIINT21HLOOPDISPAX2POPDIPOPDXPOPCXPOPBXPOPAXRETDISPAXENDPTRANS16TO10PROCNEARPUSHAXPUSHBXPUSHCXPUSHDXPUSHDIMOVBX,10MOVCX,5TRANS1:XORDX,DXDIVBXMOV[DI],DLINCDILOOPTRANS1POPDIPOPDXPOPCXPOPBXPOPAXRETTRANS16TO10ENDPCODEENDSENDSTART4.39(上机题)编写程序实现下列5项功能,通过从键盘输入1~5进行菜单式选择:(1)按数字键“1”,完成将字符串中的小写字母变换成大写字母。用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),变换后按下列格式在屏幕上显示:原字符串例如:abcdgyt0092新字符串ABCDGYT0092按任一键重做;按Esc键返回主菜单。(2)按数字键“2”,完成在字符串中找最大值。用户输入由英文大小写字母或数字0~9组成的字符串(以回车结束),找出最大值后按下列格式在屏幕上显示:原字符串Themaximumis最大值.按任一键重做;按Esc键返回主菜单。(3)按数字键“3”,完成输入数据组的排序。用户输入一组十进制数值(小于255),然后变换成十六进制数,并按递增方式进行排序,按下列格式在屏幕上显示:原数值串新数值串按任一键重做;按Esc键返回主菜单。(4)按数字键“4”,完成时间的显示。首先提示用户对时,即改变系统的定时器HH:MM:SS(以冒号间隔,回车结束),然后在屏幕的右上角实时显示出时间:HH:MM:SS。按任一键重新对时;按Esc键返回主菜单。(5)按数字键“5”,结束程序的运行,返回操作系统。程序流程图:主函数:功能1:功能2:功能3:功能4:调试问题、心得体会:此程序共5个功能,采用跳转表法来实现多路分支结构程序设计。现将这5个程序段,各程序段的首地址分别标号。将5个程序段的入口地址做成表TABLE放入数据段,程序根据给定的参数计算出欲转入的程序段的首地址在TABLE中的位置后,取出该地址,跳转至该程序段。然后执行该程序段功能。执行完后根据选择决定是重复执行改程序还是跳出选择其他程序执行。问题1:未在输入字符串末尾加上'$',导致出错,将后续存储区域的混乱字符全部显示出来!修改:MOVBYTEPTR[BX],'$';在输入字符串尾加结束标志$问题2:排序子函数出现问题各数值只转化为16进制,并未排序,调用过程出现问题!问题3:实现显示位置不对,未设置显示位置坐标!改正后得到正确结果!运行结果:主函数:功能1:功能2:功能3:功能4:功能5:程序代码:STACKSEGMENTSTACKDB256DUP(?)TOPLABELWORDSTACKENDSDATASEGMENTTABLEDWL1,L2,L3,L4,L5STRING1DB'1.Changestring;',0DH,0AH,'$'STRING2DB'2.Findthemaximum;',0DH,0AH,'$'STRING3DB'3.Rank;',0DH,0AH,'$'STRING4DB'4.Time;',0DH,0AH,'$'STRING5DB'5.Exit.',0DH,0AH,'$'STRINGNDB'Inputthenumber1-5:$'STRBUFDB'Inputthestring:',0DH,0AH,'$'MAXCHRDB'Themaximumis$'NUMBERDB'Inputt

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功