汇编语言课程设计报告
课程设计报告
课题名称:学生成绩管理程序 学生姓名: XX 学 号: XXX
专 业: 计算机科学与技术 指导教师: XXX
时 间:2010年6月12日至25日
目录
课程设计报告 ............................................................... 1
1、题目及要求 .......................................................... 2
1.3 课题背景 ....................................................... 2 2、运行环境 (软、硬件环境) ........................................... 3 3、功能设计(功能模块及模块图) ........................................ 3
3.1各模块的主要功能 ............................................... 3 4、详细设计 ............................................................ 4
4.1程序功能 ....................................................... 4
4.2各模块的程序流程图 ............................................. 5 ................................................................... 7 4.3本设计的重点、难点及解决方法 ................................... 8 5、总结 ................................................................ 8 6、源程序 .............................................................. 9
1、题目及要求
1.1 题目:学生成绩管理程序 1.2 要求
设计一个学生管理程序,要求实现以下功能 (1)各科成绩的录入、修改、和删除。 (2)按姓名查询每个学生哥们成绩。 (3)显示查询结果
(4)统计各分数段的成绩的人数个分数段的人数。
1.3 课题背景
1.3.1汇编语言的优点
汇编语言由于采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。用汇编语言等非机器语言书写好的符号程序称为源程序,运行时汇编程序要将源程序翻译成目标程序。目标程序是机器语言程序,它一经被安置在内存的预定位置上,就能被计算机的CPU 处理和执行。汇编语言像机器指令一样,是硬件操作的控制信息,因而仍然是面向机器的语言,使用起来还是比较繁琐费时,通用性也差。但是,汇编语言用来编制系统软件和过程控制软件,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。
1.3.2课题意义
当今社会是一个信息时代的社会,计算机的使用也是越来越普遍了,各行业在管理职员都采用了一些管理软件,不管是银行、学校,大大小小的各种企业,都是使用的相应的 管理软件管理企业的各种信息,我选择的这个汇编语言课程设计题就是一个简单学生信息管理程序,虽然只能处理一些简单操作,但是其意义却是非凡,同过此课程设计,让我了解了一些简单的管理软件的基本原理,更深刻的理解了汇编语言的特点,对汇编语言有了一个跟深层次的理解。
1.3.3主要研究内容和功能
利用汇编程序编写一个小型学生成绩管理程序,实现学生信息成绩的插入、修改、显示
所有学生的各科成绩,并且可根据输入学生姓名插询该生的各科成绩,可统计所有成绩个各分数段的人数。
2、运行环境 (软、硬件环境)
硬件:8086以上CPU ,内存256M 以上。
软件:WINDOWS 操作系统,MASM ,LINK 汇编编译链接软件。
3、功能设计(功能模块及模块图)
3.1各模块的主要功能
3.1.1main 主程序模块
用于对各种操作的调用,如插入、删除、显示所有学生的各科成绩等。
3.1.2 Insert子程序插入模块
用于实现对新增学生的插入,插入至学生文本中,使用时需要调用get_rec子程序实现从键盘输入一个学生的信息。
3.1.3get_rec子程序模块
主要被Insert 子程序调用,用于从键盘输入一个学生的信息
3.1.4 query子程序模块
根据学生姓名查询学生的各科成绩,学生姓名由键盘输入,再从文件中一次比较找出要查询学生的信息。
3.1.5 modify子程序模块
首先从键盘输入要修改的学生信息,在从学生文件中寻找要修改的学生姓名,并将要修改后的信息写入文件。
3.1.6delete 子程序模块
由用户输入要修改学生的姓名,从学生文件中找出要删除的学生信息,将该学生的各项信息置为0,实现删除的操作。
3.1.7 list子程序模块
用于显示学生文件中所有学生的各科成绩的信息,每次从文件读取一个学生的信息并显示。
3.1.8 coun子程序模块
用于对学生各科成绩的各分数段的统计。
4、详细设计
4.1程序功能
程序运行时,在出现的主菜单中,按l 键,将浏览学生的各科成绩;按i 键后,将执行插入功能,可以插入新的学生成绩,按m 键,键输入需要修改的学生成绩,也包括不修改的科目;按d 键输入要删除的学生姓名,将使其成绩全部变成0;按q 键输入 查询的学生的姓名,将其各科成绩显示出来;按下c 键将按数学成绩分段结果。 以上功能单独运行可以实现,(即在进入菜单后 选择其中一项功能运行可以成功运行,在关闭后选择另一项功能可以 成功运行),但是在整体运行时得不到想要的结果。所以如果输入有误,按退格键后将会出错,但是此程序没有处理错误的功能,因此再输入时要特别注意。
注:此程序除了源程序外还需要一个学生文件,该程序命名为score.txt ,该文件用于存放学生信息,在源程序中程序数据段中fname 的值应与文件的存放位置一致。
4.2各模块的程序流程图
list 流程图 insert流程图
主程序流程图
4.3本设计的重点、难点及解决方法
4.3.1重点难点
开始拿到课题感觉很简单,主要是因为以前C 语言曾经做过类似的题,思路大概差不多,但是实际下笔写的时候,遇到的最大的困难对于一些系统调用存在很大的问题,对DOS 和BIOS 的系统调用还比较模糊,在使用时DOS 和BIOS 中的系统功能调用不是很熟悉,所以需要先理解这些后,然后才正式开始写程序
开始写好了程序的主干,实现了主要功能,在写插入、查询等功能时遇到了一些问题,但通过仔细琢磨和请教老师、同学,最终还是成功解决,完成程序后,就开始了程序的编译,找错、改错、链接等,但是程序有些地方还是不是很完善。
4.3.2调试过程
1)编译源文件,命名为 s.ASM。
2)采用命令格式。MASM s.ASM将生成一个OBJ 文件,检查源程序中的错误,并改正。 3)键入连接命令:LINK cjgl.OBJ,回车,即可生成s.exe 可执行文件。
4)执行s.exe 选择其一功能,能正常执行,在关闭后,在进入运行别的功能。
5、总结
通过对这学生成绩管理的的制作,使我对汇编语言的基本知识的使用更加熟练,同时也增加了我对汇编语言的一些认识,在作业完成过程中通过和同学的交流,也增加了合作的技巧。通过查阅资料也学到了一些课本上没有的东西,拓宽了自己的知识面,增加了学好汇编语言的信心。 这不是第一次用汇编语言来设计一个小程序,平时做了很多实验,写了很多小程序。但这次是一个综合的程序,平时的很多程序都用到了。历时两周终于完成,其间有不少感触。
这次课程设计中有很多源程序的子程序的源代码可以从资料中或获得,但有很多都需要我们仔细琢磨才能明白其中的原理,同时程序中需要调用大量的BIOS 和DOS 系统功能调用,如显示字符串的功能调用、光标设置的功能的调用、清屏的功能调用等,这些问题如不查询资料就无法理解,因为上汇编语言基础时对这些DOS 和BIOS 的系统功能了解很少,所以我们需要查询DOS 和BIOS 功能的系统调用的基本信息。还有在一些循环结构设计上也有许多不能理解的地方,都需要加以深刻的理解才能将问题顺利的解决,多整个程序的理解也有了更进一步的了解。有时候遇到自己查资料和不能理解的地方时,自己不能解决时,先找同学讨论一下,会有意想不到的收获,有些问题就会迎刃而解,有时也会遇到比较顽固的问题,大家冥思苦想,也找不出一个令人满意的答案,但是通过询问老师,查阅更多的资料,问题也最终得到了解决。当这些问题得到解决时,心情是一种豁然开朗、柳暗花明又一村的旷达。
这次课程设计的大部分程序,都可以在书上找到,这对我们的程序设计很有帮助,从这些资料中,我们可以看出这个学生管理程序的基本主干,修改某些地方就可以实现改程序的基本功能,不可否认,本程序仍然存在不少缺点和不足,但通过这次的课程设计找出了自己在学习上的不足,有些地方仍然还存在许多问题,但是我相信通过努力,在以后的学习中会克服这些不足,达到熟练掌握汇编语言的目的!
6、源程序
data segment
mess1 db ' student grade management system',0ah,0dh,'$' mess2 db ' this is main menu',0ah,0dh,'$'
mess3 db ' insert (i) name :',0ah,0dh,'$' mess4 db ' modify (m) maths(a) :',0ah,0dh,'$' mess5 db ' delete (d) English(b) :',0ah,0dh,'$' mess6 db ' query (q) computer(c) :',0ah,0dh,'$'
mess7 db ' count (c) Chinese(d) :',0ah,0dh,'$ mess8 db ' exit (e)',0ah,0dh,'$'
mess9 db '**********************************************************$' mess10 db '**********************************************************$' mess11 db 'name Ma En Co Ch',0ah,0dh,'$'
mess13 db ' list (l) please input:',0ah,0dh,'$'' ' mess12 db 'maths
fname db "e:\masm5\score.txt"
buffer1 db 23 dup(?) buffeer db 0ah,0dh,'$' buffer2 db 30 dup(?) buffer3 db 8 dup('0')
count db 5 handle dw ?
del db 8 dup('0') x db ? data ends
show macro addrs ;显示字符串
lea dx,addrs ;取得字符串的入口地址
mov ah,9 ;调用dos 系统功能的9号功能 int 21h endm
set_p1 macro a;设置光标位置(将光标设置在指定行第36列处) mov ah,2 ;调用BIOS 系统功能2号功能 mov dh,a mov dl,36
mov bh,0 ;页号 int 10h
endm
set_p2 macro ;设置光标位置(将光标位置设置在12行第2列处) mov ah,2 ;调用BIOS 系统功能 mov dh,12 mov dl,2 mov bh,0 int 10h endm
set_p3 macro ;设置光标位置(将光标位置设置在第一行第30列处) mov ah,2 mov dh,1 mov dl,30 mov bh,0
int 10h ;调用BIOS 系统功能号2号功能设置光标位置 endm
clear macro ;清除全屏
mov al,0 左上角坐标 右下角坐标 mov ah,6
int 10h ;调用BIOS 功能6号功能清除全屏
endm
clear1 macro ;清除定义靠左边的部分屏幕
mov al,0
mov bh,7 卷入行属性
mov ch,4 mov cl,36
调用BIOS 系统功能清楚定义靠左边的屏幕
mov dl,79
mov ah,6
int 10h
endm
clear2 macro ;清除定义靠下边部分屏幕
mov al,0
卷入行属性
mov cl,0
mov ah,7
调用BIOS 系统功能7号功能
endm
newline macro ;输出换行符
push ax
push dx
调用DOS 系统功能2号功能显示单字符输出
int 21h
输出换行符(其ACSII 值为oah,odh )
mov ah,2
int 21h
pop dx
pop ax
endm
show_item macro addrs ;定义显示学生信息的宏
local iloop,w10
push bx
push cx
mov bx,0 iloop: mov dl,addrs[bx] 调用DOS 系统功能的2号功能显示字符
int 21h
inc bx
cmp bx,15 ;判断是否显示了15个字符
jl iloop
mov cx,4
mov ah,2
int 21h
mov dl,' '
调用DOS 系统功能的2号功能连续显示三个空格 int 21h
mov dl,' '
mov ah,2
int 21h
调用DOS 系统功能的2号功能显示一个字符 int 21h
inc bx
mov dl,addrs[bx]
调用DOS 系统功能的2号功能显示一个字符
int 21h
inc bx
loop w10
newline
pop cx
pop bx
endm
getin macro addrs,count2 ;定义输入学生信息的宏
local zeroit,lp,input_end,exit
push bx
mov bx,0
zeroit: mov addrs[bx],' '
inc bx
cmp bx,15
jl zeroit
mov bx,0
lp: mov ah,1 ;调用DOS 系统功能从键盘输入字符al 中并且显示字符 int 21h cmp al,0ah 判断字符是否为回车键
mov addrs[bx],al
inc bx
cmp bx,count2 ;判断是否输入够指定的字符 个数
jl lp
判断是否为空格
cmp al,0ah
jz exit
mov ah,7 ;调用DOS 系统功能的7号功能从键盘输入字符不显示字符 int 21h
jmp input_end
exit:
pop ax
pop bx
endm
code segment
main proc far ;主程序段
assume cs:code,ds:data,es:data
start: mov ax,data
mov ds,ax
; 调用BIOS 系统功能的0号功能设置显示方式 ; 以80×25的彩色方式显示
clear ;清除全屏
show mess1
show mess2
newline show mess13
show mess3
show mess4
显示主菜单界面
show mess6
show mess7
show mess8
show mess9
show mess10
set_p3
w: mov ah,7
int 21h
cmp al,'i'
jnz n1 ; 调用宏设置光标位置 ; 调用DOS 系统功能从键盘输入一个字符不显示
call insert ;若输入字符为i 则调用insert 子程序段
jmp w
n1: cmp al,'m'
jnz n2
call modify
jmp w
n2: cmp al,'d'
jnz n3
call delete ;若输入字符为d 则调用delete 子程序段
jmp w
n3: cmp al,'q'
jnz n4
call query
jmp w
n4: cmp al,'c'
jnz n6
call coun ;若输入字符为c 则调用coun 子程序段
jmp w
n6: cmp al,'l'
jnz n7
call list
jmp w
n7: cmp al,'e' ;输入字符为e 则退出程序
jz exitf
jmp w
exitf:
mov ah,4ch ;调用DOs 系统功能的4Ch 号功能输出结束码
int 21h
ret
main endp
insert proc near ;插入学生信息
push ax
push bx
push cx
push dx
mov dx,offset fname ;打开文件的路径的字符串入口地址给dx
mov al,2
mov ah,3dh ;调用DOS 系统功能的3dh 号功能打开文件
int 21h
mov bx,ax
clear1
set_p1 4
call get_rec
mov cx,0 ;调用DOS 系统功能的42h 号功能将文件指针移动到文件末尾 mov dx,0
mov al,2
mov ah,42h
int 21h
mov cx,23 ;调用DOS 系统功能的40h 号功能写文件
mov dx,offset buffer1
mov ah,40h
int 21h
mov ah,3eh ;调用DOS 系统功能的3eh 号功能关闭文件
int 21h
set_p3
pop dx
pop cx
pop bx
pop ax
ret
insert endp
get_rec proc near ; 从键盘输入获取学生信息段
push ax
push bx
getin buffer2,15 ; 从键盘输入学生姓名
mov bx,0
mov cx,15 将从键盘输入的学生姓名写入buffer1中 loop continue
set_p1 5 ;将光标设置在第五行36列处
getin buffer2,2 ;从键盘输入学生的数学成绩
mov al,buffer2
将从键盘输入的成绩写入buffer1中 inc bx
mov al,buffer2+1
mov buffer1[bx],al ;将从键盘输入的成绩写入buffer1中 inc bx
set_p1 6 ;将光标设置在第6行36列处
getin buffer2,2 ;从键盘输入学生的英语成绩
mov al,buffer2
mov buffer1[bx],al ;将从键盘输入的成绩写入buffer1中
inc bx
mov al,buffer2+1
mov buffer1[bx],al ;将从键盘输入的成绩写入buffer1中
inc bx
set_p1 7 ; 将光标设置在第7行36列处
getin buffer2,2 ;从键盘输入学生的计算机成绩
mov al,buffer2
mov buffer1[bx],al ;将从键盘输入的成绩写入buffer1中
inc bx
mov al,buffer2+1
mov buffer1[bx],al ;将从键盘输入的成绩写入buffer1中
inc bx
set_p1 8 ;将光标设置在第8行36列处
getin buffer2,2 ;从键盘输入学生的语文成绩
mov al,buffer2
mov buffer1[bx],al ;将从键盘输入的成绩写入buffer1中
inc bx
mov al,buffer2+1
mov buffer1[bx],al ; 将从键盘输入的成绩写入buffer1中
inc bx
pop bx
pop ax
ret
get_rec endp
query proc near ;根据学生姓名查询学生信息
push ax 保护个寄存器的值
push dx
clear1
clear2
mov dx,offset fname
mov al,2
调用DOS 系统功能打开文件
int 21h
mov bx,ax
set_p2
getin buffer1,15 ;从键盘输入学生姓名
b: mov ah,3fh ;DOS 系统功能的3fh 号功能读取一个学生(23个字节)的信息 mov cx,23
int 21h
cmp ax,0 ;判断文件是否读取完(ax=0则文件读取完毕)
jz s1 ;读取完毕则退出
lea si,buffer2
lea di,buffer1
mov cx,15
c:
mov al,byte ptr[si]
cmp al,byte ptr[di] ;判断输入的字符与文件中的姓名是否一致找出要查询的学生姓名
jnz b ;不匹配则继续从文件读取
inc si ;当前字符一致则继续比较下一个字符
inc di
loop c
mov [buffer2+23],'$'
lea dx,mess11
mov ah,9 ;调用DOS 的9号功能显示字符串
int 21h
show_item buffer2 ;显示查询到的学生信息
jmp s2 ;显示学生信息后转至关闭文件处
s1: set_p2
show err1 ;显示错误信息(没有找到查询的学生)
s2: mov ah,3eh ;调用DOS 系统功能的3eh 号功能关闭文件
int 21h
set_p3 ;设置光标位置
pop dx
pop cx 恢复个寄存器的值
pop ax
ret
query endp
modify proc near ;修改学生信息
push ax
push bx 保护各寄存器的值
push dx
clear1
set_p1 4 ;将光标设置在第四行
mov dx,offset fname ;将要打开文件的的路径的字符串的入口地址送入dx 中 mov al,2
mov ah,3dh ;调用DOs 系统功能的3dh 号功能打开文件
int 21h
mov bx,ax
mov handle,ax
call get_rec ; 从键盘输入要修改学生的信息
read:
mov dx,offset buffer2
mov cx,23 ;读取的长度
mov ah,3fh ;调用DOs 系统功能的3fh 号功能读取文件
int 21h
cmp ax,0 ; 判断文件是否读完
jz exit1 ;若读完表示没有找到要修改的学生,则退出
lea si,buffer2
lea di,buffer1
mov cx,15
c5:
mov dl,byte ptr[si]
cmp dl,byte ptr[di] ;判断是否为要修改的学生的姓名
jnz read
inc si ;若当前字符匹配则继续比较下一字符
inc di
loop c5
mov bx,handle
调用DOS 系统功能移动文件指针是指针指向要修改的学生信息的位置
mov al,1
mov cx,0ffffh
mov dx,-23
int 21h
mov cx,23 调用DOS 系统功能40h 号功能写文件,将要修改后的学生信息写入
int 21h
jmp exit2
exit1: clear2
set_p2
show err1 ;没有找到要修改的学生则显示错误信息
exit2:mov ah,3eh ;调用DOS 的3eh 号功能关闭文件
int 21h
set_p3
pop dx
pop cx
pop bx
pop ax
ret
modify endp
delete proc near ;删除学生信息
push ax
push bx
push cx
push dx
clear1
set_p1 4
mov al,2
调用DOS 系统功能打开文件
int 21h
mov bx,ax
mov handle,ax ; 将文件代号赋值给handle
getin buffer1,15 ;输入要删除学生的姓名
read5:
调用DOS 的3fh 号功能读取文件
int 21h ;
cmp ax,0 ;判断文件是否读完
jz exit5 ;若文件读取完毕则推出该子程序
lea si,buffer2
lea di,buffer1
mov cx,15
c6:
mov dl,byte ptr[si]
cmp dl,byte ptr[di] ;判断字符是否匹配(找到要删除学生在文件中的位置) jnz read5
inc si
inc di
loop c6
mov bx,handle
mov ah,42h 调用DOS 系统功能移动文件指针,是指针移动到要删除学生的位置处
mov al,1
mov cx,0ffffh
mov dx,-8
int 21h
mov cx,8
mov dx,offset del
mov ah,40h ; 调用DOS 系统功能写文件(将要删除的学生记录处全部置为0) int 21h
jmp exit6
exit5: clear2
set_p2
show err1 ;没有找到输入的学生姓名则输出错误信息
exit6:
mov ah,3eh ;关闭文件
int 21h
set_p3
pop dx
pop cx
pop bx
pop ax
ret
delete endp
list proc near ;显示文件中所有学生信息
push ax
push bx
push cx
push dx
clear1 ;清屏
clear2
set_p2
show mess11 mov dx,offset fname mov al,2
打开文件
int 21h
mov bx,ax
again:
mov dx,offset buffer1 ;调用DOS 系统功能读取一个学生的信息(读取23个字节)
mov cx,23
调用DOS 系统功能读取文件
int 21h
cmp ax,0 ;判断文件是否读完
jz p
show_item buffer1 ;显示读取到的一个学生的信息
jmp again
p:
mov ah,3eh ; 调用DOS 系统功能关闭文件
int 21h
set_p3
pop dx
pop cx
pop bx
pop ax
ret
list endp
coun proc near ;统计各科成绩各分数段的人数
push ax
clear2
set_p2
show mess12
mov dx,offset fname ; 调用DOS 系统功能打开文件
mov ah,3dh
int 21h
mov bx,ax
mov handle,ax
mov si,15
mov [buffer3+6],’a ’
c3:call number
mov cx,0
mov dx,0 调用DOS 的功能号为42h 的功能将文件指针移动到开头 mov ah,42h
int 21h
add si,2
cmp si,23 ;判断四个成绩是否统计完毕
jl c3
mov bx,handle “
mov ah,3eh 关闭文件
int 21h
set_p3
pop ax
ret
coun endp
number proc
push bx
push cx
read0: mov dx,offset buffer2
mov cx,23 ;读取的字节数赋给cx
mov ah,3fh ;调用DOS 系统功能读取文件
int 21h
cmp ax,0 ;判断文件是否读取完毕
jz c1 ;读取完毕则退出
mov dl,[buffer2+si]
cmp dl,'6' ;判断该生的数学成绩是否低于六十(根据其数学成绩的第一位字符是否比'6' 小)
jl five ;低于则属于小于60分范围内
cmp dl,'7' ;判断该生数学成绩是否低于七十
jl six ;低于则属于60到70分范围内
cmp dl,'8' ;判断该生的成绩是否低于80
jl seven ;低于则属于70到80分范围内
cmp dl,'9' ;判断该生的数学成绩是否低于90
jl eight ;低于则属于80到90分范围内
inc [buffer3+4] ;高于90分人数记录加1
jmp read0
eight:
inc [buffer3+3] ;80到90分数段的人数记录加1
jmp read0
seven: inc [buffer3+2] ;70到80分数段的人数记录加1
jmp read0
six: inc [buffer3+1] ;60到70分数段的人数记录加1
jmp read0
five: inc [buffer3] ;60分以下的人数记录加1
jmp read0
c1: mov cx,8
a: mov dl,' '
mov ah,2 ;调用DOS 系统功能输出8个空格
int 21h
loop a mov dl,[buffer3+6]
输出科目代号
int 21h
mov dl,’:’
mov ah,2
int 21h
mov bx,0
a0: mov dl,[buffer3+bx] ; 通过循环输出个分数段的人数
mov ah,2 ;调用DOS 系统功能输出一个字符
int 21h
mov [buffer3+bx],'0' ;显示之后将当前单元清零
inc bx
mov cx,4
c2: mov dl,' '
mov ah,2 ; 输出四个空格
int 21h
loop c2
cmp bx,5 ;判断5个分数段是否输出完 jnz a0 ;小于则继续输出 newline ;
pop cx
pop bx
ret
number endp
code ends
end start 输出换行符