湖北科技学院计算机学院汇编语言课程设计课题题目:显示学生名次表学生姓名:学号:班级:2013年12 月26日一、实验目的进行汇编语言程序设计应用的综合性训练。
综合运用汇编语言循环程序和子程序编程方法,巩固提高汇编语言程序设计能力应用水平。
二、设备与环境PC兼容机、Windows操作系统、汇编程序masm for windows 2010三、实验内容实验内容:编制一程序,要求接收从键盘输入的一个班的学生成绩和学号,对学生的成绩进行排序,再按学号顺序和学生名次顺序分别把学生成绩显示出来。
四、实验结果及分析实验功能:从键盘输入学生姓名和成绩,按照成绩的高低排名显示输出。
程序中设定的名字是英文的,需要小于9位字母,学生人数为3个。
程序思路:1、本程序包括一个主程序和五个子程序。
子程序包括INPUT键盘输入、COPY数据转存、CHANGE十进制数ASCII码转二进制、SORT按成绩排序和PRINT打印班级名单。
2、用变量p控制输入的学生的个数。
本程序中,p=3。
3、姓名和成绩输入分别用DOS中被调用的10号功能实现字符串输入。
在输入最后字符后,要将回车符改为0,以便输出时直接用9号功能显示姓名和成绩。
4、用buffer1和buffer2作为键入的姓名和成绩的缓存区,然后将所有人名和成绩用串传送指令转到smane和score1中保存,打印输出是可以使用。
5、将score1中成绩的十进制数ASCII码转换为二进制数score2.6、将score2中的成绩排序,同时将保存在mingci中的输入次序号也一换,以次序号作为排序指针,在smane和score1中查找相应的人名和成绩。
7、打印排序名单时,从mingci中取出次序号作为位移量,到smane和score1中取出姓名和对应的成绩用9号功能显示。
排序后mingci中先取出的次序号一定是成绩最高的人的,其他类推。
程序代码、代码解析及流程图主程序:START:main proc farMOV AX,DATASMOV DS,AXmov es,axmov bx,0mov cx,0call inputcall sortcall printmov ah,4chint 21hmain endp数据段定义:DATAS SEGMENTinfor0 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),'$';姓名缓冲区,加$以便输出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 0sign2 dw 0cont db'1';计数DATAS ENDS子程序(INPUT) 1:输入姓名、成绩input procinc bx ;输入次数统计cmp bx,p ;输入次数ja exitlea dx,infor1 ;显示提示1mov ah,9int 21hlea dx,buff1 ;输入姓名mov ah,10int 21hmov al,buff1+1 ;实际输入个数,aladd al,2 ;+2,包含buffer1的0,1号单元mov ah,0mov si,ax ;回车od所在位置,跟在最后一个字符后mov buff1[si],0 ;将od换为0,便于输出显示lea dx,infor2 ;显示提示2mov ah,9int 21hlea dx,buff2 ;输入成绩mov ah,10int 21hmov al,buff2+1 ;实际输入个数add al,2 ;个数+2,包含0,1单元找到odmov ah,0mov si,axmov buff2[si],0 ;将od换为0,便于输出显示mov mingci[bx-1],bl ;bx为输入次数,保存输入次序cmp bx,1 ;第一次输入转let1jz let1add sign1,n+1 ;姓名间隔为n+1add sign2,q ;成绩间隔为qlet1:call copy ;子程序嵌套jmp inputexit:retinput endp流程图:→子程序2(COPY):数据转存copy procmov cx,n+1 ;姓名长度+1(包含$)lea si,buff1+2lea di,sname ;姓名传送到snameadd di,sign1 ;加上间隔值cldrep movsbmov cx,nmov ax,'$';用$覆盖姓名区,清除已输入的姓名lea di,buff1+2rep stosbmov cx,m+1 ;成绩位数+1(包含s)lea si,buff2+2lea di,score1 ;成绩传送到scoreladd di,sign2 ;加上间隔值cldrep movsblea si,buff2+2mov di,sign2call change ;二进制成绩,scorel2retcopy endp流程图:→子程序3(CHANGE):十进制数ASCII码→二进制change procmov x,0mov cx,[si-1] ;成绩的位数,cx and cx,000fh ;保留低4位rept2:mov al,[si] ;按位取出成绩cmp al,30h ;是否在0~9之间 jl exit1cmp al,39hjg exit1and ax,000fh ;去掉ASCII码xchg ax,xmov dx,10 ;将ax中前一次形成的数扩大10倍mul dxadd x,ax ;保存到xinc siloop rept2mov Array保存mov score2[di],ax ;二进制成绩送入mov x,0add sign2,2 ;下一个成绩单exit1: retchange endp流程图→子程序4(SPORT):按成绩排序sort procmov cx,p ;数组长度dec cxloop1:push cx ;保存外循环次数mov bx,0loop2:mov ax,score2[bx]cmp ax,score2[bx+m+1] ;m+1=5 jge next ;降序xchg ax,score2[bx+m+1];交换成绩mov score2[bx],axmov al,mingci[si]xchg al,mingci[si+1] ;交换成绩mov mingci[si],alnext:add bx,m+1 ;下一个成绩inc siloop loop2pop cx ;恢复外循环次数 loop loop1retsort endp子程序→子程序5(PRINT):打印排序名单print proclea dx,infor0 ;显示结果提示mov ah,9int 21hmov cx,pmov bx,0mov ax,0mov di,0rept3:mov dl,0ah ;回车换行mov ah,2int 21hmov dl,0dhint 21hmov dl,cont ;显示名次序号mov ah,2int 21hinc contmov dl,0ah ;回车换行mov ah,2int 21hmov dl,0dhint 21hmov ax,0mov al,mingci[di] ;取名次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,mingci[di] ;取名次dec al ;地址从0开始mov bl,5 ;成绩位移量=al×5(包含$)mul bllea dx,score1add dx,ax ;显示成绩mov ah,9int 21hinc diloop rept3retprint endpcodes endsEND START运行结果:实验体会:在复杂的程序设计中,采用模块化结构可以划分功能、分界程序,使得程序有复杂变简单,变清晰。