基于汇编语言学生成绩管理系统_第1页
基于汇编语言学生成绩管理系统_第2页
基于汇编语言学生成绩管理系统_第3页
基于汇编语言学生成绩管理系统_第4页
基于汇编语言学生成绩管理系统_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

学生成绩管理系统目录设计内容2设计目的2设计要求2设计分析2子程序分析7操作说明10程序代码11总结30参考文献30设计内容设计一个学生成绩管理程序,要求能实现以下功能:各科成绩的录入,修改和删除。按姓名查询每个学生各门课的成绩。显示查询结果。统计个分数段的人数。5〕打印学生成绩。设计目的用汇编数据的录入、修改和删除操作。设计要求学习如何用汇编语言进行数据处理。设计分析1.总体结构整个程序采用主程序调用子程序的方法。主程序完成菜单的显示,子程序完成一个独立功能方法的实现。各子程序的实现方法简要描述如下:1〕设计INSERT〔录入〕子程序,先翻开文件SCORE.TXT,并置文件指针到文件尾,然后调用GET_REC子程序接受用户的输入,再把用户的输入写入文件,最后关闭文件返回主程序。2〕设计Delete〔删除〕子程序,先翻开文件,再调用宏GETIN得到要删除的学生的姓名,然后读文件中的记录,直到其记录的名字与所输入的名字相同为止,把文件指针后退8个字符〔即4门课成绩所占的空间〕,写入8个“0”3〕设计List〔浏览〕子程序时,先翻开文件,然后读一个记录,并通过调用宏SHOW_ITEM将其显示到屏幕上,入文件指针没有到达文件尾,那么继续读记录并显示,当指针到达文件尾时,那么关闭文件返回主程序。4〕设计Modify〔修改〕子程序时,先翻开文件SCORE.TXT,通用GER_REC得到要修改的记录,然后读文件中的记录,并与用户输入的记录做比拟〔只比拟记录中的名字局部〕,假设不同那么吨下一条记录,假设相同那么将文件指针后退23个字符〔一个记录为23个字符的长度〕,然后把用户输入的记录写入文件,最后关闭文件返回主程序。5〕设计Count〔统计〕子程序时,先翻开文件,然后读记录,比拟记录的第16个字符,数学成绩的高位〕,并统计,直到文件指针到达文件尾,最后关闭文件调用宏SHOW_ITEM显示统计结果,返会主程序。6〕设计Query〔查询〕子程序时,先翻开文件,通过调用宏GETIN得到要查找学生的姓名,然后读文件记录,并同要查找的学生姓名比拟,假设相同那么输出,假设不同继续读文件记录,最后显示查询结果,关闭文件返回程序。另外还有打印的分数段人数统计,这些结合后面的子程序功能分析做详细介绍。图1是本设计显示记录的界面图1学生成绩管理系统界面程序流程图如图2所示入口入口入口入口翻开文件翻开文件翻开文件翻开文件置指针到文件尾读一个记录置指针到文件尾读一个记录从终端接收用户输入的记录读错?Y从终端接收用户输入的记录读错?记录写入文件显示错误信息N记录写入文件显示错误信息文件尾?Y文件尾?关闭文件关闭文件关闭文件N关闭文件显示记录显示记录返回返回返回返回A〕List流程图B〕Insert流程图翻开文件返回返回文件删除记录姓名相同?读一条记录接收被删除记录的学生姓名入口返回关闭文件显示统计结果指针到达文件尾对数学成绩分段并统计翻开文件读一个记录入口入口翻开文件读一个记录是否为要修改的记录返回关闭文件显示记录返回写入修改记录并关闭文件文件指针后退一个记录是否为所寻找的记录读一个记录翻开文件入口翻开文件返回返回文件删除记录姓名相同?读一条记录接收被删除记录的学生姓名入口返回关闭文件显示统计结果指针到达文件尾对数学成绩分段并统计翻开文件读一个记录入口入口翻开文件读一个记录是否为要修改的记录返回关闭文件显示记录返回写入修改记录并关闭文件文件指针后退一个记录是否为所寻找的记录读一个记录翻开文件入口YYNNNYNY开始开始调用Query子程序调用Delete子程序调用Insert子程序调用Count子程序调用Modify子程序调用Iist子程序显示菜单输入一个字符结束是E是I是C是M是D是Q是L调用Query子程序调用Delete子程序调用Insert子程序调用Count子程序调用Modify子程序调用Iist子程序显示菜单输入一个字符结束是E是I是C是M是D是Q是LYNYNYNYNYNYNNY在大型的程序中,为了使程序清晰、可读性好,一般会大量使用宏和子程序,因此,充分了解这些宏和子程序,才能掌握程序的编制方法。2.宏的分析此题中使用了以下宏,其作用如下:SHOW:用来指定地址的显示字符串,有一个地址参数SET_P1:设定光标位置,有一个可变参数a,作用是讲光标置于坐标〔a,36〕处,使用了BIOS中断10H的2号功能。SET_P2:将光标置于〔12,2〕处。SET_P3:将光标置于〔1,30〕处。CLEAR:去除整个屏幕,用BIOS中断10H的7号功能实现,范围是从坐标〔0,0〕到〔24,79〕,将整个区域变为空白。CLEAR1:去除有半局部屏幕,去除范围从坐标〔4,36〕到〔10,79〕,结果是擦出此区域的显示内容。CLEAR2:去除下半局部屏幕,去除范围是从坐标〔12,0〕到〔24,79〕,结果是擦除此区域的显示内容。NNWLINE:回车换行。SHOE_ITEM:显示记录内容,执行后显示名称,然后依次显示4项功课成绩,各项成绩间空3个空格,最后换行。这个宏包含的语句较多,如果每次都直接用语句实现非常冗长,使用宏后那么主程序就很简洁,充分表达了使用宏的优点。GETIN:获取学生的信息,这也是一个使用频繁的宏,其中含有很多的指令,它带有ADDRS和COUNT2两个参数,ADDRS是存放信息的数据段位置,CIUNT2是接受的字符数。子程序分析下面详细分析程序中用的的主要的子程序。〔1〕INSERT子程序INSERT子程序的功能是录入一条记录。首先保存现场入栈,然后DOS中断3D号功能翻开FNAME指定的文件,然后宏GETIN去除屏幕右半局部的记录输入区域。在记录的第一项处置光标,用GET_REC获取记录内容,用DOS中断42H号功能将指针移到文件末尾。再用DOS中断40H号功能将放在BUFFER缓冲区的23个字节的内容写到文件中,接着关闭文件,重新设置光标位置在显示记录位置。最后弹栈恢复现场。〔2〕GET_REC子程序GER_REC子程序的功能是获取新的记录内容。首先用宏GETIN获取学生的姓名,放入BUFF2中,最多15个字符,如果遇到回车键那么提前结束。再用循环方式将BUFFER2中的15个字符送到BUFFER1中。然后用宏SET_P1将光标置于数学成绩输入项后,等待键盘输入。输入的成绩,先放在BUER2中,然后加到BUFFER1中的姓名后面。输入为2个字符后遇到回车键提前结束。接着用同样的方法输入英语成绩,计算机成绩和中文成绩。完成后,这个程序就得到了一个记录的所有信息。〔3〕OPENF子程序OPENF是个一个非常简单的子程序。它的作用是翻开一个文件并把一个文件句柄保存在数据段的handle缓冲区中。〔4〕QUERY子程序QUERY是查询一条记录。首先保存现场。然后分别去除界面右上方和下边的区域。翻开FAME指定的文件并保存文件句柄。将光标至于界面的下半空白局部开始处,用宏GETIN获取最多15个字符的输入,然后将BUFFER1中的内容与BUFFER2中进行比拟,看是否相同。如果不同,再继续向下从文件中读出23个字节比拟,循环向下,直到相同或文件结束为止。如果不同,那么显示该条记录,然后关闭文件,恢复现场。B:MOVAH,3FH;读文件MOVCX,23;读23个字节〔记录长度〕MOVDX,OFFSETBUFFER2;放在BUFFER2中INT21HLEASI,BUFFER2LEADI.BUFFER1MOVCX,15;循环次数C:MOVAL,BYTEPTR[SI]CMPAL,BYTEPTR[DI];比拟BUFFER1和BUFFER2JNZB;不同那么转BINCSIINCDLOOPC〔5〕MODIFY子程序MODIFY子程序的功能是修改记录。先保护现场,然后去除右上局部的记录输入区域,接着翻开文件。用GET_REC子程序获取输入的记录信息,并存入BUFFER1中。从翻开的文件中读取一个记录的内容〔23个字节〕放在BUFFER2中。比拟记录前面的15个字节〔姓名〕,如果不同,那么读取下一个记录;如果相同,那么回移一个记录的指针,回到刚刚这条记录的位置〔因为读取一个记录后,指针已移到下一条记录上〕。将放在BUFFER1中的输入的记录写到刚刚这条记录在文件中的位置上,从而实现此记录的修改。最后关闭程序,恢复现场。〔6〕DELETE子程序DELETE子程序的功能是删除一条记录。首先保存现场,去除屏幕。然后翻开文件,保存文件句柄。用宏GETIN获取15个字节的姓名字符,放在BUFFER1中。读取一条记录〔23个字节〕,放在BUFFER2中,然后和BUFFER1中内容比拟,如果不同,读取下一条记录。如果姓名相同,那么把指针后移8个字符〔4门功课所占空间〕,写入8个“0〞字符。关闭文件,恢复现场并退出。〔7〕LIST子程序LIST子程序的作用是显示文件中的记录。首先去除记录输入区和显示区域。然后显示记录字段的标题。翻开文件,保存文件句柄。读取一条记录的内容放在BUFFER1中,并判断是否到了文件末尾,如果不是,那么显示这条记录。循环读取直到文件结束。最后关闭程序,恢复现场。〔8〕PRINT子程序DELETE子程序的功能是打印文件中的记录。用OPENF子程序翻开文件。读取一条记录,汇编语言提供了自定义数据结构的结构定义语句,可将不同的数据类型放在一个数据结构中,便于处理,在本程序中的记录就采用了结构定义语句。这里读取记录也用了结构的方法。接着用DOS中断21H的5号功能,逐字打印存放在BUFFER1中的所以字符。一条记录打完后,打印回车符换行。然后用同样方法继续读取下一条记录并打印,直到文件结束为止。最后关闭文件退出。〔9〕COT子程序COT子程序的作用是统计各分数段小说人数,并简化程序,作为例如,本程序只统计记录数学各分数段的人数。首先显示统计结果的标题:maths<60<70<80<90<100。然后翻开文件。读取记录,将记录的第16个字符〔数学分数的高位〕取出比拟。统计结果依次放在以BUFFER3开头的内存单元中,如果小于60,那么将小于60的记录单元BUFFER3加一;假设小于70,那么将小于70的记录单元BUFFER3加一,即BUFFER3下一个地址单元内容加一,依次类推。处理完后再读取下个记录,作同样处理,直到文件结束为止。接着显示放在BUFFER3中的各分数段的人数的统计结果,最后关闭文件结束。从程序中可以看出,统计时程序有个限制,本例每个分数段最多不能超过9个人。操作说明改程序除源程序外,还需要另一个存放记录的文件〔此程序中使用的文件名为SCORE.TXT),但本程序并没有创立这个文件的功能。要产生这个文件,可用记事本先做以一个空的文件名为SCORE.TXT的文件。程序的运行与该文件的存放位置有关,位置是程序数据段的FNAME的值。二者要保持一致,否那么会因为找不到数据存放文件而出错。程序运行时,在出现主菜单后,按1键,将显示学生的各科成绩;按i键,将执行录入功能,可以录入新的学生成绩;按M键,了修改学生成绩。由于本程序时隔简单程序,所以在修改时,要输入学生的所有成绩,包括不要修改的成绩;按D键后,输入要删除的学生名,将使其成绩全为0;按Q键后,输入要查询的学生的姓名,键显示其各科成绩;按C键将显示数学成绩的分段统计结果。以上功能在运行时可以单独实现〔即在进入主菜单后,单击功能键选中该功能进行操作后程序会关闭。但要运行其他功能,那么要重新进入主菜单单击别的功能键,即每次只能运行一项功能〕。要特别说明的是,本程序住一套目的是验证汇编程序实现的数据记录操作功能,为使程序不至于郭长,减少篇幅,因此程序处理会很简单。程序中没有错误处理程序,如果输入错误,如按退格键将会出错,因此输入时要注意补要输错。程序代码datasegmentmess1db'studentgrademanagementsystem',0ah,0dh,'$'mess2db'thisismainmenu',0ah,0dh,'$'mess3db'insert(i)pleaseinput:',0ah,0dh,'$'mess4db'modify(m)name:',0ah,0dh,'$'mess5db'delete(d)maths:',0ah,0dh,'$'mess6db'query(q)english:',0ah,0dh,'$'mess7db'count(c)computer:',0ah,0dh,'$'mess8db'print(p)chinese:',0ah,0dh,'$'mess9db'exit(e)',0ah,0dh,'$'mess10db'**********************************************************$'mess11db'nameMaEnCoCh',0ah,0dh,'$'mess13db'list(l)',0ah,0dh,'$'mess12db'maths<60<70<80<90<100',0ah,0dh,'$'err1db'thereisnotthisstudent$'err2db'fileclosewrong$'fnamedb"d:\masm\score.txt";记录分数文件的路径和文件名。buffer1db23dup(?)buffeerdb0ah,0dh,'$'buffer2db30dup(?)buffer3db8dup('0')countdb5handledw?deldb8dup('0')xdb?dataendsscorestruc;定义记录结构namesdb15dup('')mathsdb0,0englishdb0,0computerdb0,0chinesedb0,0scoreendsshowmacroaddrs;显示字符串leadx,addrsmovah,9int21hendmset_p1macroa;设光标于〔a,36〕movah,2movdh,amovdl,36movbh,0int10hendmset_p2macro;设光标于〔12,2〕movah,2movdh,12movdl,2movbh,0int10hendmset_p3macro;设光标于〔1,30〕movah,2movdh,1movdl,30movbh,0int10hendmclearmacro;清整个屏幕moval,0movcl,0movch,0movdh,24movdl,79movbh,7movah,6int21hendmclear1macro;清右上记录输入区moval,0movbh,7movch,4movcl,36movdh,10movdl,79movah,6int10hendmclear2macro;清下半局部记录显示区moval,0movbh,7movch,12movcl,0movdh,24movdl,79int10hendmnewlinemacro;回车换行pushaxpushdxmovdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hpopdxpopaxendmshow_itemmacroaddrs;在指定位置显示记录localiloop,w10pushbxpushcxmovbx,0iloop:movdl,addrs[bx];显字符串movah,2int21hincbxcmpbx,15jliloopmovcx,4w10:movdl,''movah,2int21hmovdl,''movah,2int21hmovdl,''movah,2int21hmovdl,addrs[bx]movah,2int21hincbxmovdl,addrs[bx]movah,2int21hincbxloopw10newlinepopcxpopbxendmgetinmacroaddrs,count2;从键盘获取信息localzeroit,lp,input_end,exitpushbxpushaxmovbx,0zeroit:movaddrs[bx],''incbxcmpbx,15jlzeroitmovbx,0lp:movah,1int21hcmpal,0ahjzinput_endcmpal,0dhjzinput_endmovaddrs[bx],alincbxcmpbx,count2jllpinput_end:cmpal,0dhjzexitcmpal,0ahjzexitmovah,7int21hjmpinput_endexit:popaxpopbxendmcodesegmentmainprocfarassumecs:code,ds:data,es:datastart:movax,datamovds,axmovah,0;设显示模式80*25moval,3int10hclearshowmess1showmess2showmess13showmess3showmess4showmess5showmess6showmess7showmess8showmess9newlineshowmess10set_p3w:movah,7int21hcmpal,'i'jnzn1callinsertjmpwn1:cmpal,'m'jnzn2callmodifyjmpwn2:cmpal,'d'jnzn3calldeletejmpwn3:cmpal,'q'jnzn4callqueryjmpwn4:cmpal,'c'jnzn5callcotjmpwn5:cmpal,'p'jnzn6callprintjmpwn6:cmpal,'l'jnzn7calllistjmpwn7:cmpal,'e'jzexitfjmpwexitf:movah,4chint21hretmainendpinsertprocnearpushaxpushbxpushcxpushdxmovdx,offsetfnamemoval,2movah,3dh;翻开文件int21hmovbx,axclear1set_p14callget_recmovcx,0;指针移到文件尾movdx,0moval,2movah,42hint21hmovcx,23;写文件movdx,offsetbuffer1movah,40hint21hmovah,3eh;关闭文件int21hset_p3popdxpopcxpopbxpopaxretinsertendpget_recprocnearpushaxpushbxgetinbuffer2,15;输入姓名movbx,0movcx,15continue:moval,buffer2[bx]movbuffer1[bx],alincbxloopcontinueset_p15getinbuffer2,2;输入数学成绩moval,buffer2movbuffer1[bx],alincbxmoval,buffer2+1movbuffer1[bx],alincbxset_p16getinbuffer2,2;输入英语成绩moval,buffer2movbuffer1[bx],alincbxmoval,buffer2+1movbuffer1[bx],alincbxset_p17getinbuffer2,2;输入计算机成绩moval,buffer2movbuffer1[bx],alincbxmoval,buffer2+1movbuffer1[bx],alincbxset_p18getinbuffer2,2;输入语文成绩moval,buffer2movbuffer1[bx],alincbxmoval,buffer2+1movbuffer1[bx],alincbxpopbxpopaxretget_recendpopenfprocnear;翻开文件movdx,offsetfnamemoval,02movah,3dhint21hmovhandle,axretopenfendpqueryprocnear;查询记录pushaxpushbxpushcxpushdxclear1clear2movdx,offsetfnamemoval,2movah,3dh;翻开文件int21hmovbx,axset_p2getinbuffer1,15;取姓名到buffr1中leadx,mess11movah,9int21hb:movah,3fh;读文件movcx,23;读23个字节〔记录长度movdx,offsetbuffer2;放在buffer2中int21hleasi,buffer2leadi,buffer1movcx,15;循环次数c:moval,byteptr[si]cmpal,byteptr[di];比拟buffer1和buffer2jnzb;不同那么转bincsiincdiloopcmov[buffer2+23],'$'show_itembuffer2movah,3ehint21hpopdxpopcxpopbxpopaxretqueryendpmodifyprocnear;修改记录pushaxpushbxpushcxpushdxclear1set_p14movdx,offsetfnamemoval,2movah,3dhint21hmovbx,axmovhandle,axcallget_rec;读取输入内容放在buffer1read:movdx,offsetbuffer2movcx,23movah,3fh;读文件,记录内容放在buffer2int21hleasi,buffer2;比拟姓名是否相同leadi,buffer1movcx,15c5:movdl,byteptr[si]cmpdl,byteptr[di]jnzreadincsiincdiloopc5movbx,handlemovah,42h;回移文件指针moval,1movcx,0ffffhmovdx,-23int21hmovcx,23movdx,offsetbuffer1movah,40h;写入修改记录int21hmovah,3ehint21hjmpexit2exit1:set_p2showerr1exit2:set_p3popdxpopcxpopbxpopaxretmodifyendpdeleteprocnearpushaxpushbxpushcxpushdxclear1set_p14movdx,offsetfnamemoval,2movah,3dh;翻开文件int21hmovbx,axmovhandle,axgetinbuffer1,15;读取键盘输入放在buffer1read5:movdx,offsetbuffer2movcx,23movah,3fh;从文件读记录放在buffer2中int21hleasi,buffer2leadi,buffer1movcx,15c6:movdl,byteptr[si]cmpdl,byteptr[di]jnzread5incsiincdiloopc6movbx,handlemovah,42h;移文件指针moval,1movcx,0ffffhmovdx,-8int21hmovcx,8movdx,offsetdelmovah,40h;写文件int21hmovah,3eh;关闭文件int21hjmpexit6exit5:set_p2showerr1exit6:set_p3popdxpopcxpopbxpopaxretdeleteendplistprocnear;列文件中记录pushaxpushbxpushcxpushdxclear1clear2set_p2showmess11movdx,offsetfnamemoval,2movah,3dh;翻开文件int21hmovbx,axagain:movdx,offsetbuffer1;读取记录movcx,23movah,3fhint21hcmpax,0jzpshow_itembuffer1jmpagainp:movah,3eh;关闭文件int21hset_p3popdxpopcxpopbxpopaxretlistendpprintprocnearpushaxcallopenf;翻开文件movcl,countmovch,0read2:movdx,offsetbuffer1movcx,typescoremovah,3fh;读文件int21hmovcx,23hmovbx,0next:movah,5movdl,byteptrbuffer1[bx]int21hincbxloopnextmovah,5movdl,0dhint21hdecxcmpx,0jnzread2movbx

温馨提示

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

评论

0/150

提交评论