汇编语言显示学生名次表实验报告_第1页
汇编语言显示学生名次表实验报告_第2页
汇编语言显示学生名次表实验报告_第3页
汇编语言显示学生名次表实验报告_第4页
汇编语言显示学生名次表实验报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、湖北科技学院计算机学院 汇编语言课程设计 课题题目: 显示学生名次表 学生姓名: 学 号: 班 级: 2013年 12 月26日一、 实验目的进行汇编语言程序设计应用的综合性训练。综合运用汇编语言循环程序和子程序编程方法,巩固提高汇编语言程序设计能力应用水平。二、 设备与环境PC兼容机、Windows操作系统、汇编程序masm for windows 2010三、实验内容实验内容: 编制一程序,要求接收从键盘输入的一个班的学生成绩和学号,对学生的成绩进行排序,再按学号顺序和学生名次顺序分别把学生成绩显示出来。四、实验结果及分析实验功能:从键盘输入学生姓名和成绩,按照成绩的高低排名显示输出。程序

2、中设定的名字是英文的,需要小于9位字母,学生人数为3个。程序思路:1、本程序包括一个主程序和五个子程序。子程序包括INPUT键盘输入、COPY数据转存、CHANGE十进制数ASCII码转二进制、SORT按成绩排序和PRINT打印班级名单。2、用变量p控制输入的学生的个数。本程序中,p=3。3、姓名和成绩输入分别用DOS中被调用的10号功能实现字符串输入。在输入最后字符后,要将回车符改为0,以便输出时直接用9号功能显示姓名和成绩。4、用buffer1和buffer2作为键入的姓名和成绩的缓存区,然后将所有人名和成绩用串传送指令转到smane和score1中保存,打印输出是可以使用。5、将scor

3、e1中成绩的十进制数ASCII码转换为二进制数score2. 6、将score2中的成绩排序,同时将保存在mingci中的输入次序号也一换,以次序号作为排序指针,在smane和score1中查找相应的人名和成绩。7、打印排序名单时,从mingci中取出次序号作为位移量,到smane和score1中取出姓名和对应的成绩用9号功能显示。排序后mingci中先取出的次序号一定是成绩最高的人的,其他类推。程序代码、代码解析及流程图主程序: 流程图:START:main proc farMOV AX,DATAS MOV DS,AX mov es,ax mov bx,0 mov cx,0 call inp

