显示学生名次表-汇编语言程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告须知

1、学生上交实验报告时,必须为打印稿(A4纸)。页面空间不够,可以顺延。

2、学生应该填写的内容包括:封面相关栏目、实验地点、时间、目的、设备环境、

内容、结果及分析等。

3、教师应该填写的内容包括:实验成绩、教师评价等。

4、教师根据本课程的《综合性实验指导单》中实验内容的要求,评定学生的综合

性实验成绩;要求在该课程期末考试前将实验报告交给任课教师。综合性实验中,所涉及的程序,文档等在交实验报告前,拷贝给任课教师。任课教师统一刻录成光盘,与该课程的期末考试成绩一同上交到系里存档。

5、未尽事宜,请参考该课程的实验大纲和教学大纲。

《汇编语言》课程综合性实验报告

开课实验室:软件实验室一2014-01-24

实验题目显示学生名次表

一、实验目的

进行汇编语言程序设计应用的综合性训练。综合运用汇编语言循环程序、子程序、宏指令编程方法,提高汇编语言程序设计能力的应用水平。

二、设备与环境

PC兼容机、Windows操作系统、汇编程序masm for windows2012

三、实验内容

实验内容:编制一程序,要求接收从键盘输入的一个班的学生的学号、姓名、成绩,对学生的成绩进行排序,再按学号顺序和学生名次顺序分别把学生成绩显示出来。

实验要求:1.必须画流程图。2.本程序要求要有多重循环和子程序及宏,其中成绩输入、计算学生名次、显示学生名次都分别用子程序,也可用宏处理。3.要求用菜单选择,输入1时按学号顺序输出成绩(包括姓名、学号、成绩、名次),输入2时按成绩排名顺序输出成绩(包括姓名、学号、成绩、名次)。文档由风行下载2014正式版官方下载/ /分享

四.实验结果及分析:

实验完成的功能是从键盘输入学生的姓名,按成绩升序排序,并显示出排序结果。

这是较大的程序,采用模块化结构将功能分解,用子程序调用嵌套实现。程序的关键之处在于从键盘输入的姓名和成绩都是ASCII码,排序时成绩要变成二进制数或BCD码。另外在排序的时候成绩的顺序和姓名的顺序都要随之改变,这样才能在比较之后显示正确的结果。

本程序主要使用了主程序和5个子程序。子程序分别是input键盘输入,copy 数据转存,change十进制数ASCII码转换为二进制,sort按成绩排序和print打印排序名单。输入的人数用变量P来控制,在本程序中,P=3,即表示输入三名学生的姓名和成绩。姓名和成绩的输入分别用DOS中断调用的10号功能实现字串输入。由于10号功能可以设定输入的字符个数和获得实际输入个数,使用方便。但输入最后字符之后,回车符ODH也被保存了;需要将其改为0,便于输出时直接调用9号功能显示姓名和成绩。创建缓冲区buffer1和buffer2,将姓名和成绩保存在缓冲区中,然后将所有人的姓名和成绩用串传送指令转存到sname和score1中保存,打印输出时可以利用。将score1中成绩的十进制数ASCII码转换为二进制数score2.然后将score2中的成绩排序,同时将保存在mingci中的输入次序号也一起交换,以次序号作为排序指针,在sname和score1中查找相应的人名和成绩。打印排序名单是,从mingci中取出次序号作为位移量,到sname和score1中取出姓名和对应的成绩用9号功能显示。排序后mingci中线取出的次序号一定是成绩最高的人的,其他的以此类推。

程序流程图:

代码解释:

;子程序1,输入姓名,成绩

input proc

inc bx;输入次数统计

cmp bx,p;输入次数>p?

ja exit;高于则转移到exit处

lea dx,infor1;显示提示1

mov ah,9

int21h

lea dx,buff1;输入姓名

mov ah,10

int21h

mov al,buff1+1;实际输入个数-->al

add al,2;+2,包含buffer1的0,1号单元

mov ah,0

mov si,ax;回车0d所在的位置,跟在最后一个字符后mov buff1[si],0;将0d换为0,便于输出显示

lea dx,infor2;显示提示2

mov ah,9

int21h

lea dx,buff2;输入成绩

mov ah,10

int21h

mov al,buff2+1;实际输入个数

add al,2;个数+2,包含0,1单元,为找到0d

mov ah,0

mov si,ax

mov buff2[si],0;将0d换为0,便于输出显示

mov mingci[bx-1],bl;bx为输入次数,保存输入的次序

cmp bx,1;第一次输入转let1

jz let1

add sign1,n+1;姓名间隔为n+1

add sign2,q;成绩间隔为q

let1:

call copy;子程序嵌套

jmp input

exit:

ret

input endp

;子程序2,数据转存

copy proc

mov cx,n+1;姓名长度+1(包含$)

lea si,buff1+2

lea di,sname;姓名传到sname

add di,sign1;加上间隔值

cld

rep movsb

mov cx,n

mov ax,'$';用$覆盖姓名去,,清除已输入的姓名lea di,buff1+2

rep stosb

mov cx,m+1;成绩位数加1(包含$)

lea si,buff2+2

lea di,score1;成绩传到score1

add di,sign2;加上间隔值

cld

rep movsb

lea si,buff2+2

mov di,sign2

call change;二进制成绩----score2

ret

copy endp

;子程序3,十进制数ascii码----二进制

change proc

mov x,0

mov cx,[si-1];成绩的位数----cx

and cx,000fh;保留低4位

相关文档
最新文档