学生成绩排名汇编语言综合实验报告.docx

上传人:b****3 文档编号:3960857 上传时间:2022-11-26 格式:DOCX 页数:20 大小:132.63KB
下载 相关 举报
学生成绩排名汇编语言综合实验报告.docx_第1页
第1页 / 共20页
学生成绩排名汇编语言综合实验报告.docx_第2页
第2页 / 共20页
学生成绩排名汇编语言综合实验报告.docx_第3页
第3页 / 共20页
学生成绩排名汇编语言综合实验报告.docx_第4页
第4页 / 共20页
学生成绩排名汇编语言综合实验报告.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

学生成绩排名汇编语言综合实验报告.docx

《学生成绩排名汇编语言综合实验报告.docx》由会员分享,可在线阅读,更多相关《学生成绩排名汇编语言综合实验报告.docx(20页珍藏版)》请在冰豆网上搜索。

学生成绩排名汇编语言综合实验报告.docx

学生成绩排名汇编语言综合实验报告

华北科技学院综合性

实验报告

 

课程名称汇编语言

实验学期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日

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

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1