学生信息管理系统1.实验类别使用汇编语言编程2.实验内容和实验目的学生的信息包括姓名、班级、学号和成绩,其中成绩精确到1位小数。编写程序实现以下功能:(1)可以录入学生的信息,成绩以十进制形式录入,并显示;(2)可以按成绩进行排序显示;(3)可以统计平均成绩;(4)可以统计不及格、60~70、70~80、80~90、90~100各分数段的人数。3.实验设备环境Windows7操作系统的pc机,使用QASM270编译器环境下编写。4.实验实现过程及方法首先数据采用二维数组的形式进行存储,分为学生信息部分与成绩部分。然后将输入学生数也保存在一个一维数组中。然后再信息的存储过程中,对于字符串输入进行转换,以二进制的形式存储在数据段中。然后采用冒泡排序,对于数据段中的人员信息进行排序。以成绩为参数。然后再对每个人员成绩进行遍历,统计各个数据层次中人员数,然后再成绩遍历的同时,将平均成绩也同时求出,在求平时成绩的时候,首先先将整数部分乘10然后再加上小数部分,以便于后续的输出。将排序后的人员信息及成绩显示出来,然后将平均成绩也同时打印出来,还有各个分数层次中的人员数也都一并显示出来。下面是一些主要代码来实现上述过程:;数据部分NUMBERDB3DUP(0);第一个存个/十位(ASCII码),第二个存个位(ASCII码),第三个存学生数(二进制);用20字节单元表示学生信息,0-19中:0对应最大字符,1对应实际输入,2-18对应输入信息,19对应'$'INFORMATIONDB99DUP(20DUP(0));用7字节单元来存分数,0-6中,0-4对应输入字符,5对应输入整数部分的二进制数,6对应于小数部分的二进制数GRADEDB99DUP(7DUP(0))AVERAGE_GRADE_BUFFERDB2DUP(0);第一个存整数部分(二进制形式),STORE_STUDENT_NUM;存储学生总数,结果送cx中STORE_STUDENT_INFORMATION;存储学生信息STORE_STUDENT_GRADE;存储每个学生成绩SORT;采用冒泡排序_DISPLAY;显示结果FIND_RESULT;显示平均成绩和分段人数关键算法的流程图:关于分段人数与总成绩的计算冒泡排序算法:5.效果图输入三人信息,班级学好姓名,然后输入此人成绩。可以看到三人的按成绩排序,然后将平均值输出,而且统计了各个分数区间的人数。处理计算计算总成绩<60?<70?<80?<90?=100错误返回NNNNNA++B++C++D++E++YYYYY处理排序冒泡i=0交换i++Ki=Ki+1i=counter?返回YNYN输入5人信息,并将其打印出来。6.实验心得通过编写学生管理系统的汇编实验,让我对汇编语言有了很深的了解,对于语言的熟悉度也提高了很多。在编写的过程中遇到了很多的问题,由于汇编语言使用起来比较繁琐(个人感觉),很多内部运行的数据不能很好的呈现出来,所以对数据的保存,处理等方面出现了很大的错误,主要是在字符的输入与二进制的转换,还有就是在数据处理的时候会出现很多标志位,这些标准为对于处理后数据的保存有很大的影响,但是通过课本上的实验例子,对于这些问题基本上都能得到一定的解决。还有就是在需要跳转的时候,由于跳转指令使用对标志位或者条件使用比较灵活,有很多种的跳转指令,这些指令在使用起来是很方便但是由于判断条件很多,可能不小心就出现了跳转出错。还有就是,跳转不到想要跳转的地方。这些问题需要在编写的过程中非常的小心,同时也能将这些指令得使用规则得到一个很好的理解与记忆。总之,在此次的汇编实验的编写过程中,理解了很多在课堂上学习到的知识,也同时记忆了这些指令的使用规则与方法。对于汇编语言有了一定程度的理解与掌握。源程序:DATASSEGMENT;此处输入数据段代码;输入输出提示字符STUDENT_NUMDB'Pleaseinputthenumberofstudents(1-99):','$'STUDENT_INFORMATIONDB0DH,0AH,'Pleaseinputthestudentinformation(classidname):',0DH,0AH,'$'STUDENT_GRADEDB0DH,0AH,'Pleaseinputthestudentgrade(0.0-100.0):',0DH,0AH,'$'AVERAGE_GRADEDB0DH,0AH,'Theaveragegradeis:','$'RESULT1DB0DH,0AH,'Thenumberofstudentin[=90]is:','$';各分数段人数RESULT2DB0DH,0AH,'Thenumberofstudentin[80-90]is:','$'RESULT3DB0DH,0AH,'Thenumberofstudentin[70-80]is:','$'RESULT4DB0DH,0AH,'Thenumberofstudentin[60-70]is:','$'RESULT5DB0DH,0AH,'Thenumberofstudentin[=60]is:','$'GRADE_RANKDB0DH,0AH,'Thegradelist(hightolow)is:',0DH,0AH,'$';打印排名BLANKDB'','$'HUANHANGDB0DH,0AH,'$'KAISHISHUCHUDB0DH,0AH,'***********************************',0DH,0AH,'$';数据NUMBERDB3DUP(0);第一个存个/十位(ASCII码),第二个存个位(ASCII码),第三个存学生数(二进制);用20字节单元表示学生信息,0-19中:0对应最大字符,1对应实际输入,2-18对应输入信息,19对应'$'INFORMATIONDB99DUP(20DUP(0));用7字节单元来存分数,0-6中,0-4对应输入字符,5对应输入整数部分的二进制数,6对应于小数部分的二进制数GRADEDB99DUP(7DUP(0))AVERAGE_GRADE_BUFFERDB2DUP(0);第一个存整数部分(二进制形式),第二个存小数部分(二进制形式)N0DB0;各分数段人数存储区(二进制形式)N1DB0N2DB0N3DB0N4DB0DATASENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:;此处输入代码段代码MOVAX,DATASMOVDS,AXMOVSI,0;指向每个学生信息MOVDI,0;指向每个学生成绩MOVCX,100;初始化学生数MOVDX,OFFSETSTUDENT_NUM;请求输入学生总数MOVAH,09INT21HCALLSTORE_STUDENT_NUM;存储学生总数,结果送cx中CMPCX,0;输入为0退出JLEOUTTODOSCMPCX,100;学生数超出本程序范围,退出JGEOUTTODOSINPUT:MOVDX,OFFSETSTUDENT_INFORMATION;请求输入学生信息MOVAH,09INT21HCALLSTORE_STUDENT_INFORMATION;存储学生信息ADDSI,20;指向下一个学生信息MOVDX,OFFSETSTUDENT_GRADE;请求输入学生成绩MOVAH,09INT21HCALLSTORE_STUDENT_GRADE;存储每个学生成绩ADDDI,7;指向下一个学生LOOPINPUT;循环,直到输入所有学生成绩CALLSORT;排序CALL_DISPLAY;显示结果CALLFIND_RESULT;显示平均成绩和分段人数OUTTODOS:MOVAH,1;任意键结束INT21HMOVAX,4C00H;返回DOSINT21H;******************存储学生数目的函数******************STORE_STUDENT_NUMPROC;调用之后,cx中存储了学生数(二进制)PUSHAXPUSHBXMOVBX,0S1:MOVAH,1INT21HCMPAL,0DH;是否为回车JES2ANDAL,0FH;转换为非压缩的BCD码MOVNUMBER[BX],ALINCBXJMPS1S2:CMPBX,2JGS5;大于2JZS3;等于2;小于2MOVAL,NUMBERJMPS4S3:MOVAH,NUMBERMOVAL,NUMBER+1AAD;BCD码转换为二进制数S4:MOVNUMBER+2,ALMOVCX,0MOVCL,NUMBER+2S5:POPBXPOPAXRETSTORE_STUDENT_NUMENDP;******************存储学生信息的函数******************STORE_STUDENT_INFORMATIONPROCPUSHAXPUSHBXPUSHDXMOVAL,18MOVINFORMATION[SI],ALLEADX,INFORMATION[SI]MOVAH,0AHINT21HMOVBL,INFORMATION[SI+1];实际输入的字符个数MOVAL,''MOVINFORMATION[SI+BX+2],AL;将回车换成''MOVINFORMATION[SI+19],'$';将每个存储单元的最后一个字节置为'$'以便输出POPDXPOPBXPOPAXRETSTORE_STUDENT_INFORMATIONENDP;******************存储学生成绩的函数******************STORE_STUDENT_GRADEPROCPUSHAXPUSHBXPUSHCXPUSHDXMOVBX,0MOVCX,0MOVDX,DIDEAL0:MOVAH,1INT21HCMPAL,0DH;判断是否为回车JZDEAL2;是回车CMPAL,'.';是否为小数点JNZDEAL1;不是小数点MOVBX,CX;bx指向小数点处INCBX;标记小数点字符出现在第几个位置DEAL1:PUSHBXMOVBX,DXMOVGRADE[BX],ALPOPBXINCCX;记录输入字符的个数INCDXJMPDEAL0DEAL2:CMPBX,0JNZDEAL3;有小数点;无小数点CMPCX,3JGGOUT;大于100JZDEAL4;等于100;小于100CMPCX,2JZDEAL5;输入数目为2位数;个位数DEAL6:;处理个位数MOVAL,GRADE[DI]SUBAL,'0'MOVGRADE[DI+5],ALJMPGOUTDEAL5:;处理2位数MOVAH,GRADE[DI]ANDAH,0FHMOVAL,GRADE[DI+1]ANDAL,0FHAADMOVGRADE[DI+5],ALJMPGOUTDEAL4:;处理3位数MOVAL,100MOVGRADE[DI+5],ALJMPGOUTDEAL3:;处理带有小数部分的成绩MOVAL,GRADE[DI+BX];将小数部分处理SUBAL,'0'MOVGRADE[DI+6],ALCMPBX,4JZDEAL4;'.'出现在输入字符的第四位,则输入的整数部分为3位数JGGOUT;整数部分大于3位数CMPBX,3JZDEAL5;'.'出现在输入字符的第三位,则输入的整数部分为2位数JMPDEAL6;否则为个位数GOUT:POPDXPOPCXPOPBXPOPAXRETSTORE_STUDENT_GRADEENDP;******************排序学生成绩的函数******************SORTPROCPUSHAXPUSHBXPUSHCXPUSHDXPUSHSIPUSHDIMOVDX,0MOVDL,NUMBER+2LOOP1:;使用冒泡排序法MOVCX,DXMOVDI,0MOVSI,0LOOP2:;先比整数部分,再比小数部分MOVAL,GRADE[DI+5]CMPAL,GRADE[DI+12]JGNEXT;大于,向下个移动JLSWAP1;小于,交换成绩,名字;等于,比较小数部分MOVAL,GRA