1、XXXXX课程设计说明书汇编语言课程设计班级: 网络 B101 姓名: XXX 学号 XXX 设计题目: 学生成绩管理 设计时间: 2012.12.09 至 2012.12.21 指导教师: XXX 评 语:_评阅成绩:_评阅教师:_一、 课程设计的目的进行程序设计方法和技能的基本训练,巩固在课堂上学到的有关程序设计的基本知识和基本方法,通过实际动手能力的培养,进一步熟悉汇编语言的结构和使用方法,达到能独立阅读、编制和调试一定规模的汇编语言程序的水平。二、 设备与环境PC 兼容机、Windows 操作系统、汇编程序 masm for windows 2010三、课程设计要求1要求编写并调试通过
2、一个小型软件,实现对软件或硬件的操作。2遵循模块化、结构化的程序设计方法。3.要求程序必须正确。4.程序简明易懂,多运用输入输出提示,出错信息及必要的注释。5.要求程序结构合理,语句使用得当。6.适当追求编程技巧和程序运行效率。四、课程设计的课题和分析题目:学生成绩管理分析: 建立学生成绩文档;输入学生各门功课成绩;(假设3门功课) ;修改指定学号的学生成绩;统计指定学号的学生的平均成绩、总成绩,并在屏幕上显示; 统计指定学号课程的平均成绩,并在屏幕上显示; 每门课程成绩分析在屏幕上显示3门课程的各个分数段的学生人数;(分数段为:=90;8089;7079;6069;,13,10,$;菜单的格
3、式cai1 db * Modify a data ,13,10,$cai2 db * Delete a data ,13,10,$cai3 db * Find a data ,13,10,$cai4 db * Show the rank ,13,10,$cai6 db * Show the count ,13,10,$cai5 db * Exit with the keyboard of ESC ,13,10,$ts2 db Please choose the Function,13,10,$mess db 13,10,The data you input is not exist,input
4、 again,13,10,$ mess1 db 13,10,Please input the school number(2) ,13,10,$mess2 db 13,10, Please input three scores(0-120),13,10,$mess4 db chinese english maths ,13,10,$ mess3 db Thank you ,13,10,$strr1 DB *score and rank*,13,10,$strr2 DB 13,10,number wen eng math average sum rank ,13,10,$strr3 db 13,
5、10,course =90 =80 =70 =60 60 ,13,10,$bg db ,$DATAS ENDSSTACKS SEGMENTSTACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AX mov es,axmov ah,3ch ;请求创建文件mov cx,00 ;默认属性lea dx,pathnam ;装入pathnam的地址int 21hmov handle,ax ;保存文件句柄main: ; 主菜单显示output cai0output cai00output cai
6、output cai1output cai2output cai3output cai4output cai6output cai5output ts2mov ah,1 ;输入字符,选择功能键int 21hcmp al,ijne n1call insert ;调用insert子程序,输入学生学号,成绩jmp rkn1: cmp al,mjne n2call modify ;调用modify子程序,修改指定学生的成绩jmp rkn2: cmp al,d ;调用de子程序,删除制定学生的成绩jne n3call dejmp rkn3: cmp al,f ;调用find子程序,显示指定学生的成绩及名
7、次jne n4call findjmp rkn4: cmp al,s ;调用show子程序,显示所有学生的各科成绩,平均成绩,总成绩及名次jne n5call showjmp rkn5: cmp al,c ;调用showw子程序,显示各科各分数段的学生数量jne n6call showwjmp rkn6: cmp al,1bh ;调用exit子程序,将数据保存到score.txt文件中,并退出程序jne n7call exitn7: clear ;清屏output ts1 ;以上都不选择则说明出错jmp main ;再次跳转到菜单rk: output tsmov ah,1int 21hclea
8、rjmp main;*exit proc near ;退出 mov cl,n ;写入文件的次数cbwmov bx,0mov di,0zh: push di ;保存di,cx,bx中的内容push bxpush cxmov si,0 ;对si进行赋初值zhuane xhbx,si ;调用宏zhuane将两位数的学号转换为对应的二个字符,并存放到zs缓冲区中zhuans chibx,si ;调用宏zhuans将三位数的语文成绩转换为对应的三个字符,并存放到zs缓冲区中zhuans engbx,si ;调用宏zhuans将三位数的英语成绩转换为对应的三个字符,并存放到zs缓冲区中zhuans mat
9、bx,si ;调用宏zhuans将三位数的数学成绩转换为对应的三个字符,并存放到zs缓冲区中zhuans pjbx,si ;调用宏zhuans将三位数的平均成绩转换为对应的三个字符,并存放到zs缓冲区中huancun zcdi,si ;调用宏zhuanss将三位数的总成绩成绩转换为对应的三个字符,并存放到zs缓冲区中zhuane mcbx,si ;调用宏zhuane,将两位数的名词,转换为对应的二个字符,并存放到zs缓冲区中mov ah,42h ;移动读写指针mov al,00 ;移动方式为绝对移动方式mov bx,handle mov cx,00mov dx,m ;指针偏移量int 21ha
10、dd m,20mov ah,40h ;调用40h功能,请求写文件mov bx,handle ;获取文件句柄mov cx,19 ;写入长度为19个字节lea dx,zs ;将缓冲区zs中的内容写入文件score.txtint 21hpop cxpop bxpop diadd di,2 ;目的指针加2add bx,1sub cx,1 ;输入一个之后cx统计的个数就依次减1cmp cx,0 ;判断写入是否完毕jg zhmov bx,handle ;写入完毕,关闭文件mov ah,3ehint 21hclearoutput mess3 ;关闭文件之后就显示提示语句MOV AH,4CH ;退出程序INT
11、 21Hretexit endp ;子程序结束;* *sum proc near ;求学生的总成绩mov cl,n ;对运用到的存取器进行清零mov ch,0 mov si,0mov bx,0sss:mov al,chisi ;将三科成绩相加,将总成绩传给数组zcmov ah,0 ;高位清零mov dl,matsi ;存放数学的数组mov dh,0add ax,dx ;数学和语文相加mov dl,engsimov dh,0add ax,dxmov zcbx,ax ;最后把语文数学和英语的三门成绩总分存放在zc总分的缓存区add bx,2add si,1loop sss ;运用循环对输入的三门成
12、绩求总分retsum endp;*ping proc near ;求学生的平均成绩mov cl,n ;n是统计输入学生信息的个数cbwmov si,0mov bx,0p_p:mov ax,zcbx ;将总成绩除以三,获取的数据传送给数组pjmov dl,3div dlmov pjsi,al ;把除以之后的商从al中总取出放入pj平均的存储区add si,1 ;下标依次加1add bx,2 ;基址加2loop p_pretping endp;*modify proc near ;修改学生学号,成绩md1:output mess1 ;提示语句shurumov bl,n ;把学生个数给blmov b
13、h,0mov al,dlmov si,0md: cmp al,xhsi ;先查找输入的学生是否存在je qq1_1 ;查到的话,就跳转到qq1_1输入修改的值,也就是重新输入add si,1cmp si,bx ;不存在的话则继续输入继续比较jbe mdoutput messjmp md1 ;不相等继续输入学号qq1_1:mov di,sioutput mess2 ;输入学号output mess4 ;输入成绩mov si,0mov cx,3 ;cx存放的的科目qq3_1:shuruu ;分别输入语文,英语,数学成绩,并将其放在缓冲区buf中cmp dx,78h ;比较输入的成绩是否大于120,
14、如果大于120的话,那么重新输入成绩jbe qq2_1output ts3jmp qq1_1qq2_1:mov bufsi,dloutput bg ;输出一段空格add si,1loop qq3_1mov al,buf0 ;将存入buf中的成绩,分别赋值给存放对应科目的成绩的数组mov chidi,almov al,buf1 ;buf1放的是英语mov engdi,almov al,buf2 ;buf2放的是数学mov matdi,al retmodify endp;*countt proc near ;统计各科各个分数段学生的个数mov cx,5 ;有五个成绩分数段mov si,0zl: m
15、ov gs0si,0 ;存放语文科目各个分数段的缓存区add si,1loop zlmov cl,nmov ch,0mov si,0c11:mov al,chisi ;取出存放在缓存区的数据和90进行比较cmp al,90jl cc1 ;大于则跳转add gs00,1 ;小于等于90则进行个数的累加jmp cc8 ;继续循环一直比较完五个分数段cc1:cmp al,80 ;和80进行比较jl cc2add gs01,1 ;进行累加存放入缓存区jmp cc8cc2:cmp al,70 ;和70进行比较jl cc3add gs02,1jmp cc8cc3:cmp al,60 ;与60进行比较jl
16、cc4add gs03,1jmp cc8 cc4:add gs04,1 ;最后剩下的数据存放在gs04的缓存区cc8:add si,1 ;统计完一个数据则需要继续统计,则和那些分数段比较之后满座条件的继续统计loop c11lea si,gs0 lea di,gs1mov cx,5cld ;清除方向标rep movsb ;以字节传送mov cx,5mov si,0cc9: mov gs0si,0 ;对存放分数段的缓存区清零add si,1 ;地址指针加1loop cc9mov cl,n ;存储器先清零mov ch,0mov si,0mov cl,n ;给存储器赋值mov ch,0mov si,
17、0c111:mov al,engsi ;对英语成绩进行分段,统计各个分数段的个数cmp al,90 ;和90比较jl cc15 ;大于则跳转add gs00,1 ;小于等于则继续统计jmp cc88 ;继续比较,继续存储cc15:cmp al,80 ;和80比较jl cc22add gs01,1 ;符合条件则存储在缓存区jmp cc88cc22:cmp al,70 ;和70比较jl cc33add gs02,1jmp cc88cc33:cmp al,60 ;和60进行比较jl cc44add gs03,1jmp cc88cc44:add gs04,1 ;最后的数据存放在gs04cc88:add
18、 si,1loop c111 ;符合各个分数段的继续进行比较,继续加到各个分数段lea si,gs0lea di,gs2mov cx,5cldrep movsbmov cx,5mov si,0ct: mov gs0si,0 ;以si的值来统计,和显示各个分数段的数量add si,1loop ctmov cl,nmov ch,0mov si,0c13:mov al,matsi ;对数学这门成绩的统计和分段cmp al,90 ;和90比较jl cc1_2add gs00,1jmp cc8_2cc1_2:cmp al,80 ;和80比较jl cc2_2add gs01,1jmp cc8_2cc2_2
19、:cmp al,70 ;和70比较jl cc3_2add gs02,1jmp cc8_2cc3_2:cmp al,60 ;和60比较jl cc4_2add gs03,1jmp cc8_2cc4_2:add gs04,1 ;60以下的cc8_2:add si,1loop c13retcountt endp ;这个子程序结束;* find proc near ;查找学生成绩call sum ;调用子程序call pingbj1:output mess1 ;提示输入学号shurumov bl,n ;n是统计输入学生的个数mov bh,0mov al,dl ;把值从DL从移出放在AL中mov si,0
20、 ;si清零bj: cmp al,xhsi ;将输入的学号与输入的学号相比,je i ;存在的话,将此学生的成绩以及信息输出add si,1 ;指针下移cmp si,bx ;和jbe bj output messjmp bj1i: output strr2 ;输出信息的提示语句shuzi xhsi ;调用宏,则输出之前处理好的三位数的三门成绩output bg ;输出空格mov al,chisi ;输出语文成绩cbw shuzii axoutput bg mov al,engsi ;输出英语成绩cbw shuzii axoutput bgmov al,matsi ;输出数学成绩cbwshuzi
21、i ax output bg ;输出空格的字符串,用于与标题栏对齐mov al,pjsi ;输出平均分cbw ;字节扩展成字shuzii axoutput bgmov ax,si ;为了找到该学生总分的存放位置,所以si需乘以2mov bl,2mul blmov bx,ax shuzii zcbx ;输出总分output bgshuzi mcsi ;输出名次retfind endp;*insert proc near ;插入学生,学号及成绩call input ;调用输入的子程序add n,1retinsert endp;*show proc near ;显示结果排名call sum ;调用显
22、示总分的子程序call ping ;调用显示平均分的子程序call rank ;调用显示排名的子程序call shuchu ;调用输出的提示子程序retshow endp;*showw proc near ;显示各个学科各分数段的人数call countt output strr3 ;显示各个分数段的格式output cour0 ;输出语文提示output bgshuzi gs10 ;输出语文90分以上的output bgshuzi gs11 ;输出80分至90分的output bg shuzi gs12 ;输出70至80output bgshuzi gs13 ;输出60至70output b
23、gshuzi gs14 ;输出去60分以下的kongoutput cour1 ;显示英语的提示output bgshuzi gs20 ;英语90分以上的output bgshuzi gs21 ;显示80到90之间output bgshuzi gs22 ;显示70至80分的英语成绩output bgshuzi gs23 ;显示60至70分output bgshuzi gs24 ;显示60分一下的英语成绩kongoutput cour2 ;显示数学提示output bgshuzi gs00 ;显示数学分数在90分以上的个数output bgshuzi gs01 ;显示80至90分数段的人数outp
24、ut bgshuzi gs02 ;显示70至80分数段的人数个数output bgshuzi gs03 ;显示60至70的output bgshuzi gs04 ;显示60以下的人数个数retshoww endp;*de proc near ;删除某个学生的记录sc1:output mess1shuru ;调用宏shuru,接受输入的学号mov bl,nmov bh,0mov al,dl mov si,0sc: cmp al,xhsi ;查询输入学号的学生信息是否存在,不存在的话,重新输入学号je sc2add si,1 ;地址指针继续下移,继续查找cmp si,bx jbe sc ;假如这个
25、地址指针小于等于si中的,说明这条查找的信息是存在的output mess ;否则是不存在的jmp sc1 ;跳转回原来的继续查找sc2: sub bx,si ;两个地址相减cmp bx,0je sc3mov cx,bxsc4:mov dl,chisi+1 ;显示该学号的相对应数据指针的下一位,就是为了显示是空的mov chisi,dlmov dl,engsi+1mov engsi,dlmov dl,matsi+1mov matsi,dlmov dl,xhsi+1mov xhsi,dladd si,1 ;地址指针下移,继续找到然后进行删除loop sc4 sub n,1 ;删除一个学生信息,则
26、学生个数就减1sc3: retde endp ;该子程序结束;* input proc near ;输入学生学号,成绩e6: output mess1shurumov bl,n ;统计输入学生个数mov bh,0 mov xhbx,dl ;输入的个数同时以地址指针形式显示cmp bx,0 ;判断是不是第一次输入,如果是,则跳过比较程序je qq1 ;继续输入成绩mov cl,n ;如果不是第一次输入则要将输入的学号与以前输入的比较cbwmov si,0 mov al,xhbxe7: cmp al,xhsije e5add si,1loop e7jmp qq1e5: output ts4jmp
27、e6 qq1:output mess2 ;如果不是重复的学号则可以继续输入成绩和其他信息output mess4mov si,0mov cx,3qq3:shuruucmp dx,78h ;比较输入的成绩是否大于120,如果大于120的话,那么重新输入成绩jbe qq2output ts3 ;提示输入错误jmp qq1qq2:mov bufsi,dl ;把输入的学生信息保存在缓存区output bgadd si,1loop qq3mov bl,ncbw mov al,buf0 ;以下是把之前的成绩数据保存到相对应的缓存区mov chibx,al mov al,buf1mov engbx,almo
28、v al,buf2mov matbx,al retinput endp;*rank proc near ;排名mov cl,nmov ch,0 ;将用到的存储器清零mov si,0rrc:mov mcsi,1 ;将存储名次的存储器给予的初值是1add si,1 ;loop rrc mov al,n ;此处2n最后放到al中,是为了下面总分的输出mov bl,2mul blmov cl,nmov ch,0 mov si,0mov bx,0mov di,0rrb: mov dx,zcdirra: cmp dx,zcbx ;总分之间的比较jge continue ;大于等于的那个分数则为第一名add
29、 mcsi,1continue:add bx,2loop rra ;余下的继续比较依次排出名次mov cl,ncbwadd si,1 ;名次是字节类型的add di,2 ;总分是字类型的mov bx,0cmp si,ax ;ax里面是2n为了找到总分输出jbe rrbretrank endp;*shuchu proc near ;输出所有学生的学号,成绩,排名output strr1output strr2mov cl,nmov ch,0mov si,0hh:shuzi xhsi ;存放学号的数组 output bgmov al,chisi ;输出各科的成绩cbw shuzii axoutput bg mov al,engsicbw shuzii axoutput bgmov al,matsicbwshuzii axoutput bg ;输出空格的字符串,用于与标题栏对齐mov al,pjsicbw shuzii ax ;三位数输出的处理output bgmov ax,simov bl,2mul blmov bx,axshuzii zcbx ;输出总分