华北科技学院综合性实验报告课程名称汇编语言实验学期2011至2012学年第1学期学生所在系部计算机学院网络工程系年级2009专业班级网络B091学生姓名罗希学号200907024114任课教师李冬艳实验成绩计算机学院制华北科技学院综合性实验报告第1页《汇编语言》课程综合性实验报告开课实验室:软件一实验室2011年12月6日实验题目显示学生名次表一、实验目的进行汇编语言程序设计应用的综合性训练。综合运用汇编语言循环程序和子程序编程方法,巩固提高汇编语言程序设计能力应用水平。二、设备与环境PC兼容机、Windows操作系统、汇编程序masm611。三、实验内容编制一程序,要求接收从键盘输入的一个班的学生成绩,并存放于50字节的GRADE数组中,其中GRADE+N保存学号N+1的学生成绩。然后根据GRADE中的学生成绩,把学生名次填入50字节的RANK数组中,其中RANK+N的内容是学号为N+1学生的名次。再按学号顺序把学生成绩及学生名次显示出来。1.必须画流程图。2.本程序要求要有多重循环和子程序,其中成绩输入、计算学生名次、显示学生名次都分别用子程序,也可用宏处理。四、实验结果及分析本程序一共有5个子程序。子程序分别是INPUT键盘输入,COPY数据转存,CHANG十进制数转换成二进制,SORT按成绩排序和PRINT打印排序名单。输入界面:华北科技学院综合性实验报告第2页首先调用INPUT功能输入学号,姓名,成绩,存入BUFF1,BUFF2,BUFF3缓存中,此时的输入顺序就是他们排名。再调用COPY将3个缓存中的数据保存在NUBER,SNAME,SCORE1中。此时再调用CHANG功能把SCORE1中的成绩转换成2进制存到SCORE2中。用冒泡排序法从高到低进行排序,此时SCORE2的顺序改变,顺序号也改变,而NUBER,SNAME,SCORE1中的数据都不改变。最后,调用PRINT方法输出,按照成绩降序进行输出。根据他们的顺序号找出他们在NUBER,SNAME,SCORE1中的学号,姓名,成绩输出。子程序流程图:华北科技学院综合性实验报告第3页主程序:结束INPUT子程序:INPUTBX+1CALLCOPYRET返回主程序保存输入次序BXP?输入姓名输入学号输入成绩Y主要代码分析:LEADX,INFOR1MOVAH,9INT21H主程序初始化CALLINPUTCALLSORTCALLPRINT华北科技学院综合性实验报告第4页LEADX,BUFF1MOVAH,10INT21HMOVAL,BUFF1+1ADDAL,2MOVAH,0MOVSI,AXMOVBUFF1[SI],0此代码是输入姓名的代码,首先讲缓存区BUFF1的偏移地址给DX调用10号功能输入一个字符串,然后将回车0D所在位置换为0便于输出显示。子程序COPY:子程序COPYCX=N+1姓名传送到SNAME成绩传送到SCORE1CALLCHANGECX=N+1学号传送到NUBER关键代码分析:MOVCX,N+1LEASI,BUFF1+2LEADI,SNAMEADDDI,SIGN1CLDREPMOVSBMOVCX,NMOVAX,'$'LEADI,BUFF1+2REPSTOSBCX为姓名长度,将缓存区的姓名传入到SNAME中,SIGN1为他们的间隔,传完之后再将缓存区的数据清空,全部设置为$。学号和成绩也是如此。华北科技学院综合性实验报告第5页子程序CHANGE:子程序CHANGCX-成绩位数从BUFF2取出一数给AL去掉ASCII码扩大10倍与X相加SOCRE2给2进制成绩XRET返回在0-9之间?循环结束?NYNN关键代码:REPT2:MOVAL,[SI]CMPAL,30HJLEXIT1CMPAL,39HJGEXIT1ANDAX,000FHXCHGAX,XMOVDX,10MULDXADDX,AXINCSILOOPREPT2MOVAX,XMOVSCORE2[DI],AXMOVX,0ADDSIGN2,2将成绩位数给CX,从BUFF2中取出第一位数给AL,然后去掉ASCII码再将它与10相乘,再与X相加得到二进制成绩华北科技学院综合性实验报告第6页数最后存入到SCORE2中。子程序SORT:子程序SORTCX赋人数-1保存外循环次数AI赋SCORE2SCORE2中成绩互换MINGCI中名次互换I=I+1?恢复外循环次数RET返回AI=AI+1?内循环结束?外循环结束?YYYNNN关键代码分析:MOVCX,PDECCXLOOP1:PUSHCXMOVBX,0MOVSI,0华北科技学院综合性实验报告第7页LOOP2:MOVAX,SCORE2[BX]CMPAX,SCORE2[BX+M+1]JGENEXTXCHGAX,SCORE2[BX+M+1]MOVSCORE2[BX],AXMOVAL,MINGCI[SI]XCHGAL,MINGCI[SI+1]MOVMINGCI[SI],ALNEXT:ADDBX,M+1INCSILOOPLOOP2POPCXLOOPLOOP1RET采用了冒泡排序的方法,将SCORE2表中的成绩从大到小排序,MINGCI中的顺序也同时按照成绩高低排序。子程序print::子程序print人数存入Cx显示名次从mingci取出名次存入al学号位移量显示学号名字位移量显示名字成绩位移量显示成绩修改地址循环结束?RetYN华北科技学院综合性实验报告第8页关键代码:MOVAX,0MOVAL,MINGCI[DI]DECALMOVBL,9MULBLLEADX,SNAMEADDDX,AXMOVAH,9INT21HMOVDL,0AHMOVAH,2INT21HMOVDL,0DHINT21H取出它的名次,根据名次知道了它的输入时顺序,计算它的名字在SNAME中的位置。找到了它的名字然后输出名字。学号,成绩也是如此。全部代码:DATASSEGMENTINFOR0DB0AH,0DH,'SORT=$'INFOR1DB0AH,0DH,'INPUTNAME:$'INFOR2DB0AH,0DH,'INPUTSCORE:$'INFOR3DB0AH,0DH,'INPUTNUMBER:$'OUT1DB'NUBER:$'OUT2DB'NAME:$'OUT3DB'SCORE:$'NEQU8MEQU4FEQU3PEQU3QEQU3BUFF3DBF,?,FDUP(0),'$'BUFF1DBN,?,NDUP(0),'$'BUFF2DBM,?,MDUP(0),'$'NUMBERDBPDUP(F+1DUP(0))SNAMEDBPDUP(N+1DUP(0))SCORE1DWPDUP(M+1DUP(0))SCORE2DWPDUP(M+1DUP(0))MINGCIDBPDUP(0)XDW?SIGN1DW0SIGN2DW0SIGN3DW0CONTDB'1'DATASENDSSTACKSSEGMENT;此处输入堆栈段代码STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATAS,SS:STACKSMAINPROCFARSTART:MOVAX,DATASMOVDS,AXMOVES,AXMOVBX,0MOVCX,0华北科技学院综合性实验报告第9页CALLINPUTCALLSORTCALLPRINTMOVAH,4CHINT21HMAINENDPINPUTPROCINCBXCMPBX,PJAEXITLEADX,INFOR3MOVAH,9INT21HLEADX,BUFF3MOVAH,10INT21HMOVAL,BUFF3+1ADDAL,2MOVAH,0MOVSI,AXMOVBUFF3[SI],0LEADX,INFOR1MOVAH,9INT21HLEADX,BUFF1MOVAH,10INT21HMOVAL,BUFF1+1ADDAL,2MOVAH,0MOVSI,AXMOVBUFF1[SI],0LEADX,INFOR2MOVAH,9INT21HLEADX,BUFF2MOVAH,10INT21HMOVAL,BUFF2+1ADDAL,2MOVAH,0MOVSI,AXMOVBUFF2[SI],0MOVMINGCI[BX-1],BLCMPBX,1JZLET1ADDSIGN1,N+1ADDSIGN2,QADDSIGN3,F+1LET1:CALLCOPYJMPINPUTEXIT:RETINPUTENDPCOPYPROCMOVCX,F+1LEASI,BUFF3+2LEADI,NUMBERADDDI,SIGN3CLDREPMOVSB华北科技学院综合性实验报告第10页MOVCX,FMOVAX,'$'LEADI,BUFF3+2REPSTOSBMOVCX,N+1LEASI,BUFF1+2LEADI,SNAMEADDDI,SIGN1CLDREPMOVSBMOVCX,NMOVAX,'$'LEADI,BUFF1+2REPSTOSBMOVCX,M+1LEASI,BUFF2+2LEADI,SCORE1ADDDI,SIGN2CLDREPMOVSBLEASI,BUFF2+2MOVDI,SIGN2CALLCHANGERETCOPYENDPCHANGEPROCMOVX,0MOVCX,[SI-1]ANDCX,000FHREPT2:MOVAL,[SI]CMPAL,30HJLEXIT1CMPAL,39HJGEXIT1ANDAX,000FHXCHGAX,XMOVDX,10MULDXADDX,AXINCSILOOPREPT2MOVAX,XMOVSCORE2[DI],AXMOVX,0ADDSIGN2,2EXIT1:RETCHANGEENDPSORTPROCMOVCX,PDECCXLOOP1:PUSHCXMOVBX,0MOVSI,0LOOP2:MOVAX,SCORE2[BX]CMPAX,SCORE2[BX+M+1]JGENEXTXCHGAX,SCORE2[BX+M+1]MOVSCORE2[BX],AXMOVAL,MINGCI[SI]华北科技学院综合性实验报告第11页XCHGAL,MINGCI[SI+1]MOVMINGCI[SI],ALNEXT:ADDBX,M+1INCSILOOPLOOP2POPCXLOOPLOOP1RETSORTENDPPRINTPROCLEADX,INFOR0MOVAH,9INT21HMOVCX,PMOVBX,0MOVAX,0MOVDI,0REPT3:MOVDL,0AHMOVAH,2INT21HMOVDL,0DHINT21HMOVDL,CONTMOVAH,2INT21HINCCONTMOVDL,0AHMOVAH,2INT21HMOVDL,0DHINT21HMOVAX,0MOVAL,MINGCI[DI]DECALMOVBL,4MULBLLEADX,NUMBERADDDX,AXMOVAH,9INT21HMOVDL,0AHMOVAH,2INT21HMOVDL,0DHINT21HMOVAX,0MOVAL,MINGCI[DI]DECALMOVBL,9MULBLLEADX,SNAMEADDDX,AXMOVAH,9INT21HMOVDL,0AHMOVAH,2INT21HMOVDL,0DHINT21HMOVAX,0华北科技学院综合性实验报告第12页MOVBX,0MOVAL,MINGCI[DI]DECALMOVBL,5MULBLLEADX,SCORE1ADDDX,AXMOVAH,9INT21HINCDILOOPREPT3RETPRINTENDPCODESENDSENDSTART收获体会:通过这次的汇编程序,我从中学习到了很多知识。虽然刚开始的时候遇到了很多难题,但是通过与老师、同学的交流之后,逐步克服了一个个的难题。提高了自己编程的思维能力,在将来的学习,生活之中能够快速的解决问题。汇编相对于别的编程语言而言,难度是比较大。汇编是直接对CUP进行操作,能够直接控制计算机编程。由于汇编不像JAVA那样的高级编程语言面向对象,在编程的时候思维有点乱,容易出错,而且小的错误也不容易找到,特别是程序代码长的时候。子程序INPUT的程序中主要有三个部分