用汇编语言实现电话本功能--课程设计.doc_第1页
用汇编语言实现电话本功能--课程设计.doc_第2页
用汇编语言实现电话本功能--课程设计.doc_第3页
用汇编语言实现电话本功能--课程设计.doc_第4页
用汇编语言实现电话本功能--课程设计.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

微机原理 课 程 设 计 报 告一、 课程设计目的运用所学的汇编语言写一个具有电话本功能的程序,达到提高动手能力及解决问题的能力。二、 设计要求1、 能够存储50个电话号码,包括人名(20个字符)、电话号码(8个字符)。2、 系统可以随时接受新的人名和电话号码。3、 具有随时查询号码的功能。要求输入人名后,在屏幕上显示相应的电话号码。4、 具有删除号码的功能。要求输入人名后,系统自动删除相应的号码。5、 运行此系统后,要显示菜单选择的功能。三、 程序设计思想每个人的信息包括人名和号码,人名占20个字节,外加一个$字符,电话号码占8个字节,外加一个$字符,所以每个人的信息一共占30个字节。可以开辟一片连续的存储区,包含30*50即1500个字节,即zhu db 1500 dup(0)。另外再定义四个需要输入信息的变量,依次为:zhu1 db 21,0,21 dup(0) ;搜索姓名变量 zhu2 db 21,0,21 dup(0) ;添加姓名变量 zhu3 db 9,0,9 dup(0) ;添加号码变量zhu4 db 21,0,21 dup(0) ;删除姓名变量添加新的人名和号码时,可以通过10号功能调用,先将人名和号码暂时存放在zhu2和zhu3中,然后在逐字节地复制到zhu 中,记住在人名和号码末尾加上$字符。查询号码时,将输入的要查询的人名存放在zhu1中,然后再每隔30个字节与zhu中的人名逐个字符地比较,若完全相等,则将人名下面的号码输出,否则说明要查询的人名不存在。删除时,先输入要删除的人名,同查询相似,按同样的方法在zhu中寻找相应的数据区,若找到了,则从找到时下面一个人的信息开始,统一向上移动30个字节,若没有找到,则说明要删除的人名的信息不存在。四、 程序框图 五、程序清单datas segment obf1 db welcome to use this phone book!$ obf2 db please choose the function buttom(1/2/3):$ obf11 db 1 for inputing$ obf16 db 2 for searching$ obf17 db 3 for deleting$ obf18 db other for exiting$ obf3 db please input a new name(within 20 words):$ obf4 db please input the number(within 8 numbers):$ obf5 db continue to input?(y/n)$ obf6 db are you sure to end the phone book?(y/n)$ obf7 db please input a name you want to search(within 20 words):$ obf8 db got it,it is:$ obf9 db have not found ,it does not exit!$ obf10 db continue to search?(y/n)$ obf12 db please input the name you want to delete(within 20 words):$ obf13 db the name you want to delete does not exit!$ obf14 db success to delete!$ obf15 db continue to delete?(y/n)$ zhu1 db 21,0,21 dup(0) ;搜索(查询)姓名变量 zhu2 db 21,0,21 dup(0) ;添加姓名变量 zhu3 db 9,0,9 dup(0) ;添加号码变量 zhu4 db 21,0,21 dup(0) ;删除姓名变量 zhu db 1500 dup(0)datas endsstacks segment dw 32 dup(0) stacks endscodes segment assume cs:codes,ds:datas,ss:stacksstart:mov ax,datas mov ds,ax mov bp,-30begin:call nextline mov dx,offset obf1 ;显示菜单选择界面 mov ah,9 int 21h call nextline ;调用换行函数 mov dx,offset obf2 mov ah,9 int 21h call nextline mov dx,offset obf11 mov ah,9 int 21h call nextline mov dx,offset obf16 mov ah,9 int 21h call nextline mov dx,offset obf17 mov ah,9 int 21h call nextline mov dx,offset obf18 mov ah,9 int 21h call nextline mov al,0 mov ah,1 int 21h cmp al,1 ;选择1,输入信息 je input cmp al,2 ;选择2,查询信息 je search cmp al,3 ;选择3,删除信息 je delete jmp stop input: call nextline add bp,30 mov si,bp s2:mov byte ptr zhusi,0 ;清除zhu中最后一个人的信息后面的30 inc si ; 个字节中非0的单元 cmp si,0 jne s2 mov si,bp mov dx,offset obf3 mov ah,9 int 21h mov dx,offset zhu2 ;输入的人名存放在zh2中 mov ah,10 int 21h mov bx,-1 s5:inc bx ;为避免zhu2中刚输入的信息没有完全覆 cmp byte ptr zhu2bx+2,0dh ;盖上一次的信息,将出车符(0dh)及其后 jne s5 ;面的字节归0 s6:mov byte ptr zhu2bx+2,0 inc bx cmp bx,20 jne s6 mov byte ptr zhu2bx+2,0dh mov cx,20 mov bx,-1 s1:inc bx ;将zh2复制到zhu中 mov dl,byte ptr zhu2bx+2 mov byte ptr zhusi+bx,dl loop s1 mov byte ptr zhusi+20,$ call nextline mov dx,offset obf4 mov ah,9 int 21h mov dx,offset zhu3 mov ah,10 int 21h mov bx,-1 s7:inc bx ;为避免刚输入的号码没有完全覆盖上一次的号码,将这次输 cmp byte ptr zhu3bx+2,0dh ; 入的号码的最后一位的回车符(0dh)换成$ jne s7 mov byte ptr zhu3bx+2,$ add si,21 mov cx,8 mov bx,-1 s3:inc bx mov dl,byte ptr zhu3bx+2 mov byte ptr zhusi+bx,dl loop s3 mov byte ptr zhusi+8,$ call nextline mov dx,offset obf5 mov ah,9 int 21h call nextline mov ah,1 int 21h cmp al,y je input cmp al,y je input jmp beginstop: call nextline mov dx,offset obf6 mov ah,9 int 21h mov al,0 mov ah,1 int 21h cmp al,y je exit cmp al,y jne begin exit:mov ax,4c00h ;退出电话本程序 int 21h search:call nextline mov dx,offset obf7 ;输入你要搜索的名字,存放在zhu1中 mov ah,9 int 21h mov dx,offset zhu1 mov ah,10 int 21h mov bx,-1 l5:inc bx ;为避免zhu1刚输入的信息没有完全覆盖上一次的信息, cmp byte ptr zhu1bx+2,0dh ;将回车符(0dh)及其后面的字节归0 jne l5 l6:mov byte ptr zhu1bx+2,0 inc bx cmp bx,20 jne l6 mov byte ptr zhu1bx+2,0dh call nextline mov cx,50 ;在zhu中搜索与zhu1相等的字符串 mov si,-30 l1:add si,30 mov bx,-1 l2:inc bx cmp bx,20 je l3 push ax mov al,byte ptr zhusi+bx mov ah,byte ptr zhu1bx+2 cmp al,ah pop ax je l2 loop l1 mov dx,offset obf9 ;没有搜索到 mov ah,9 int 21h jmp l4 l3:mov dx,offset obf8 ;搜索到了 mov ah,9 int 21h inc bx add bx,offset zhu add bx,si mov dx,bx mov ah,9 int 21h l4:call nextline mov dx,offset obf10 ;继续搜索吗? mov ah,9 int 21h mov al,0 mov ah,1 int 21h cmp al,y je search cmp al,y je search jmp begin delete:call nextline mov dx,offset obf12 ;输入你要删除的名字,存放在zhu4中 mov ah,9 int 21h mov dx,offset zhu4 mov ah,10 int 21h mov bx,-1 d6:inc bx ;为避免zhu4刚输入的信息没有完全覆盖上一次的信息, cmp byte ptr zhu4bx+2,0dh ;将回车符(0dh)及其后面的字节归0 jne d6 d7:mov byte ptr zhu4bx+2,0 inc bx cmp bx,20 jne d7 mov byte ptr zhu4bx+2,0dh call nextline mov cx,50 mov si,-30 d1:add si,30 mov bx,-1 d2:inc bx cmp bx,20 je d3 push ax mov al,byte ptr zhusi+bx mov ah,byte ptr zhu4bx+2 cmp al,ah pop ax je d2 loop d1 mov dx,offset obf13 ;你要删除的姓名不存在 mov ah,9 int 21h jmp d5 d3:push ax d4:mov al,byte ptr zhusi+30 mov byte ptr zhusi,al inc si cmp si,0 jne d4 pop ax sub bp,30 mov dx,offset obf14 ;删除成功! mov ah,9 int 21h d5:call nextline mov dx,offset obf15 ;要继续删除吗? mov ah,9 int 21h mov al,0 mov ah,1 int 21h cmp al,y je delete cmp al,y je delete jmp begin nextline proc ;换行函数 mov dl,0ah mov ah,2 int 21h mov dl,0dh mov ah,2 int 21h retnextline endpcodes ends end start六、程序测试结果调试以上程序,生成.exe文件后,运行该.exe文件,得到如下结果:图(1)先选择1号功能,即输入信息,得到:图(2)选择n,即返回菜单选择界面,并选择2号功能,即查询信息,得到:图(3)选择n,返回显示菜单选择界面,选择3号功能,即删除信息,得到:图(4)选择n,又回到菜单显示界面,重新查询信息,可以得到:图(5)选择n,返回菜单显示界面,按任意键,得到:图(6)选择n,结束电话本系统。 分析:选择1号功能时,输入了zhu qing chun,95209638;zhang lei,85209637;qin jun,52093478一共三个人的号码信息,选择2号功能时,查询了zhang lei和qin jun的信息,均正确,当输入cheng yuan xi时,显示have not found,it does not exit!表明无此人信息。当选择3号删除功能时,先删除了qin jun的信息,后删除cheng yuan xi时显示the name you want to delete does not exit!表明电话本中原来就没有存储cheng yuan xi的信息。当再次查询时,没有qin jun的信息,而zhang lei和zhu qing chun的信息仍然保存。由以上测试表明此电话本系统能正确地实现添加、查询和删除的功能,满足设计要求。七、程序调试过程中遇到的问题即解决方法1、当要让显示器显示一个字符串时,一定要在字符串的结尾加上一个$字符,这个$字符非常重要,第一次,由于粗心,从字符串obf5起,后面的字符串的末尾都忘了加$,结果造成程序在运行时,跳过了很多语句,直接将obf5及obf5后边的所有的提示性语句都输了出来。因为系统在输出时,只有在遇到$时才结束,若没有结束字符$,则系统一直将数据段的数据顺序输出,知道遇到$字符为止。2、在编写子函数时,一定要在其结尾加上ret,然后加上结束标志endp。在编写换行子函数nextline时,由于在结尾没有加ret,结果程序不能正确运行,而且总是自动终止了程序,加上ret后,即可正确运行。3、在实现查询功能时,开始总是出现有的人名的信息第一次可以查询出来,而同样的人名在第二次、第三次查询时,则显示不存在。经过反复思考,发现在第二次输入查询的人名时,由于所有的查询都共用一个变量zhu1,这就导致第二次输入时,由于人名比第一次短,没有完全覆盖,造成上次的人名和这次输入的人名相叠加了,结果和zhu中所有的人名比较时,就不能查询到第二次实际输入的人名。同样的问题也出现在删除函数中和添加函数(输入函数)中。为此,可将输入、查询和删除中的zhu2,zhu1和zhu4中20个字符的位置中没有使用的统一置0。4、在输入时,如果输入的电话号码没有8位,则在查询时,出现上一个人的电话号码的头几位出现在要查询的人的号码的后几位中。显

温馨提示

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

评论

0/150

提交评论