学生成绩排名汇编语言综合实验报告.docx
《学生成绩排名汇编语言综合实验报告.docx》由会员分享,可在线阅读,更多相关《学生成绩排名汇编语言综合实验报告.docx(20页珍藏版)》请在冰豆网上搜索。
![学生成绩排名汇编语言综合实验报告.docx](https://file1.bdocx.com/fileroot1/2022-11/26/82d11ece-4ae4-4b74-b9b8-155a9e2fc6f4/82d11ece-4ae4-4b74-b9b8-155a9e2fc6f41.gif)
学生成绩排名汇编语言综合实验报告
华北科技学院综合性
实验报告
课程名称汇编语言
实验学期2011至2012学年第1学期
学生所在系部计算机学院网络工程系
年级2009专业班级网络B091
学生姓名罗希学号200907024114
任课教师李冬艳
实验成绩
计算机学院制
《汇编语言》课程综合性实验报告
开课实验室:
软件一实验室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打印排序名单。
输入界面:
首先调用INPUT功能输入学号,姓名,成绩,存入BUFF1,BUFF2,BUFF3缓存中,此时的输入顺序就是他们排名。
再调用COPY将3个缓存中的数据保存在NUBER,SNAME,SCORE1中。
此时再调用CHANG功能把SCORE1中的成绩转换成2进制存到SCORE2中。
用冒泡排序法从高到低进行排序,此时SCORE2的顺序改变,顺序号也改变,而NUBER,SNAME,SCORE1中的数据都不改变。
最后,调用PRINT方法输出,按照成绩降序进行输出。
根据他们的顺序号找出他们在NUBER,SNAME,SCORE1中的学号,姓名,成绩输出。
子程序流程图:
主程序:
INPUT子程序:
主要代码分析:
LEADX,INFOR1
MOVAH,9
INT21H
LEADX,BUFF1
MOVAH,10
INT21H
MOVAL,BUFF1+1
ADDAL,2
MOVAH,0
MOVSI,AX
MOVBUFF1[SI],0
此代码是输入姓名的代码,首先讲缓存区BUFF1的偏移地址给DX调用10号功能输入一个字符串,然后将回车0D所在位置换为0便于输出显示。
子程序COPY:
关键代码分析:
MOVCX,N+1
LEASI,BUFF1+2
LEADI,SNAME
ADDDI,SIGN1
CLD
REPMOVSB
MOVCX,N
MOVAX,'$'
LEADI,BUFF1+2
REPSTOSB
CX为姓名长度,将缓存区的姓名传入到SNAME中,SIGN1为他们的间隔,传完之后再将缓存区的数据清空,全部设置为$。
学号和成绩也是如此。
子程序CHANGE:
关键代码:
REPT2:
MOVAL,[SI]
CMPAL,30H
JLEXIT1
CMPAL,39H
JGEXIT1
ANDAX,000FH
XCHGAX,X
MOVDX,10
MULDX
ADDX,AX
INCSI
LOOPREPT2
MOVAX,X
MOVSCORE2[DI],AX
MOVX,0
ADDSIGN2,2
将成绩位数给CX,从BUFF2中取出第一位数给AL,然后去掉ASCII码再将它与10相乘,再与X相加得到二进制成绩数最后存入到SCORE2中。
子程序SORT:
关键代码分析:
MOVCX,P
DECCX
LOOP1:
PUSHCX
MOVBX,0
MOVSI,0
LOOP2:
MOVAX,SCORE2[BX]
CMPAX,SCORE2[BX+M+1]
JGENEXT
XCHGAX,SCORE2[BX+M+1]
MOVSCORE2[BX],AX
MOVAL,MINGCI[SI]
XCHGAL,MINGCI[SI+1]
MOVMINGCI[SI],AL
NEXT:
ADDBX,M+1
INCSI
LOOPLOOP2
POPCX
LOOPLOOP1
RET
采用了冒泡排序的方法,将SCORE2表中的成绩从大到小排序,MINGCI中的顺序也同时按照成绩高低排序。
子程序print:
:
关键代码:
MOVAX,0
MOVAL,MINGCI[DI]
DECAL
MOVBL,9
MULBL
LEADX,SNAME
ADDDX,AX
MOVAH,9
INT21H
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
INT21H
取出它的名次,根据名次知道了它的输入时顺序,计算它的名字在SNAME中的位置。
找到了它的名字然后输出名字。
学号,成绩也是如此。
全部代码:
DATASSEGMENT
INFOR0DB0AH,0DH,'SORT=$'
INFOR1DB0AH,0DH,'INPUTNAME:
$'
INFOR2DB0AH,0DH,'INPUTSCORE:
$'
INFOR3DB0AH,0DH,'INPUTNUMBER:
$'
OUT1DB'NUBER:
$'
OUT2DB'NAME:
$'
OUT3DB'SCORE:
$'
NEQU8
MEQU4
FEQU3
PEQU3
QEQU3
BUFF3DBF,?
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?
SIGN1DW0
SIGN2DW0
SIGN3DW0
CONTDB'1'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
MAINPROCFAR
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
MOVBX,0
MOVCX,0
CALLINPUT
CALLSORT
CALLPRINT
MOVAH,4CH
INT21H
MAINENDP
INPUTPROC
INCBX
CMPBX,P
JAEXIT
LEADX,INFOR3
MOVAH,9
INT21H
LEADX,BUFF3
MOVAH,10
INT21H
MOVAL,BUFF3+1
ADDAL,2
MOVAH,0
MOVSI,AX
MOVBUFF3[SI],0
LEADX,INFOR1
MOVAH,9
INT21H
LEADX,BUFF1
MOVAH,10
INT21H
MOVAL,BUFF1+1
ADDAL,2
MOVAH,0
MOVSI,AX
MOVBUFF1[SI],0
LEADX,INFOR2
MOVAH,9
INT21H
LEADX,BUFF2
MOVAH,10
INT21H
MOVAL,BUFF2+1
ADDAL,2
MOVAH,0
MOVSI,AX
MOVBUFF2[SI],0
MOVMINGCI[BX-1],BL
CMPBX,1
JZLET1
ADDSIGN1,N+1
ADDSIGN2,Q
ADDSIGN3,F+1
LET1:
CALLCOPY
JMPINPUT
EXIT:
RET
INPUTENDP
COPYPROC
MOVCX,F+1
LEASI,BUFF3+2
LEADI,NUMBER
ADDDI,SIGN3
CLD
REPMOVSB
MOVCX,F
MOVAX,'$'
LEADI,BUFF3+2
REPSTOSB
MOVCX,N+1
LEASI,BUFF1+2
LEADI,SNAME
ADDDI,SIGN1
CLD
REPMOVSB
MOVCX,N
MOVAX,'$'
LEADI,BUFF1+2
REPSTOSB
MOVCX,M+1
LEASI,BUFF2+2
LEADI,SCORE1
ADDDI,SIGN2
CLD
REPMOVSB
LEASI,BUFF2+2
MOVDI,SIGN2
CALLCHANGE
RET
COPYENDP
CHANGEPROC
MOVX,0
MOVCX,[SI-1]
ANDCX,000FH
REPT2:
MOVAL,[SI]
CMPAL,30H
JLEXIT1
CMPAL,39H
JGEXIT1
ANDAX,000FH
XCHGAX,X
MOVDX,10
MULDX
ADDX,AX
INCSI
LOOPREPT2
MOVAX,X
MOVSCORE2[DI],AX
MOVX,0
ADDSIGN2,2
EXIT1:
RET
CHANGEENDP
SORTPROC
MOVCX,P
DECCX
LOOP1:
PUSHCX
MOVBX,0
MOVSI,0
LOOP2:
MOVAX,SCORE2[BX]
CMPAX,SCORE2[BX+M+1]
JGENEXT
XCHGAX,SCORE2[BX+M+1]
MOVSCORE2[BX],AX
MOVAL,MINGCI[SI]
XCHGAL,MINGCI[SI+1]
MOVMINGCI[SI],AL
NEXT:
ADDBX,M+1
INCSI
LOOPLOOP2
POPCX
LOOPLOOP1
RET
SORTENDP
PRINTPROC
LEADX,INFOR0
MOVAH,9
INT21H
MOVCX,P
MOVBX,0
MOVAX,0
MOVDI,0
REPT3:
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
INT21H
MOVDL,CONT
MOVAH,2
INT21H
INCCONT
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
INT21H
MOVAX,0
MOVAL,MINGCI[DI]
DECAL
MOVBL,4
MULBL
LEADX,NUMBER
ADDDX,AX
MOVAH,9
INT21H
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
INT21H
MOVAX,0
MOVAL,MINGCI[DI]
DECAL
MOVBL,9
MULBL
LEADX,SNAME
ADDDX,AX
MOVAH,9
INT21H
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
INT21H
MOVAX,0
MOVBX,0
MOVAL,MINGCI[DI]
DECAL
MOVBL,5
MULBL
LEADX,SCORE1
ADDDX,AX
MOVAH,9
INT21H
INCDI
LOOPREPT3
RET
PRINTENDP
CODESENDS
ENDSTART
收获体会:
通过这次的汇编程序,我从中学习到了很多知识。
虽然刚开始的时候遇到了很多难题,但是通过与老师、同学的交流之后,逐步克服了一个个的难题。
提高了自己编程的思维能力,在将来的学习,生活之中能够快速的解决问题。
汇编相对于别的编程语言而言,难度是比较大。
汇编是直接对CUP进行操作,能够直接控制计算机编程。
由于汇编不像JAVA那样的高级编程语言面向对象,在编程的时候思维有点乱,容易出错,而且小的错误也不容易找到,特别是程序代码长的时候。
子程序INPUT的程序中主要有三个部分:
学号输入,姓名输入,成绩输入,它们都设有缓区,分别为BUFF1,BUFF2,BUFF3。
输入方式是调用了10号功能,输入一个字符串,长度也已经在之前设计好了。
学号,姓名,成绩都是相同的输入方式,在输入完之后,由于最后一个回车符会被接收,所以,在每次输入完之后,将最后的回车符换为0,便于输出显示。
同时也将它们的次序保存到MINGCI之中。
学号,姓名,成绩输入完成后,子程序INPUT再调用COPY将缓存区转存到学号,姓名,成绩存储单元之中。
子程序COPY的设计业分为三个部分:
学号转存,姓名转存,成绩转存。
三个数据的转存方法也相同的。
首先将长度传给CX寄存器,再将源目标地址和目的地址分别给SI和DI,再调用REPMOVSB进行串传送,传送完成之后,要将原来的BUFF缓存区清空,全部设置为$。
但是由于成绩是以十进制保存的,所以还要转换为二进制。
则在子程序COPY中调用CHANGE程序
子程序CHANGE,次程序主要是将缓存区的成绩转换成二进制并保存到SCORE2中,其中用刀了LOOP循环,首先,将成绩位数赋值给CX,X置0,取出成绩的最高位。
与000F相与,保存最低4位,也就是转换成二进制。
X再乘10。
加上成绩的这一位十进制值。
指针下移到下一个再进行循环知道全部完成。
最后将转换好的十进制数存入SCORE2之中。
子程序SORT,次程序主要运用了冒泡排序法,先将学生人数减1给CX,再将CX入栈保存外循环。
先拿出前两个人的成绩比较,若前者大于后者,则转入下一个,若小于,则交换他们的顺序,同时也要交换MINGCI存储器之中的顺序。
第一次冒泡排完之后,CX出栈,再进行第二次,直到最后结束。
子程序PRINT,将学生的学号,姓名,成绩,按照成绩降序输出。
其中关键是要利用MINGCI中排好的顺序分别找到学生的,学号,姓名,成绩所在的位置,进行输出。
教师评价
评定项目
A
B
C
D
评定项目
A
B
C
D
算法正确
操作熟练
程序结构合理
实验结果正确
语法、语义正确
文字流畅、报告规范
其他:
评价教师签名:
李冬艳
2011年12月16日