集美大学计算机工程学院实验报告课程名称汇编语言程序设计实验名称实验六、个人档案管理系统实验类型设计型姓名学号日期2012-5-4 地点成绩教师评语:第1页共15页1.实验目的及内容1.实验目的掌握菜单、子程序的设计方法,文件的操作。
子程序的调用、及返回、出口参数的传递方法。
2.实验内容要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分。
程序可接受输入人名及相应的电话号码表,并把它们加入电话号码表文件中;凡有新的输入后,程序应该按人名对电话号码表重新排序;程序可接收需要查找电话号码的人名,并从电话号码表文件中查出其电话号码,并在屏幕上以如下格式显示出来。
Name telphoneXXXXX XXXXXXXXXXXXX主菜单I--Insert ;插入L--List ;列出所有记录S--Search ;查询Q--Quit ;退出程序的执行Select ;输入所选择的字符当选择S项时,出现子菜单2.TelephoneKey Item: ;输入1,表示输入姓名;输入2,表示输入电话号码Key Value ;输入所选择的字符2.实验环境Masm for windows 集成实验环境 20113.实验方法a. 首先定义个主菜单,菜单里面包含1.输入、2.查询、3.显示、4.写文件、5.读文件0.退出,六项功能,用定义的子函数menu将其显示在屏幕上上;b.在提示语下,用户根据需要,用键盘按下(1或者2或者3或者4或者5或者0)来选择菜单里显示的功能;c . .程序根据用户输入的信息与程序里设置的关键字进行比较,根据比较的结果调用相应的程序来实现用户所需要的功能;d. 分别编写输入输入子程序insert、显示子程序list、查找子程序cha、写文件子程序write和读文件子程序read,以实现上面的功能。
子程序Insert:首先显示输入名字的提示语,然后显示name:输入姓名(此时姓名暂存在临时空间tele存储单元里面),接着把它转存到电话号码表里,显示telphone:输入电话号码(电话号码暂tele存储单元里面),接着转存到电话号码表里,最后调用paixu子函数将电话号码按姓名排序。
子程序list:首先判断统计输入记录个数的count2的值,如果等于0,则显示语'There is no massage,please input massage first!',否则每次从电话号码表里取28个字符到临时空间,调用显示宏把它显示出来,count2减1,一次循环直到count2的值为0,显示完毕;子程序cha:首先显示小菜单,用户选择:1按电话号码查找,2按姓名查找,如果是选择1,则显示'Key value:',输入需要查找的人名,进行查找;若果选择2,则显示'Key value:',输入需要查找的电话号码,进行电话号码查找。
子程序write :在程序的开始首先打开文件,如果打开成功,则保存文件号,否则进行文件创建,由用户输入文件内容,先存入缓存区,再存到文件中。
子程序read:在程序的开始首先打开文件,如果打开成功,则保存文件号,接着把文件里的内容读出来,读到内存单元里(即电话号码表),接着再显示在屏幕上。
如果文件打开失败,则打印出错信息。
4.实验步骤1.编写汇编和链接源程序产生可执行文件;2 设计一组电话号码记录调用输入函数把它们输进去,程序根据输入的人名进行排序,在选择查找函数进行检验,,再次调用输入函输入一组数据进去,看能否输入,如果可以,就再次选择不同的功能,看能不能满足用户的需要。
如果不能则调用debug进行错误检测。
5.实验结论6. 实验分析 在程序的开始首先打开文件,如果打开成功,则保存文件号,接着把文件里的内容读出来,读到内存单元里(即电话号码表),如果文件打开失败,则进行文件创建,由用户输入文件内容。
本实验采取了模块化程序设计,设计了菜单,用户根据需要选择不同的功能,程序根据用户输入的内容,调用相应的子程序来实现,这在编写的时候标记简单;显示输入的电话号码等记录,只要用一个循环,每次从电话号码表里取一条记录(即28个字符)即可实现;输入函数,由于用户输入的字符个数不一样,因此用空格补充剩余的,这样便于后面的比较,并且把排序也放在输入这个模块里,查找函数这只要根据用户输入的信息进行相应的比较即可实现。
附件: 一、 流程图Insert 流程图 list 流程图nn ynNY 开始 设bx 为地址指针(输入姓名到tele 前20个单元缓存区中) 将tele 中的姓名存储到tel 中,调整bx 指针,为输入电话号码做准备输入电话到tele 后8个缓存单元中将tele 中的号码存储到tel 中,调整bx 指针,为输入下一条信息做准备 调用paiixu 子函数排序 结束 开始 Count2=0? ,从电话号码表取28个字符给huan cun ,并显示,调整地址指针。
cx=0? 显示没记录 Cx=cx-1 Cx=count2 main menu insert Cha Read list Writecha流程图12Write流程图:NYNYRead流程图:结束开始选择查找方式1或2 输入要查找的号码进行号码比对,找到并显示输入要查找的姓名进行姓名比对,找到并显示结束开始打开或创建文件进行写操作出错处理成功?成功?出错处理结束开始打开文件进行读操作,并显示在屏幕上出错处理成功?成功?出错处理结束二、程序代码data segmenttel db 50 dup(20 dup(' '),8 dup(' '),13,10);电话号码表tele db 20,?,20 dup(' '),9,?,9 dup(' ')pass db 20 dup(' '),8 dup(' ')nam db 20er db?eee db 20 dup(' ');待查姓名num db 9br db?bbb db 9 dup(' ') ;待查电话号码huan db 20 dup(?)db' 'cun db 8 dup(?),13,10,'$';缓存区first db'-------------------------------------------------',13,10db' | 1.Please input massage|',13,10db' | 2.Please input name who you want to check|',13,10db' | 3.Print|',13,10db' | 4.Write|',13,10db' | 5.Read|',13,10db' | 0.Exit|',13,10db'-------------------------------------------------',13,10,'$'input db'Please chooce:$'key db'Key value:$'search db' ---------------------------------',13,10db' | 1.Telephone |',13,10db' | |',13,10db' ---------------------------------',13,10,'$'print db' name telphone',13,10,'$';noth db'There is no massage,please input massage first!',13,10,'$' find db'Massage is found:',13,10,'$';nofind db'The massage is not found!',13,10,'$';put_na db' name:$'put_te db'telphone:$'continue db'Do you want to continue[y/n]? $'count2 dw 0 ;设置计数器count1 dw 0ERR_CR DB'CREATE ERROR!',13,10,'$';---出错信息---- ERR_OP DB'OPEN ERROR!',13,10,'$'ERR_CL DB'CLOSE ERROR!',13,10,'$'ERR_RD DB'READ ERROR!',13,10,'$'ERR_WR DB'WRITE ERROR!',13,10,'$';---出错信息---- FCODE DW?FNAME DB'd:\telbook.txt',0data endsput macro x ;输出提示信息lea dx,xmov ah,9int 21hendmcin macro y ;输入字符串mov dx,seg ymov ds,dxlea dx,ymov ah,10int 21hendmcout macro wmov dl,wmov ah,2int 21hendmchoice macromov ah,1int 21hendmhuanhang macrocout 13cout 10endmcode segmentassume cs:code,ds:data,es:datastart:mov ax,datamov ds,axmov es,axl6: huanhang ;换行call menu ;调用菜单子程序choicemov dh,alhuanhang;cmp dh,'0'jz l0cmp dh,'5'jz l5cmp dh,'4'jz l4cmp dh,'3'jz l3cmp dh,'2'jz l2cmp dh,'1'jz l1jmp l6l1: call insert ;1调用插入子程序 call paixu ;排序jmp l6l2: call cha ;2调用查找子程序 jmp l6l3: call list ;3调用显示子程序 jmp l6l4: call write ;4调用写文件子程序 jmp l6l5: call read ;5调用读文件子程序 jmp l6l0: mov ah,4chint 21hmenu proc near ;菜单显示函数put firstput inputretmenu endpinsert proc near ;插入函数lea di,telmov cx,count2cmp cx,0jz n1jia:add di,30loop jian1: xor bx,bxhuanhangput put_nacin tele[bx] ;输入姓名lea si,tele[bx+2]xor ch,chmov cl,tele[bx+1]cldrep movsbhuanhangxor cx,cxmov cl,tele[bx+1]mov ax,20sub ax,cxadd di,axadd bx,22put put_tecin tele[bx] ;输入电话号码lea si,tele[bx+2]mov cx,8cldrep movsbhuanhangadd di,2inc count2add count1,30 ;统计信息字节数put continuechoicecmp al,'n';?============?jz n2jmp n1n2: retinsert endppaixu proc nearmov cx,count2dec cxre:mov dx,cxxor bx,bxnext:push cxlea si,tel[bx]lea di,tel[bx+30]mov cx,20cldrepz cmpsbjbe m1lea si,tel[bx]lea di,passmov cx,28cldrep movsblea si,tel[bx+30]lea di,tel[bx]mov cx,28cldrep movsblea si,passlea di,tel[bx+30]mov cx,28cldrep movsbm1: add bx,30pop cxloop nextmov cx,dxloop reretpaixu endpcha proc near ;查找函数put searchd1: put inputchoicemov dh,alhuanhangcmp dh,'2';al是2就用姓名查找jnz d2put keycin namhuanhangmov cx,count2xor bx,bx ;把电话表中电话号码的个数给bxnext2:mov dx,cxlea di,tel[bx];指向要比较的姓名lea si,eeexor ch,ch ;待比较的姓名mov cl,ercldrepz cmpsb ;比对jz e1add bx,30 ;移动指针bx指向下一个要比较的姓名mov cx,dxloop next2put nofindjmp d3e1: put findhuanhangput printmov cx,28xian1: cout tel[bx]inc bxloop xian1jmp d3d2: cmp dh,'1';al是1就用电话号码查找;jnz d1put keycin numhuanhangmov cx,count2 ;把电话表中电话号码的个数给cxxor bx,bxadd bx,20 ;指向要比较的号码next3:mov dx,cxlea di,tel[bx]lea si,bbb ;待比较的号码xor ch,chmov cl,brcldrepz cmpsb ;比对jz e3add bx,30 ;移动指针di指向下一个要比较的号码mov cx,dxloop next3put nofindjmp d3e3: put findhuanhangput printsub bx,20mov cx,28xian2: cout [bx]inc bxloop xian2d3: retcha endplist proc near;显示电话号码表函数cmp count2,0jz en1put printmov cx,count2lea si,telc1: mov bx,cxlea di,huanmov cx,20cldrep movsblea di,cunmov cx,8cldrep movsbput huanadd si,2mov cx,bxloop c1jmp en2en1: put nothen2: retlist endpWRITE PROC ;***************************写入文件****************************LEA DX,FNAMEMOV AH,3DH ;打开文件MOV AL,2INT 21HJNC WR_WJLEA DX,FNAMEMOV AH,3CH ;建立文件XOR CX,CXINT 21HJNC WR_WJPUT ERR_CRJMP quit1WR_WJ:MOV FCODE,AX ;保存文件代号MOV AH,40H ;写入文件LEA DX,TELMOV BX,FCODEMOV CX,count1INT 21HJNC CLOSE1put ERR_WRCLOSE1:MOV AH,3EH ;关闭文件MOV BX,FCODEINT 21HJNC quit1put ERR_CLquit1: RETWRITE ENDPread procLEA DX,FNAME ;--------------------------------------MOV AH,3DH ;打开文件MOV AL,2INT 21HJNC OP_WJput ERR_OP ;--------------------------------JMP quit2OP_WJ:MOV FCODE,AX ;-------------------------------------------- RD_WJ:MOV AH,3FH ;读文件lea DX,telMOV BX,FCODEMOV CX,30INT 21HJNC dispput ERR_RDJMP CLOSEdisp :MOV CX,AX ;判断是否读完JCXZ CLOSEmov ah,40hmov bx,1lea dx,telint 21hjnc rd_wjput err_wrCLOSE:MOV AH,3EH ;-------------------- MOV BX,FCODE ;读完关闭文件INT 21HJNC quit2put ERR_CLquit2:retread endpcode endsend start。