汇编试验报告学生信息管理系统Word文档格式.docx
- 文档编号:17444694
- 上传时间:2022-12-01
- 格式:DOCX
- 页数:24
- 大小:114.47KB
汇编试验报告学生信息管理系统Word文档格式.docx
《汇编试验报告学生信息管理系统Word文档格式.docx》由会员分享,可在线阅读,更多相关《汇编试验报告学生信息管理系统Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
显示平均成绩和分段人数
关键算法的流程图:
关于分段人数与总成绩的计算冒泡排序算法:
5.效果图
输入三人信息,班级学好姓名,然后输入此人成绩。
可以看到三人的按成绩排序,然后将平均值输出,而且统计了各个分数区间的人数。
输入5人信息,并将其打印出来。
6.实验心得
通过编写学生管理系统的汇编实验,让我对汇编语言有了很深的了解,对于语言的熟悉度也提高了很多。
在编写的过程中遇到了很多的问题,由于汇编语言使用起来比较繁琐(个人感觉),很多内部运行的数据不能很好的呈现出来,所以对数据的保存,处理等方面出现了很大的错误,主要是在字符的输入与二进制的转换,还有就是在数据处理的时候会出现很多标志位,这些标准为对于处理后数据的保存有很大的影响,但是通过课本上的实验例子,对于这些问题基本上都能得到一定的解决。
还有就是在需要跳转的时候,由于跳转指令使用对标志位或者条件使用比较灵活,有很多种的跳转指令,这些指令在使用起来是很方便但是由于判断条件很多,可能不小心就出现了跳转出错。
还有就是,跳转不到想要跳转的地方。
这些问题需要在编写的过程中非常的小心,同时也能将这些指令得使用规则得到一个很好的理解与记忆。
总之,在此次的汇编实验的编写过程中,理解了很多在课堂上学习到的知识,也同时记忆了这些指令的使用规则与方法。
对于汇编语言有了一定程度的理解与掌握。
源程序:
DATASSEGMENT;
此处输入数据段代码
输入输出提示字符
STUDENT_NUMDB'
Pleaseinputthenumberofstudents(1-99):
'
'
STUDENT_INFORMATIONDB0DH,0AH,'
Pleaseinputthestudentinformation(classidname):
0DH,0AH,'
STUDENT_GRADEDB0DH,0AH,'
Pleaseinputthestudentgrade'
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:
打印排名
BLANKDB'
'
HUANHANGDB0DH,0AH,'
KAISHISHUCHUDB0DH,0AH,'
*****'
数据
第一个存整数部分(二进制形式),第二个存小数部分(二进制形式)
N0DB0;
各分数段人数存储区(二进制形式)
N1DB0
N2DB0
N3DB0
N4DB0
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
此处输入代码段代码
MOVAX,DATAS
MOVDS,AX
MOVSI,0;
指向每个学生信息
MOVDI,0;
指向每个学生成绩
MOVCX,100;
初始化学生数
MOVDX,OFFSETSTUDENT_NUM;
请求输入学生总数
MOVAH,09
INT21H
CALLSTORE_STUDENT_NUM;
CMPCX,0;
输入为0退出
JLEOUTTODOS
CMPCX,100;
学生数超出本程序范围,退出
JGEOUTTODOS
INPUT:
MOVDX,OFFSETSTUDENT_INFORMATION;
请求输入学生信息
CALLSTORE_STUDENT_INFORMATION;
ADDSI,20;
指向下一个学生信息
MOVDX,OFFSETSTUDENT_GRADE;
请求输入学生成绩
CALLSTORE_STUDENT_GRADE;
ADDDI,7;
指向下一个学生
LOOPINPUT;
循环,直到输入所有学生成绩
CALLSORT;
排序
CALL_DISPLAY;
CALLFIND_RESULT;
OUTTODOS:
MOVAH,1;
任意键结束
MOVAX,4C00H;
返回DOS
存储学生数目的函数
STORE_STUDENT_NUMPROC;
调用之后,cx中存储了学生数(二进制)
PUSHAX
PUSHBX
MOVBX,0
S1:
MOVAH,1
CMPAL,0DH;
是否为回车
JES2
ANDAL,0FH;
转换为非压缩的BCD码
MOVNUMBER[BX],AL
INCBX
JMPS1
S2:
CMPBX,2
JGS5;
大于2
JZS3;
等于2
小于2
MOVAL,NUMBER
JMPS4
S3:
MOVAH,NUMBER
MOVAL,NUMBER+1
AAD;
BCD码转换为二进制数
S4:
MOVNUMBER+2,AL
MOVCX,0
MOVCL,NUMBER+2
S5:
POPBX
POPAX
RET
STORE_STUDENT_NUMENDP
存储学生信息的函数
STORE_STUDENT_INFORMATIONPROC
PUSHDX
MOVAL,18
MOVINFORMATION[SI],AL
LEADX,INFORMATION[SI]
MOVAH,0AH
MOVBL,INFORMATION[SI+1];
实际输入的字符个数
MOVAL,'
MOVINFORMATION[SI+BX+2],AL;
将回车换成'
MOVINFORMATION[SI+19],'
将每个存储单元的最后一个字节置为'
以便输出
POPDX
STORE_STUDENT_INFORMATIONENDP
存储学生成绩的函数
STORE_STUDENT_GRADEPROC
PUSHCX
MOVDX,DI
DEAL0:
判断是否为回车
JZDEAL2;
是回车
CMPAL,'
.'
是否为小数点
JNZDEAL1;
不是小数点
MOVBX,CX;
bx指向小数点处
INCBX;
标记小数点字符出现在第几个位置
DEAL1:
MOVBX,DX
MOVGRADE[BX],AL
INCCX;
记录输入字符的个数
INCDX
JMPDEAL0
DEAL2:
CMPBX,0
JNZDEAL3;
有小数点
无小数点
CMPCX,3
JGGOUT;
大于100
JZDEAL4;
等于100
小于100
CMPCX,2
JZDEAL5;
输入数目为2位数
个位数
DEAL6:
处理个位数
MOVAL,GRADE[DI]
SUBAL,'
0'
MOVGRADE[DI+5],AL
JMPGOUT
DEAL5:
处理2位数
MOVAH,GRADE[DI]
ANDAH,0FH
MOVAL,GRADE[DI+1]
ANDAL,0FH
AAD
DEAL4:
处理3位数
MOVAL,100
DEAL3:
处理带有小数部分的成绩
MOVAL,GRADE[DI+BX];
将小数部分处理
MOVGRADE[DI+6],AL
CMPBX,4
出现在输入字符的第四位,则输入的整数部分为3位数
整数部分大于3位数
CMPBX,3
出现在输入字符的第三位,则输入的整数部分为2位数
JMPDEAL6;
否则为个位数
GOUT:
POPCX
STORE_STUDENT_GRADEENDP
排序学生成绩的函数
SORTPROC
PUSHSI
PUSHDI
MOVDX,0
MOVDL,NUMBER+2
LOOP1:
使用冒泡排序法
MOVCX,DX
MOVDI,0
MOVSI,0
LOOP2:
先比整数部分,再比小数部分
MOVAL,GRADE[DI+5]
CMPAL,GRADE[DI+12]
JGNEXT;
大于,向下个移动
JLSWAP1;
小于,交换成绩,名字
等于,比较小数部分
MOVAL,GRADE[DI+6]
CMPAL,GRADE[DI+13]
JGENEXT;
大于或等于,向下个移动
SWAP1:
MOVBX,SI
SWAP11:
交换学生信息
MOVAL,INFORMATION[BX+2]
XCHGAL,INFORMATION[BX+22]
MOVINFORMATION[BX+2],AL
JNZSWAP11
SWAP2:
交换学生成绩
MOVAL,GRADE[DI+BX]
XCHGAL,GRADE[DI+BX+7]
MOVGRADE[DI+BX],AL
CMPBX,7
JNZSWAP2
NEXT:
ADDSI,20
ADDDI,7
DECCX
JNZLOOP2
DECDX
JNZLOOP1
POPDI
POPSI
SORTENDP
显示最后结果的函数
FIND_RESULTPROC
MOVCL,NUMBER+2;
cl中保存学生人数
F1:
CMPAL,100
JGFOUT;
JZF90;
CMPAL,90
JGEF90;
大于等于90
小于90
CMPAL,80
JGEF80;
大于等于80
小于80
CMPAL,70
JGEF70;
大于等于70
小于70
CMPAL,60
JGEF60;
大于等于60
小于60
处理<
60
MOVDL,N4
INCDL
MOVN4,DL
FNEXT:
处理平均成绩处理方式:
整数部分*10+小数部分,结果先除以学生人数,再输出(输出整数时除以10)
MOVDL,10
MULDL
MOVDL,GRADE[DI+6]
MOVDH,0
ADDAX,DX
ADDBX,AX
JMPF2
FOUT:
F90:
处理>
=90
MOVDL,N0
MOVN0,DL
JMPFNEXT
F80:
处理大于等于80小于90
MOVDL,N1
MOVN1,DL
F70:
处理大于等于70小于80
MOVDL,N2
MOVN2,DL
F60:
处理大于等于60小于70
MOVDL,N3
MOVN3,DL
F2:
JNZF1;
处理所有学生
MOVDX,OFFSETKAISHISHUCHU;
打印一段
MOVDX,OFFSETAVERAGE_GRADE;
打印平均成绩
MOVAX,BX
DIVCX
MOVCL,10
DIVCL
CALLSHOW;
先打印平均成绩的整数部分
MOVDL,'
打印'
MOVAH,2
MOVAL,AH
再打印平均成绩的小数部分
MOVDX,OFFSETRESULT1;
输出大于等于90的人数
MOVAL,N0
CALLSHOW
MOVDX,OFFSETRESULT2;
输出大于等于80并小于90的人数
MOVAL,N1
MOVDX,OFFSETRESULT3;
输出大于等于70并小于80的人数
MOVAL,N2
MOVDX,OFFSETRESULT4;
输出大于等于60并小于70的人数
MOVAL,N3
MOVDX,OFFSETRESULT5;
输出小于60的人数
MOVAL,N4
FIND_RESULTENDP
输出分数排序的函数
_DISPLAYPROC
MOVDX,OFFSETGRADE_RANK
D1:
MOVDX,OFFSETINFORMATION
ADDDX,SI
ADDDX,2
MOVDX,OFFSETBLANK;
打印一段空白
movAl,GRADE[DI+5]
pushax
MOVGRADE[DI+5],'
将保存成绩的单元中第6个字节置为'
,便于输出
MOVDX,OFFSETGRADE;
输出成绩
ADDDX,DI
popax
movGRADE[DI+5],Al
MOVDX,OFFSETHUANHANG;
打印换行
JNZD1;
直至将所有成绩都输出
_DISPLAYENDP
将二进制数输出的函数
SHOWPROC
MOVCL,100
MOVAH,0
DIVCL;
将al中的二进制数除以100
MOVBX,AX;
保存
CMPAL,0
JZX1;
如果商为0,则表示原数小于100
否则将百位数打印出来
MOVDL,AL
ADDDL,30H
X1:
MOVAL,BH
将al中的二进制数除以10
JZX2;
如果商为0,则表示原数小于10
否则将十位打印出来
X2:
打印个位
MOVDL,BH
SHOWENDP
子程序结束
CODESENDS
ENDSTART
代码段结束
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 试验报告 学生 信息管理 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)