《《汇编语言程序设计》课程设计说明书班级通信录管理系统的设计与实现 .doc》由会员分享,可在线阅读,更多相关《《汇编语言程序设计》课程设计说明书班级通信录管理系统的设计与实现 .doc(32页珍藏版)》请在三一办公上搜索。
1、班级通信录管理系统的设计与实现1 需求说明1.1实验要求1.1.1建立通讯录,添加一个同学的通信记录,删除一个同学的通信记录,修改一个同学的通信记录,查询一个同学的通信记录,显示所有同学的通信记录,能根据姓名或宿舍号进行排序。1.1.2通信记录包括学号、姓名、电话号码、宿舍号等信息,所有信息最终用文件保存。1.2功能简述1.2.1 建立通信录运行程序后,程序自动建立存放通讯录文档,并输出提示要求输入所建文档的文件名。显示程序提供操作的主菜单和提示符,等待用户输入信息。若输入错误,则清屏显示主菜单。1.2.2添加通信记录在班级通讯录的末尾添加一个同学的通信记录。添加成功后显示操作成功信息。1.2
2、.3删除通信记录删除通讯录时,先显示删除子菜单,询问用户是按学号、姓名、电话号码、宿舍号中的哪一种信息查找学生记录并删除。若选择按学号删除,则显示相应的提示信息,等待输入学号。显示找到的为该学号的所有同学信息,提示是否确定删除,若用户回答是,则删除,否则返回主菜单。1.2.4查询通信记录查询通信记录时,先显示查询子菜单,询问用户按学号、姓名、电话号码、宿舍号中的哪一种信息查找学生记录。等待用户输入该项信息,用户按下回车后显示所有匹配该信息的学生记录。1.2.5显示所有通信记录将文档中保存的所有同学的通讯记录用表格的形式显示出来,第一行显示同学通讯记录的标题,各个信息项之间用空格分开。1.2.6
3、根据姓名进行排序排序时,显示排序子菜单,询问用户是按照升序还是降序进行排序。然后根据要求对记录进行排序。1.2.7保存通讯记录将修改后的同学通讯记录保存到文档中。1.2.8退出班级通信录管理系统选择该功能选项后,退出班级通信录管理系统,关闭文件,返回dos。2设计说明2.1 程序流程图设计入口显示主菜单选择功能其他选择显 示 所 有 记 录显示子菜单输入添加显示子菜单选择关键字输入修改显示子菜单选择关键字查询删除显示子菜单选择关键字查询显示记录显示子菜单选择排序方向排序保存到文件退出ListtAddEditDeleteInquirySortSaveQuit结束其他错误输入2.2各功能之间的关系
4、2.2.1用户输入信息在Add、Edit、Delete、Inquiry函数中都需要用户输入学号、姓名、电话号码、宿舍号中的一项或全部信息,可以将输入学号、姓名、电话号码、宿舍号分别用inputID(输入学号)、inputName(输入名字)、inputNum(实习输入电话号码和宿舍号)来实现,Add函数中需要调用inputID、inputName、inputNum这三个函数,而Edit、Delete、Inquiry根据用户需要调用相应的函数来实现输入功能。2.2.2搜索同学记录在Edit、Delete、Inquiry函数中都需要在已存在的同学记录中搜索到与关键字匹配的同学记录。这样,可以把搜索
5、这个功能提取出来,实现代码的共享。其中搜索按关键字的类型不同分为按学号搜索、按姓名搜索、按电话号码搜索、按宿舍号搜索。2.2.3关键字的匹配Edit、Delete、Inquiry、Sort函数中都需要进行关键字匹配和比较。把比较关键字的大小提取出来在strCmp中实现。方便进行搜索和排序。2.3文档的处理在用户进入班级通信录管理系统时,创建文本文档,当用户选择Save功能时将缓冲区中的学生记录写进文档。当用户选择List时,将缓冲区和文档中的所有记录显示出来。用户退出后,关闭文档。3详细的算法设计3.1主菜单的显示mainMenu db | List-0,Add-1,Edit-2,Delete
6、-3,inquiry-4,Sort-5 |,0dh,0ah db | Save-6,Quit-7,MainMenu-else |$ ;显示主菜单showMainM procmov ah,09hlea dx,decLineint 21hlea dx,mainMenuint 21hlea dx,decLineint 21hretshowMainM endp3.2学生记录的数据结构records db 100 dup(9 dup(20h),$,3 dup(19 dup(20h),$),0dh,0ah);学生记录,包括学号和姓名(20个字符)、班级、寝室号信息。sCount db 0 ;搜索所得结果数
7、量rCount dw 0;记录数量0-216rLen dw 72;记录长度i dw 0;计数器j dw 0;计数器IDLen dw 10;学号长度(包括$)otherLen dw 20 ; 姓名、班级、寝室号长度(包括$)ID db ID$stdName db StdName$ ;输入学生信息提示TelNum db TelNum$dormNum db DormNum$inLabel db $3.3学生通讯录信息的显示和输入学生通讯录信息的显示和输入的逻辑实现思想是一样的。都是先找到第i条记录的起始地址,即学号的开始地址。然后根据j的值确定记录内部的偏移地址。然后调用相应的功能实现学生通讯信息的
8、显示和输入。下面以信息的显示为例作详细说明。 ;输出学号outID proclea bx,records ;使用基址变址的寻址方式mov ax,i ;输出第i条记录mov cx,rLenmul cx ;i乘以每条记录的长度,得到第i条记录在records中的起始位置add bx,ax ;得到第i条记录学号的有效地址mov dx,bx ;输出学号mov ah,09hint 21hretoutID endp;输出姓名等outOther proclea bx,recordsmov ax,imov cx,rLenmul cxadd bx,ax ;得到第i条记录的有效地址add bx,IDLen ;得到
9、第i条记录姓名的有效地址mov ax,otherLenmov cx,j ;j=0,输出姓名;j=1,输出电话号码;j=2,输出宿舍号mul cx add bx,ax ;得到要输出信息的开始地址mov dx,bx ;输出mov ah,09hint 21hretoutOther endp3.4学生信息的搜索根据用户选择的关键字的类型,按照3.3所述的方法找到第i条记录的相应关键字的起始地址。遍历所有的学生通讯录记录,调用strCmp函数对记录中的关键字和用户输入的信息相比较,用result返回比较结果。如result=2表示大于,result=1表示等于,result=0表示小于。3.5修改一个同
10、学的通信记录通过关键字搜索与之匹配的同学记录,若查找不到,则修改失败。否则提示用户输入新的通讯信息,覆盖原来的信息。3.6按照姓名进行排序Sort函数采用冒泡排序作为算法进行排序。内外循环次数均为同学通讯录记录的条数,升序和降序使用的数据结构基本一致。只是升序排序时将相邻的关键字键值较大的往后移,降序排序则将相邻的关键字的键值较大的往前移动。由于字符串的交换比较复杂,则将此子过程抽象出来,记为movR函数。使用loop循环依次交换两个记录的字符。3.7删除操作的实现删除数据信息, 查询条件为学号、姓名、电话号码、宿舍号的任意一条。,删除查询结果的,具体做法是:先搜索到与关键字匹配的记录,然后将
11、不停的将后面的一条信息前移,就达到删除的效果。.3.8与文件相关的操作3.8.1创建文件(int 21h)3.8.1.1输入参数AH=3CHDS:DX=存放文件名字串(含路径)信息(以0结尾)首址 CX=文件属性3.8.1.2输出参数成功, AX=File Handles(句柄);出错, CF=1 AX=错误代码3.8.2关闭文件关闭文件的输入参数为:AH=3E,BX=通过创建或打开文件而返回的句柄输出参数:成功, 无:出错, CF=1,AX=错误代码3.8.3打开文件3.8.3.1输入参数AH=3D,AL=存取方式代码, DS:DX=文件名首址AL:Bit Hex Access Mode 0
12、 0 0 0 Read-only access0 0 1 1 Write-only access0 1 0 2 Read/write access 3.8.3.2输出参数成功, AX=File Handles(句柄);出错, CF=1 AX=错误代码 3.8.4读文件输入参数:AH=3F BX= File Handles(句柄) CX=读字节数 DS:DX=缓冲区首址输出参数:AX=实际读出的字节数 DS:DX=存放读出信息的缓冲区首址。3.8.5 写文件输入参数:AH=40H BX= File Handles(句柄)CX=写字节数 DS:DX=存放写入信息缓冲区首址输出参数:AX=实际写入的
13、字节数3.9保存保存时将缓冲区records中的信息写入文件。4源程序与执行结果4.1源程序data segmentfileID dw -1;文件代号cferror db Create file error!,$;创建文件失败信息oferror db Open file error,$;打开文件失败信息rferror db Read file error!,$;读取文件失败信息wferror db Write file error!,$;写入文件失败信息msgInSdb Input success!,$;提示输入成功msgStore db Store Success!$msgadd db Ad
14、d success!,$msgeditdb Please search the student first!,0dh,0ah,$;编辑提示msgedit1 db Input the info of this student:,0dh,0ah,$msgedit2 db Edit successfully!,0dh,0ah,$msgedit3 db student $msgSearch db Search result:,0dh,0ah,$msgdelete1 db Sure to delete(Y-sure,N-no)?$msgdelete2 db Delete success!$unRec d
15、b Unknown input!$sortS db Sort finished!$sortChoice db Sort(0-dec,1-inc)$(学生记录的数据段定义见3.3)menuSearch db Search(0-ID,1-StdName,2-TelNum,3-DormNum)$;用于字符串比较的地址列表,字符串以$结束addr1 dw ?addr2 dw ?result db ?;存放比较结果,1为相等,0为不相等buffer db ?newLine db 0dh,0ah,$data endscode segmentassume cs:code,ds:datastart:mov a
16、x,datamov ds,axcall initcall mainmov ah,4chint 21h;初始化程序init proccall openFilecmp fileID,-1jz createjmp ldcreate:call createFilecmp fileID,-1jz exitInitcall storeRecordld:call loadRecordexitInit:retinit endp;主程序main proccall clearcall showMainM ;输出主菜单wait1:mov ah,09h ;等待用户输入选择lea dx,inLabelint 21hmo
17、v ah,01hint 21hcmp al,0 ;找到与用户的要求相匹配的分支,调用该函数jz Sym0cmp al,1jz Sym1cmp al,2jz Sym2cmp al,3jz Sym3cmp al,4jz Sym4cmp al,5jz Sym5cmp al,6jz Sym6cmp al,7jz qSymcall clear ;非法输入,显示主菜单call showMainMjmp wait1Sym6:call nLinecall createFilecmp fileID,-1jz qSymcall storeRecordjmp wait1Sym0:call nLinecall out
18、Alljmp wait1Sym4:call nLinecall searchcall nLinejmp wait1Sym1:call nLinecall addprocjmp wait1Sym2:call nLinecall editjmp wait1Sym3:call nLinecall deletejmp wait1Sym5:call nLinecall sortjmp wait1qSym:retmain endp;创建文件createFile procmov cx,0lea dx,filemov ah,3chint 21hjc error1mov fileID,ax;保存文件代号rete
19、rror1:lea dx,cferrormov ah,09hmov error,01hint 21hmov fileID,-1retcreateFile endp;打开文件openFile procmov ah,3dhmov al,02h;可读可写lea dx,fileint 21hjc error2;打开失败mov fileID,axerror2:retopenFile endp;写入记录storeRecord proc ;将缓冲区的记录写进文件mov cx,rCountmov i,cxmov cx,rLenlea dx,recordsstore:mov bx,fileIDmov ah,40
20、hint 21hjc error4dec ijz sexitadd dx,rLenjmp storeerror4:lea dx,wferrormov ah,09hint 21hjmp eeeeesexit:lea dx,msgStoremov ah,09hint 21hcall nLineeeeee:retstoreRecord endp;将文件中的记录载入缓冲区中loadRecord proclea dx,recordsmov cx,rLen;每次读72个字节load:mov bx,fileIDmov ah,3fhint 21hjc error3cmp ax,0;00h作为文件结尾jz le
21、xitadd dx,rLeninc rCountjmp loaderror3:lea dx,rferrormov ah,09hint 21hlexit:retloadRecord endp;录入记录inputRecord proccall clearRecordcall inputID ;输入学号call nLinemov j,0mov ah,09hlea dx,stdName;输入姓名int 21hlea dx,inLabelint 21hcall inputNameinc jcall nLinelea dx,TelNum;输入电话号码mov ah,09hint 21hlea dx,inLa
22、belint 21hcall inputNuminc jcall nLinelea dx,dormNum;输入宿舍号mov ah,09hint 21hlea dx,inLabelint 21hcall inputNumcall nLinelea dx,msgInSmov ah,09hint 21hretinputRecord endp;输出记录outRecord procmov ah,09hlea dx,decColint 21hlea dx,tab;输出tabint 21hcall outIDmov j,0call outOtherinc jcall outOtherinc jcall ou
23、tOthermov ah,09hlea dx,decColint 21hretoutRecord endp;输出标题outTitle procmov ah,09hlea dx,decLineint 21hlea dx,decColint 21hlea dx,tab;输出tabint 21hlea dx,IDint 21hlea dx,tab1;输出tabint 21hlea dx,stdNameint 21hlea dx,tab2;输出tabint 21hlea dx,TelNumint 21hlea dx,tab3;输出tabint 21hlea dx,dormNumint 21hlea d
24、x,tab2;输出tabint 21hlea dx,decColint 21hlea dx,decLineint 21hretoutTitle endp;按学号查找SRID procmov sCount,0;输入学号lea dx,IDmov ah,09hint 21hlea dx,inLabelint 21hmov cx,IDLendec cxlea bx,conditioninID:mov ah,01hint 21hcmp al,0dhjz exit4mov bx,alinc bxloop inIDexit4:;查找mov cx,rCountlea bx,recordsmov addr1,b
25、xlea bx,conditionmov addr2,bxlea bx,sRecordNumcmploop:push bxcall strCmppop bxcmp result,1jnz loopCmpmov ax,rCountmov dx,cxsub ax,dxmov bx,axinc bxinc sCountloopCmp:mov ax,addr1add ax,rLenmov addr1,axloop cmploopmov word ptrbx,0ffhretSRID endp;按除学号外其他信息查找SROther procmov sCount,0cmp i,1jz zjl llea dx
26、,dormNumjmp oz:lea dx,TelNumjmp ol:lea dx,stdNameo:mov ah,09hint 21hlea dx,inLabelint 21h;输入信息lea bx,condition1mov cx,otherLeninS:mov ah,01hint 21hcmp al,0dhjz exit5mov bx,alinc bxloop inSexit5:mov cx,rCount ;查找lea bx,recordsmov addr1,bxmov ax,IDLenadd ax,addr1mov addr1,axmov ax,imov dx,otherLenmul
27、dxadd ax,addr1mov addr1,axlea bx,condition1mov addr2,bxlea bx,sRecordNumcmplp: push bxcall strCmppop bxcmp result,1jnz lpCmpmov ax,rCountmov dx,cxsub ax,dxmov bx,axinc bxinc sCountlpCmp:mov ax,addr1add ax,rLenmov addr1,axloop cmplpmov word ptr bx,0ffhretSROther endp;字符串比较strCmp procmov si,0cmpl:mov
28、bx,addr1mov ah,byte ptr bx+simov bx,addr2mov al,byte ptr bx+sicmp al,ahjz cjb lessmov result,2;大于jmp eless:mov result,0;小于jmp ec:cmp al,$jz finishinc sijmp cmplfinish:mov result,1;相等e:retstrCmp endp;添加操作addproc procmov ax,rCountmov i,axcall inputRecordcall nLinelea dx,msgaddmov ah,09hint 21hinc rCou
29、ntretaddproc endp;删除操作deleteI proclea bx,recordsmov ax,imov dx,rLenmul dxadd bx,axmove:mov si,0mov cx,rLenmove1:add si,rLenmov al,byte ptr bx+sisub si,rLenmov byte ptr bx+si,alinc siloop move1add bx,rLenmov ax,rCountdec axcmp ax,ijz exxxinc ijmp moveexxx:dec rCountretdeleteI endp;编辑操作edit proclea dx
30、,msgeditmov ah,09hint 21hcall searchmov si,0lpss:lea bx,sRecordNummov ax,bx+sicmp ax,0ffhjz exitssmov ah,0mov i,axcall nLine;输出第si个学生lea dx,msgedit3mov ah,09hint 21hmov ax,siaammov cl,almov dl,ahmov ah,02hadd dl,30hint 21hmov dl,cladd dl,30hint 21hmov dl,:int 21hcall nLinepush sicall inputRecordpop
31、siinc sijmp lpssexitss:call nLinelea dx,msgedit2mov ah,09hint 21hretedit endp;查找函数search proclea dx,menuSearchmov ah,09hint 21hmov ah,01hint 21hcmp al,30hjz zerocmp al,32hjz twocmp al,31hjz onecmp al,33hjnz errorSmov i,2call nLinecall SROtherjmp exitzero:call nLinecall SRIDjmp exitone:mov i,0call nL
32、inecall SROtherjmp exittwo:mov i,1call nLinecall SROtherjmp exiterrorS:call nLinelea dx,unRecmov ah,09hint 21hlea bx,SRecordNummov byte ptr bx,0ffhjmp exits3exit:call nLinelea dx,msgSearchexitS:mov ah,09hint 21hcall nLinecall outSResultexits3:retsearch endp;换行nLine proclea dx,newLinemov ah,09hint 21
33、hretnLine endp;输出所有结果outAll proccall outTitlemov i,0ll:mov ax,rCountcmp ax,ijz exit9call outRecordinc icall nLinejmp llexit9:call nLineretoutAll endp;清屏clear procmov ax,0600h mov bx,0754h mov cx,0000h mov dx,194fh int 10h mov ah,2mov bh,0mov dh,0mov dl,0int 10h retclear endp;升序排序sortInc procmov i,1m
34、ov ax,rCountdec axmov j,axloop0:mov cx,rCountsub cx,imov di,0loop1:lea bx,recordsmov ax,dimul rLenadd bx,axmov addr1,bxadd bx,rLenmov addr2,bxcall strCmpmov al,resultcmp al,0jnz lp1push cxcall movRpop cxinc dilp1:loop loop1inc idec jcmp j,0jz exitSIjmp loop0exitSI:retsortInc endp;降序排列sortDec procmov
35、 i,1mov ax,rCountdec axmov j,axloop00:mov cx,rCountsub cx,imov di,0loop10:lea bx,recordsmov ax,dimul rLenadd bx,axmov addr1,bxadd bx,rLenmov addr2,bxcall strCmpmov al,resultcmp al,2jnz lp10push cxcall movRpop cxinc dilp10:loop loop10inc idec jcmp j,0jz exitSIjmp loop00exitSD:retsortDec endpmovR proc
36、 ;交换两个记录mov cx,rLenmov si,0movss:mov bx,addr1mov al,byte ptr bx+simov buffer,almov bx,addr2mov al,byte ptr bx+simov bx,addr1mov byte ptr bx+si,almov al,buffermov bx,addr2mov byte ptr bx+si,alinc siloop movssretmovR endpcode endsend start4.2执行结果4.2.1 List函数的执行结果4.2.2 Add函数的执行结果4.2.3 Edit函数的执行结果4.2.4
37、Delete函数的执行结果4.2.5 Qury函数的执行结果4.2.6 Sort函数的执行结果4.2.7 Save函数的执行结果5使用说明按照主菜单的提示输入数字0到7中的任意一个,进入该功能的子菜单。输入同学的同学录信息时,每个信息项以回车结束。学号最多为9位,名字。电话号码、宿舍号最多可输19位数字。另外,学号和名字可以是字母和数字的组合,而电话号码和宿舍号只能是数字。一点输入不正确或者溢出,则之前输入的信息为该项信息的内容。一开始就回车或者输入错误,则该信息项的内容为空。在Edit、Delete、Qury和Sort中有子菜单,则根据提示进行输入,若输入错误则提示错误信息,并且返回主菜单。
38、6总结6.1设计的特点班级通信录管理系统的主要特点是结构简洁,界面友好。在Edit、Delete、Qury中搜索定位一个通信记录时,可以让用户按照需求选择关键字的类型。其中关键字的类型可以是学号、姓名、电话号码、宿舍号的任意一种。 另外,在Sort的功能实现方面,提供了升序排序和降序排序两种方法供用户根据需要选择排序方向。而且,当有本设计不识别的字符输入时,系统自动返回主菜单,显示提示信息。 6.2设计的不足本设计的主要提升空间在Edit中,在编辑功能的界面中,根据用户输入的关键字类型和关键字找到与之匹配的通信记录后,显示该记录的全部信息。然后提示用户输入该同学的新信息。在这个地方,必须像添加
39、通信记录的时候一样,输入全部的该同学的信息,而没有实现可以让用户选择是修改该同学的哪一项信息。6.3收获与体会6.3.1学会了用汇编语言操作文本在学习汇编语言程序设计的时候,上机实验的程序使用的数据基本是存放在内存缓冲区中,根本不知道怎么将数据放入文本文档中进行保存。在这次课程设计期间,我通过查阅资料,学会了用汇编语言操作文本,对自己来说是一个收获。更重要的是,这个过程培养了我自学的能力,通过具体的实验需求学习自己没有掌握的知识。而不是像上机实验那样巩固老师所教的知识。6.3.2掌握了程序设计的流程以前做实验的时候,老是一上手就开始写代码。在做这个课程设计的时候,我也是一开始就写。但是发现好多代码是可以共享的。比如Edit、Delete、Qury中都要使用搜索功能。这时候,我就放下了写代码