4、ut call sort call print mov ah,4ch int 21hmain endp数据段定义:DATAS SEGMENT infor0 db 0ah,0dh,'sort= $' infor1 db 0ah,0dh,'input name: $' infor2 db 0ah,0dh,'input score:$' n equ 15 ;姓名长度 m equ 4 ;成绩长度(3位+回车) p equ 4 ;输入的人数(4个 q equ 3 ;成绩位数 buff1 db n,?,n dup(0),'$' ;姓名缓冲区,

5、加$以便输出 buff2 db n,?,n dup(0),'$' ;成绩缓冲区 sname db p dup(n+1 dup(0) ;保存姓名 score1 dw p dup(m+1 dup(0) ;保存成绩 score2 dw p dup(m+1 dup(0) mingci db p dup(0) ;名次 x dw ? sign1 dw 0 sign2 dw 0 cont db '1' ;计数DATAS ENDS子程序(INPUT) 1:输入姓名、成绩input proc inc bx ;输入次数统计 cmp bx,p ;输入次数 ja exit lea dx

6、,infor1 ;显示提示1 mov ah,9 int 21h lea dx,buff1 ;输入姓名 mov ah,10 int 21h mov al,buff1+1 ;实际输入个数,al add al,2 ;+2,包含buffer1的0,1号单元 mov ah,0 mov si,ax ;回车od所在位置,跟在最后一个字符后 mov buff1si,0 ;将od换为0,便于输出显示 lea dx,infor2 ;显示提示2 mov ah,9 int 21h lea dx,buff2 ;输入成绩 mov ah,10 int 21h mov al,buff2+1 ;实际输入个数 add al,2

7、;个数+2,包含0,1单元找到od mov ah,0 mov si,ax mov buff2si,0 ;将od换为0,便于输出显示 mov mingcibx-1,bl ;bx为输入次数,保存输入次序 cmp bx,1 ;第一次输入转let1 jz let1 add sign1,n+1 ;姓名间隔为n+1 add sign2,q ;成绩间隔为qlet1: call copy ;子程序嵌套 jmp inputexit: retinput endp流程图: 子程序2(COPY):数据转存copy proc mov cx,n+1 ;姓名长度+1(包含$) lea si,buff1+2 lea di,s

8、name ;姓名传送到sname add di,sign1 ;加上间隔值 cld rep movsb mov cx,n mov ax,'$' ;用$覆盖姓名区,清除已输入的姓名 lea di,buff1+2 rep stosb mov cx,m+1 ;成绩位数+1(包含s) lea si,buff2+2 lea di,score1 ;成绩传送到scorel add di,sign2 ;加上间隔值 cld rep movsb lea si,buff2+2 mov di,sign2 call change ;二进制成绩,scorel2 retcopy endp流程图:子程序3(CH

9、ANGE):十进制数ASCII码二进制change proc mov x,0 mov cx,si-1 ;成绩的位数,cx and cx,000fh ;保留低4位rept2: mov al,si ;按位取出成绩 cmp al,30h ;是否在09之间 jl exit1 cmp al,39h jg exit1 and ax,000fh ;去掉ASCII码 xchg ax,x mov dx,10 ;将ax中前一次形成的数扩大10倍 mul dx add x,ax ;保存到x inc si loop rept2 mov ax,x ;按十进制形成的成绩以二进制保存 mov score2di,ax ;二进

10、制成绩送入score2 mov x,0 add sign2,2 ;下一个成绩单exit1: retchange endp 流程图 子程序4(SPORT):按成绩排序 sort proc mov cx,p ;数组长度 dec cxloop1:push cx ;保存外循环次数 mov bx,0 mov si,0loop2:mov ax,score2bx cmp ax,score2bx+m+1 ;m+1=5 jge next ;降序 xchg ax,score2bx+m+1;交换成绩 mov score2bx,ax mov al,mingcisi xchg al,mingcisi+1 ;交换成绩 m

11、ov mingcisi,alnext:add bx,m+1 ;下一个成绩 inc si loop loop2 pop cx ;恢复外循环次数 loop loop1 ret sort endp 子程序子程序5(PRINT):打印排序名单 print proc lea dx,infor0 ;显示结果提示 mov ah,9 int 21h mov cx,p mov bx,0 mov ax,0 mov di,0rept3:mov dl,0ah ;回车换行mov ah,2int 21hmov dl,0dhint 21hmov dl,cont ;显示名次序号mov ah,2int 21hinc contm

12、ov dl,0ah ;回车换行mov ah,2int 21hmov dl,0dhint 21hmov ax,0mov al,mingcidi ;取名次dec al ;位置-1,因为地址从0开始mov bl,9 ;姓名位置=al×9(包含$)mul bllea dx,snameadd dx,ax ;偏移地址+姓名位移量mov ah,9 ;显示名字int 21hmov dl,0ah ;回车换行mov ah,2int 21hmov dl,0dhint 21hmov ax,0mov bx,0mov al,mingcidi ;取名次dec al ;地址从0开始mov bl,5 ;成绩位移量=a

13、l×5(包含$)mul bllea dx,score1add dx,ax ;显示成绩mov ah,9int 21hinc diloop rept3retprint endpcodes endsEND START 流程图运行结果:实验体会:在复杂的程序设计中,采用模块化结构可以划分功能、分界程序,使得程序有复杂变简单,变清晰。主程序和子程序之间嵌套使用,使得写代码时思路更清楚明白,读代码时方便快捷清晰明了。这点跟高级编程语言类似。而此程序中变量p可以跟踪并控制输入的人数、输名字要预留缓存区、十进制码要和二进制码间相互转换,这些又体现了编程低级语言的特点。学习汇编语言,重要的事掌握如何通

14、过汇编指令和程序来控制计算机各个组成部件工作,完成一系列任务。因此,学习汇编用语言与学习高级语言的不同之处是要学习如何深入到计算机的内部进行控制。通过这次实验,加深了我对汇编语言的理解。每一步的输入、存储、转换、输出,都需要一条条的汇编指令执行。而且每一步都有自己的源和目标的地址,每个数据都有自己的存储空间和地址,我们可以很清晰的“跟踪”每一个数据的变化和地址的转移。程序:DATA SEGMENT infor0 db 0ah,0dh,'sort= $' infor1 db 0ah,0dh,'input name: $' infor2 db 0ah,0dh,

15、9;input score:$' n equ 15 ;姓名长度 m equ 4 ;成绩长度(3位+回车) p equ 4 ;输入的人数(4个 q equ 3 ;成绩位数 buff1 db n,?,n dup(0),'$' ;姓名缓冲区,加$以便输出 buff2 db m,?,m dup(0),'$' ;成绩缓冲区 sname db p dup(n+1 dup(0) ;保存姓名 score1 dw p dup(m+1 dup(0) ;保存成绩 score2 dw p dup(m+1 dup(0) mingci db p dup(0) ;名次 x dw ?

16、sign1 dw 0 sign2 dw 0 cont db '1' ;计数DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:main proc far MOV AX,DATA MOV DS,AX mov es,ax mov bx,0 mov cx,0 call input call sort call print mov ah,4ch int 21hmain endp ;子程序1,输入姓名、成绩input proc inc bx ;输入次数统计 cmp bx,p ;输入次数 ja exit lea dx,infor1 ;显示提示

17、1 mov ah,9 int 21h lea dx,buff1 ;输入姓名 mov ah,10 int 21h mov al,buff1+1 ;实际输入个数,al add al,2 ;+2,包含buffer1的0,1号单元 mov ah,0 mov si,ax ;回车od所在位置,跟在最后一个字符后 mov buff1si,0 ;将od换为0,便于输出显示 lea dx,infor2 ;显示提示2 mov ah,9 int 21h lea dx,buff2 ;输入成绩 mov ah,10 int 21h mov al,buff2+1 ;实际输入个数 add al,2 ;个数+2,包含0,1单元

18、找到od mov ah,0 mov si,ax mov buff2si,0 ;将od换为0,便于输出显示 mov mingcibx-1,bl ;bx为输入次数,保存输入次序 cmp bx,1 ;第一次输入转let1 jz let1 add sign1,n+1 ;姓名间隔为n+1 add sign2,q ;成绩间隔为qlet1: call copy ;子程序嵌套 jmp inputexit: retinput endp ;子程序2,数据转存copy proc mov cx,n+1 ;姓名长度+1(包含$ lea si,buff1+2 lea di,sname ;姓名传送到sname add di

19、,sign1 ;加上间隔值 cld rep movsb mov cx,n mov ax,'$' ;用$覆盖姓名区,清除已输入的姓名 lea di,buff1+2 rep stosb mov cx,m+1 ;成绩位数+1(包含s lea si,buff2+2 lea di,score1 ;成绩传送到scorel add di,sign2 ;加上间隔值 cld rep movsb lea si,buff2+2 mov di,sign2 call change ;二进制成绩,scorel2 retcopy endp ;子程序3,十进制数ASCII码二进制change proc mov

20、 x,0 mov cx,si-1 ;成绩的位数,cx and cx,000fh ;保留低4位rept2: mov al,si ;按位取出成绩 cmp al,30h ;是否在09之间 jl exit1 cmp al,39h jg exit1 and ax,000fh ;去掉ASCII码 xchg ax,x mov dx,10 ;将ax中前一次形成的数扩大10倍 mul dx add x,ax ;保存到x inc si loop rept2 mov ax,x ;按十进制形成的成绩以二进制保存 mov score2di,ax ;二进制成绩送入score2 mov x,0 add sign2,2 ;下一个成绩单元 exit1: ret change endp ;子程序4,按成绩排序 sort proc mov cx,p ;数组长度 dec cxloop1:push cx ;保存外循环次数 mov bx,0 mov si,0loop2:mov ax,score2bx cmp ax,score2bx+m+1 ;m+1=5 jge next ;降序 xchg ax,score2bx+m+1 ;交换成绩 mov score2bx,ax mov al,mingcisi xchg al,mingcisi+1 ;交换成绩 mov m

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论