汇编试验报告学生信息管理系统.docx

上传人:b****1 文档编号:1362606 上传时间:2023-04-30 格式:DOCX 页数:27 大小:114.97KB
下载 相关 举报
汇编试验报告学生信息管理系统.docx_第1页
第1页 / 共27页
汇编试验报告学生信息管理系统.docx_第2页
第2页 / 共27页
汇编试验报告学生信息管理系统.docx_第3页
第3页 / 共27页
汇编试验报告学生信息管理系统.docx_第4页
第4页 / 共27页
汇编试验报告学生信息管理系统.docx_第5页
第5页 / 共27页
汇编试验报告学生信息管理系统.docx_第6页
第6页 / 共27页
汇编试验报告学生信息管理系统.docx_第7页
第7页 / 共27页
汇编试验报告学生信息管理系统.docx_第8页
第8页 / 共27页
汇编试验报告学生信息管理系统.docx_第9页
第9页 / 共27页
汇编试验报告学生信息管理系统.docx_第10页
第10页 / 共27页
汇编试验报告学生信息管理系统.docx_第11页
第11页 / 共27页
汇编试验报告学生信息管理系统.docx_第12页
第12页 / 共27页
汇编试验报告学生信息管理系统.docx_第13页
第13页 / 共27页
汇编试验报告学生信息管理系统.docx_第14页
第14页 / 共27页
汇编试验报告学生信息管理系统.docx_第15页
第15页 / 共27页
汇编试验报告学生信息管理系统.docx_第16页
第16页 / 共27页
汇编试验报告学生信息管理系统.docx_第17页
第17页 / 共27页
汇编试验报告学生信息管理系统.docx_第18页
第18页 / 共27页
汇编试验报告学生信息管理系统.docx_第19页
第19页 / 共27页
汇编试验报告学生信息管理系统.docx_第20页
第20页 / 共27页
亲,该文档总共27页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

汇编试验报告学生信息管理系统.docx

《汇编试验报告学生信息管理系统.docx》由会员分享,可在线阅读,更多相关《汇编试验报告学生信息管理系统.docx(27页珍藏版)》请在冰点文库上搜索。

汇编试验报告学生信息管理系统.docx

汇编试验报告学生信息管理系统

学生信息管理系统

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.效果图

输入三人信息,班级学好姓名,然后输入此人成绩。

可以看到三人的按成绩排序,然后将平均值输出,而且统计了各个分数区间的人数。

输入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;各分数段人数存储区(二进制形式)

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;存储学生总数,结果送cx中

CMPCX,0;输入为0退出

JLEOUTTODOS

CMPCX,100;学生数超出本程序范围,退出

JGEOUTTODOS

INPUT:

MOVDX,OFFSETSTUDENT_INFORMATION;请求输入学生信息

MOVAH,09

INT21H

CALLSTORE_STUDENT_INFORMATION;存储学生信息

ADDSI,20;指向下一个学生信息

MOVDX,OFFSETSTUDENT_GRADE;请求输入学生成绩

MOVAH,09

INT21H

CALLSTORE_STUDENT_GRADE;存储每个学生成绩

ADDDI,7;指向下一个学生

LOOPINPUT;循环,直到输入所有学生成绩

CALLSORT;排序

CALL_DISPLAY;显示结果

CALLFIND_RESULT;显示平均成绩和分段人数

OUTTODOS:

MOVAH,1;任意键结束

INT21H

MOVAX,4C00H;返回DOS

INT21H

;******************存储学生数目的函数******************

STORE_STUDENT_NUMPROC;调用之后,cx中存储了学生数(二进制)

PUSHAX

PUSHBX

MOVBX,0

S1:

MOVAH,1

INT21H

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

PUSHAX

PUSHBX

PUSHDX

MOVAL,18

MOVINFORMATION[SI],AL

LEADX,INFORMATION[SI]

MOVAH,0AH

INT21H

MOVBL,INFORMATION[SI+1];实际输入的字符个数

MOVAL,''

MOVINFORMATION[SI+BX+2],AL;将回车换成''

MOVINFORMATION[SI+19],'$';将每个存储单元的最后一个字节置为'$'以便输出

POPDX

POPBX

POPAX

RET

STORE_STUDENT_INFORMATIONENDP

;******************存储学生成绩的函数******************

STORE_STUDENT_GRADEPROC

PUSHAX

PUSHBX

PUSHCX

PUSHDX

MOVBX,0

MOVCX,0

MOVDX,DI

DEAL0:

MOVAH,1

INT21H

CMPAL,0DH;判断是否为回车

JZDEAL2;是回车

CMPAL,'.';是否为小数点

JNZDEAL1;不是小数点

MOVBX,CX;bx指向小数点处

INCBX;标记小数点字符出现在第几个位置

DEAL1:

PUSHBX

MOVBX,DX

MOVGRADE[BX],AL

POPBX

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

MOVGRADE[DI+5],AL

JMPGOUT

DEAL4:

;处理3位数

MOVAL,100

MOVGRADE[DI+5],AL

JMPGOUT

DEAL3:

;处理带有小数部分的成绩

MOVAL,GRADE[DI+BX];将小数部分处理

SUBAL,'0'

MOVGRADE[DI+6],AL

CMPBX,4

JZDEAL4;'.'出现在输入字符的第四位,则输入的整数部分为3位数

JGGOUT;整数部分大于3位数

CMPBX,3

JZDEAL5;'.'出现在输入字符的第三位,则输入的整数部分为2位数

JMPDEAL6;否则为个位数

GOUT:

POPDX

POPCX

POPBX

POPAX

RET

STORE_STUDENT_GRADEENDP

;******************排序学生成绩的函数******************

SORTPROC

PUSHAX

PUSHBX

PUSHCX

PUSHDX

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;大于或等于,向下个移动

JLSWAP1;小于,交换成绩,名字

SWAP1:

MOVBX,SI

SWAP11:

;交换学生信息

MOVAL,INFORMATION[BX+2]

XCHGAL,INFORMATION[BX+22]

MOVINFORMATION[BX+2],AL

INCBX

CMPAL,'$'

JNZSWAP11

PUSHBX

MOVBX,0

SWAP2:

;交换学生成绩

MOVAL,GRADE[DI+BX]

XCHGAL,GRADE[DI+BX+7]

MOVGRADE[DI+BX],AL

INCBX

CMPBX,7

JNZSWAP2

POPBX

NEXT:

ADDSI,20

ADDDI,7

DECCX

JNZLOOP2

DECDX

JNZLOOP1

POPDI

POPSI

POPDX

POPCX

POPBX

POPAX

RET

SORTENDP

;******************显示最后结果的函数******************

FIND_RESULTPROC

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHSI

PUSHDI

MOVBX,0

MOVCX,0

MOVCL,NUMBER+2;cl中保存学生人数

MOVDI,0

MOVSI,0

F1:

MOVAL,GRADE[DI+5]

CMPAL,100

JGFOUT;大于100

JZF90;等于100

;小于100

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)

MOVAL,GRADE[DI+5]

MOVDL,10

MULDL

MOVDL,GRADE[DI+6]

MOVDH,0

ADDAX,DX

ADDBX,AX

JMPF2

FOUT:

POPDI

POPSI

POPDX

POPCX

POPBX

POPAX

F90:

;处理>=90

MOVDL,N0

INCDL

MOVN0,DL

JMPFNEXT

F80:

;处理大于等于80小于90

MOVDL,N1

INCDL

MOVN1,DL

JMPFNEXT

F70:

;处理大于等于70小于80

MOVDL,N2

INCDL

MOVN2,DL

JMPFNEXT

F60:

;处理大于等于60小于70

MOVDL,N3

INCDL

MOVN3,DL

JMPFNEXT

F2:

ADDDI,7

DECCX

JNZF1;处理所有学生

MOVDX,OFFSETKAISHISHUCHU;打印一段************

MOVAH,09

INT21H

MOVDX,OFFSETAVERAGE_GRADE;打印平均成绩

MOVAH,09

INT21H

MOVAX,BX

MOVDX,0

MOVCX,0

MOVCL,NUMBER+2

DIVCX

MOVCL,10

DIVCL

CALLSHOW;先打印平均成绩的整数部分

PUSHAX

MOVDL,'.';打印'.'

MOVAH,2

INT21H

POPAX

MOVAL,AH

CALLSHOW;再打印平均成绩的小数部分

MOVDX,OFFSETRESULT1;输出大于等于90的人数

MOVAH,09

INT21H

MOVAL,N0

CALLSHOW

MOVDX,OFFSETRESULT2;输出大于等于80并小于90的人数

MOVAH,09

INT21H

MOVAL,N1

CALLSHOW

MOVDX,OFFSETRESULT3;输出大于等于70并小于80的人数

MOVAH,09

INT21H

MOVAL,N2

CALLSHOW

MOVDX,OFFSETRESULT4;输出大于等于60并小于70的人数

MOVAH,09

INT21H

MOVAL,N3

CALLSHOW

MOVDX,OFFSETRESULT5;输出小于60的人数

MOVAH,09

INT21H

MOVAL,N4

CALLSHOW

RET

FIND_RESULTENDP

;******************输出分数排序的函数******************

_DISPLAYPROC

PUSHAX

PUSHBX

PUSHCX

PUSHDX

PUSHSI

PUSHDI

MOVDX,OFFSETGRADE_RANK

MOVAH,09

INT21H

MOVCX,0

MOVCL,NUMBER+2;cl中保存学生人数

MOVDI,0

MOVSI,0

D1:

MOVDX,OFFSETINFORMATION

ADDDX,SI

ADDDX,2

MOVAH,09

INT21H

MOVDX,OFFSETBLANK;打印一段空白

MOVAH,09

INT21H

movAl,GRADE[DI+5]

pushax

MOVGRADE[DI+5],'$';将保存成绩的单元中第6个字节置为'$',便于输出

MOVDX,OFFSETGRADE;输出成绩

ADDDX,DI

MOVAH,09

INT21H

popax

movGRADE[DI+5],Al

MOVDX,OFFSETHUANHANG;打印换行

MOVAH,09

INT21H

ADDSI,20

ADDDI,7

DECCX

JNZD1;直至将所有成绩都输出

POPDI

POPSI

POPDX

POPCX

POPBX

POPAX

RET

_DISPLAYENDP

;******************将二进制数输出的函数******************

SHOWPROC

PUSHAX

PUSHDX

PUSHCX

PUSHBX

MOVCL,100

MOVAH,0

DIVCL;将al中的二进制数除以100

MOVBX,AX;保存

CMPAL,0

JZX1;如果商为0,则表示原数小于100

;否则将百位数打印出来

MOVDL,AL

ADDDL,30H

MOVAH,2

INT21H

X1:

MOVAL,BH

MOVAH,0

MOVCL,10

DIVCL;将al中的二进制数除以10

MOVBX,AX;保存

CMPAL,0

JZX2;如果商为0,则表示原数小于10

;否则将十位打印出来

MOVDL,AL

ADDDL,30H

MOVAH,2

INT21H

X2:

;打印个位

MOVDL,BH

ADDDL,30H

MOVAH,2

INT21H

POPBX

POPCX

POPDX

POPAX

RET

SHOWENDP

;****************

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2