要求:
(1)创建一个电话号码表文件,每项包括人名(20个字符)及电话号码(8个字符)两部分。
(2)程序可接收输入人名及相应的电话号码,实现有序插入、查询、删除等操作。

编译环境:MASM6.15(教材32位汇编语言程序设计-钱晓捷)
请根据自己的环境适当修改代码。

;创建一个电话号码表文件;
;每项包括人名(20个字符)及电话号码(8个字符)两部分;
;程序可接收输入人名及相应的电话号码;
;实现有序插入、查询、删除等操作。
;ebx:全局存储电话簿的记录数include io32.inc
telephone struct
name1     byte 20 dup(?)
phone     byte 9  dup(?)
telephone ends
;电话簿的结构体.data
select  byte "please enter a option[1-6]&[5:menu]: ",0;功能选项
nbuffer  byte 100 dup(?);姓名的缓冲区
tbuffer  byte  100 dup(?);电话的缓冲区
people      telephone 10 dup(<>);电话簿的容量
;菜单表
menu     byte 13,10,"**********menu**********",13,10,"input telephone--------1",13,10,"search telephone-------2",13,10,"delete telephone-------3",13,10,"display telephone------4",13,10,"display menu-----------5",13,10,"exit-------------------6",13,10,"**********end***********",13,10,0.code
start:    xor ebx,ebxxor ecx,ecx;显示菜单mov eax,offset menucall dispmsg.while eax!=0again:  mov eax,offset selectcall dispmsgxor eax,eaxcall readsid.if eax==1;输入数据call input.elseif eax==2;查询数据call search.elseif eax==3;删除数据call delete.elseif eax==4;显示数据call display.elseif eax==5;显示菜单mov eax,offset menucall dispmsg.elseif eax==6;退出mov eax,0.elsejmp again.endif.endwexit 0;定义输入子程序
;有序输入,按姓名
input proc
lab0: pushad;提示输入数据mov eax,offset msg1;姓名call dispmsglea eax,nbuffercall readmsg;输入姓名 mov eax,offset msg2;电话call dispmsglea eax,tbuffercall readmsg;输入电话;************存储数据**********mov ebp,ebx;临时存储总记录;无记录直接存储在第一个位置.if ebx==0;存姓名mov ecx,20lea edx,nbufferlea edi,(telephone ptr people[ebx]).name1name1:mov al,[edx]mov [edi],alinc edxinc ediloop name1;存电话mov ecx,9lea edx,tbufferlea edi,(telephone ptr people[ebx]).phonephone:mov al,[edx]mov [edi],alinc edxinc ediloop phone;输入成功mov eax,offset msg4call dispmsgmov ecx,9999;成功的标志jmp  lab10;是否继续输入;有记录,需判断存放位置  .elsemov ebx,0;从第一个记录开始mov edx,ebp;总记录数imul edx,29;记录存储的下一个偏移地址;eg:0,1,2,3--4条记录,edx为第5的偏移地址;控制循环,遍历电话簿,查找插入位置.while ebx!=edxmov ecx,20lea esi,nbufferlea edi,(telephone ptr people[ebx]).name1;比较姓名lab1: mov al,[edi]cmp [esi],aljnz lab00;比较大小inc ediinc esiloop lab1;输入重复姓名lea eax,msg3call dispmsgjmp lab10;是否继续输入lab00: cmp [esi],aljb lab2;输入姓名比记录数据小cmp [esi],alja lab7;输入姓名比记录数据大,取下一条记录继续比较lab2:  mov edx,ebx;记录插入位置,即正在比较的数据mov ebx,ebp;总记录数imul ebx,29;最后位置的偏移地址;移动数据,往后移动一格.while ebx!=edx;edx当前比较得出的数据的偏移地址lea edi,(telephone ptr people[ebx]).name1sub ebx,29lea esi,(telephone ptr people[ebx]).name1mov ecx,20;移动姓名lab3: mov al,[esi]mov [edi],alinc esiinc ediloop lab3.endw;吧输入的数据插入至找到的位置ebx;放入姓名lea esi,nbufferlea edi,(telephone ptr people[ebx]).name1mov ecx,20lab4:mov al,[esi]mov [edi],alinc esiinc ediloop lab4;移动数据,往后移动一格mov ebx,ebp;总记录数imul ebx,29;最后位置的偏移地址;移动数据,往后移动一格.while ebx!=edx;edx当前比较得出的数据的偏移地址lea edi,(telephone ptr people[ebx]).phonesub ebx,29lea esi,(telephone ptr people[ebx]).phonemov ecx,9;移动电话lab5: mov al,[esi]mov [edi],alinc esiinc ediloop lab5.endw;吧输入的数据插入至找到的位置ebx;放入姓名lea esi,tbufferlea edi,(telephone ptr people[ebx]).phonemov ecx,9lab6:mov al,[esi]mov [edi],alinc esiinc ediloop lab6mov eax,offset msg4call dispmsgmov ecx,9999;插入成功标志jmp lab10;是否继续输入lab7: add ebx,29;取下一条记录继续比较,寻找位置.endw;结束寻找位置;插入的位置为末尾mov ecx,20lea edx,nbufferlea edi,(telephone ptr people[ebx]).name1;存姓名name0:mov al,[edx]mov [edi],alinc edxinc ediloop name0;存电话mov ecx,9lea edx,tbufferlea edi,(telephone ptr people[ebx]).phonephone0:mov al,[edx]mov [edi],alinc edxinc ediloop phone0mov eax,offset msg4call dispmsgmov ecx,9999;插入成功标志jmp  lab10 ;是否继续输入.endiflab10:lea eax,again0;提示是否继续输入call dispmsgcall readccall dispcrlf.if al==121;"y".if ecx==9999;之前插入成功popadinc ebx;ebx加一,总记录增加1jmp lab0;继续寻找新位置插入.else;插入失败popadjmp lab0;继续寻找新位置插入.endif.elseif al==110;"n";退出输入.if ecx==9999;之前插入成功popadinc ebx;ebx加一,总记录增加1jmp lab11;返回主程序.else;插入失败popadjmp lab11;返回主程序.endif.else jmp lab10;输入有误,重新输入.endif
lab11:ret
msg1  byte "please input name:",0
msg2  byte "please input phoneNumber:",0
msg3  byte "Cannot input repeatedly!",13,10,0
msg4  byte "Input successfully!",13,10,0
again0 byte "Do you want to input again?[y/n]: ",0
input endp;显示电话簿
;ebx:电话簿记录数
display procpushadmov ecx,ebx;记录数,控制循环;判断是否有记录.if ecx!=0mov esi,0;清零;提示输入mov eax,offset msgNcall dispmsg mov ebx,1;序号
lable:  mov eax,ebx;显示序号call dispsidmov al,46;句号call dispc;显示姓名lea eax,(telephone ptr people[esi]).name1call dispmsglea eax,msgS;显示间隔call dispmsg;显示电话lea eax,(telephone ptr people[esi]).phonecall dispmsgcall dispcrlfadd esi,29;取下一条记录inc ebx;序号加一loop lable.else;无记录lea eax,msgEcall dispmsg.endifpopadret
msgN    byte "NAME                 TELEPHONE",13,10,0
msgS    byte "  *************  ",0
msgE    byte "there are null!",13,10,0
display endp;查询电话簿
;[1]按姓名查询[2]按手机号查询
search procpushadmov ebp,ebx;临时存储电话簿中的记录数即ebx的值
lable1:mov ebx,ebpxor edx,edxxor esi,esixor edi,edi;提示输入选择lea eax,select0call dispmsgcall readsibcall dispcrlf;按姓名查询.if al==1lea eax,inputname;提示call dispmsgmov eax,offset nbuffer;输入姓名存放的地址即缓冲区call readmsglea edi,nbuffer;取姓名地址.while ebx!=0;依次遍历电话簿中的数据lable2: lea edx,(telephone ptr people[esi]).name1;逐个取电话簿中的数据mov ecx,20;将输入的姓名和从电话簿中取得的姓名做比较lable3: mov al,[edx]cmp [edi],aljnz lable4;不相等,取电话簿下一条数据inc edxinc ediloop lable3;比较姓名;找到记录,输出mov eax,offset namemsgcall dispmsglea eax,(telephone ptr people[esi]).name1call dispmsgcall dispcrlfmov eax,offset telemsgcall dispmsglea eax,(telephone ptr people[esi]).phonecall dispmsgcall dispcrlfmov ecx,9999;是否找到记录的标志jmp lable5;退出,是否继续查询lable4: add esi,29;取电话簿下一条记录dec ebx;记录减一.endw;结束遍历;按电话查询    .elseif al==2;提示输入选择lea eax,inputtelecall dispmsgmov eax,offset tbuffer;输入电话存放的地址即缓冲区call readmsglea edi,tbuffer;取电话地址.while ebx!=0;依次遍历电话簿中的数据lea edx,(telephone ptr people[esi]).phone;逐个取电话簿中的电话mov ecx,9;将输入的电话和从电话簿中取得的电话名做比较lable7: mov al,[edx]cmp [edi],aljnz lable8;;不相等,取电话簿下一条数据inc edxinc ediloop lable7;比较电话;找到记录,输出mov eax,offset namemsgcall dispmsglea eax,(telephone ptr people[esi]).name1call dispmsgcall dispcrlfmov eax,offset telemsgcall dispmsglea eax,(telephone ptr people[esi]).phonecall dispmsgcall dispcrlfmov ecx,9999;是否找到记录的标志jmp lable5;退出,是否继续查询lable8: add esi,29;取电话簿下一条记录dec ebx;记录减一.endw;结束遍历.else;输入有误,重新输入jmp lable1.endif;判断是否查到记录.if ecx!=9999mov eax,offset nofind;未查询到记录call dispmsgcall dispcrlf.endif
lable5: lea eax,againmsgcall dispmsgcall readccall dispcrlf;是否继续查询.if al==121;"y"jmp lable1;;.elseif al==110;"n"jmp lable6.else jmp lable5.endif
lable6:popadret
select0    byte "   the way of search",13,10,"[1]:name [2]telephone:  ",0
inputname byte "input name: ",0
inputtele byte "input telephone: ",0
namemsg   byte "name: ",0
telemsg   byte "telephone: ",0
againmsg  byte "Do you want to search again?[y/n]: ",0
nofind    byte "no search record!",13,10,0
search    endp  ;删除记录
;参数;输入待删除记录的姓名
;ebx:电话簿的记录数
delete procpushad;mov esp,ebx;保护ebx数据,用于删除最后一条记录xor esi,esi;显示提示lea eax,deletemsgcall dispmsglea eax,nbuffer;待删除记录姓名存放地址call readmsg;寻找待删除记录的位置.while ebx!=0 mov edi,offset nbufferlea edx,(telephone ptr people[esi]).name1mov ecx,20lable20: mov al,[edx]cmp [edi],aljnz lable25;inc edxinc ediloop lable20;比较姓名;若待删除记录是最后一条数据.if ebx==1;删除最后一个数据lea edx,(telephone ptr people[esi]).name1mov ecx,20lable21:mov al,0mov [edx],alinc edxloop lable21;删除姓名lea edx,(telephone ptr people[esi]).phonemov ecx,9 lable22:mov al,0mov [edx],alinc edxloop lable22mov ecx,9999;删除成功的标志jmp lable26;删除电话;删除其他位置的数据  .elsemov ebp,ebx;临时存储ebx,待删除数据的位置dec ebx;需要移动记录次数,位置减一;移动姓名.while ebx!=0mov ecx,20lea edx,(telephone ptr people[esi]).name1add esi,29lea edi,(telephone ptr people[esi]).name1lable23:mov al,[edi]mov [edx],alinc ediinc edx loop lable23dec ebx.endw;移动电话mov ebx,ebp;临时存储ebx,待删除数据的位置dec ebx;需要移动次数imul ebx,29;待删除数据位置的偏移地址sub esi,ebx;esi重新定位待删除位置mov ebx,ebp;dec ebx;需要移动次数.while ebx!=0mov ecx,9lea edx,(telephone ptr people[esi]).phoneadd esi,29lea edi,(telephone ptr people[esi]).phonelable24:mov al,[edi]mov [edx],alinc ediinc edx loop lable24;删除姓名dec ebx  .endwmov ecx,9999;删除成功的标志jmp lable26;删除电话.endif
lable25:add esi,29;查询取下一条记录dec ebx;记录减一.endw;查找结束
lable26:.if ecx!=9999;删除失败lea eax,Dfailedcall dispmsgpopad.else;删除成功lea eax,Dsuccesscall dispmsgpopaddec ebx;记录减一.endifret
deletemsg byte "input delete name: ",0
Dsuccess  byte "Deleted successfully!",13,10,0
Dfailed   byte "Delete failed!",13,10,"Please input correctly!",13,10,0
delete    endpend start       

运行结果:

由于是刚开始学习汇编,代码编写有所不足,有很多冗余,欢迎有小伙伴能够指出不足之处,互相学习。

指路->其他实验.

[汇编语言]实现电话簿的创建相关推荐

  1. 创建文件 c语言,汇编语言CreateFile函数:创建新文件或者打开已有文件

    函数 CreateFile 可以创建一个新文件或者打开一个已有文件.如果调用成功,函数返回打开文件的句柄:否则,返回特殊常数 INVALID_HANDLE_VALUEO 原型如下: CreateFil ...

  2. createfile调用失败_汇编语言CreateFile函数:创建新文件或者打开已有文件

    函数 CreateFile 可以创建一个新文件或者打开一个已有文件.如果调用成功,函数返回打开文件的句柄:否则,返回特殊常数 INVALID_HANDLE_VALUEO 原型如下: CreateFil ...

  3. 简单电话簿管理系统(C语言)

    /*大二实践周所作,时间:2017.9,11电话簿管理系统*/#include<string.h> #include<stdio.h> #include<stdlib.h ...

  4. C语言实现简单电话簿(注释版)

    C语言实现简单电话簿(注释版,可直接运行) 简单的小组实验记录,用到了文件读写.链表操作的知识,没有什么高端的东西,包含一个比较好看的煮菜单,字符画画得很开心. 文件有两个,一个.c文件(函数体以及主 ...

  5. 系统级性能分析工具perf的介绍与使用

    测试环境:Ubuntu16.04 + Kernel:4.4.0-31 apt-get install linux-source cd /usr/src/tools/perf make &&am ...

  6. 32位汇编第七讲,混合编程,内联汇编

    32位汇编第七讲,混合编程 博客园IBinary原创 QQ:2510908331  博客连接:http://www.cnblogs.com/iBinary/ 转载请注明出处,谢谢 混合编程的概念,有时 ...

  7. kubelet配置cni插件_Kubernetes CNI网络插件

    CNI 容器网络接口,就是在网络解决方案由网络插件提供,这些插件配置容器网络则通过CNI定义的接口来完成,也就是CNI定义的是容器运行环境与网络插件之间的接口规范.这个接口只关心容器的网络连接,在创建 ...

  8. linux 系统级性能分析工具 perf 的介绍与使用

    目录 1. 背景知识 1.1 tracepoints 1.2 硬件特性之cache 2. 主要关注点 3. perf的使用 3.0 perf引入的overhead 3.1 perf list 3.2 ...

  9. 反射、io流、正则、网编、MySql、JavaWeb、Android等等等等等等等等等等等等等等等等等~~~~~~

    Java-Android BasicsTwo(java) 反射 修改方法 修改值 java正则验证 简易IO(面向文件的增删改查) IO流 (文件字节输入流)FileInputStream (文件字节 ...

最新文章

  1. 使用AppCompat项目模版
  2. 语言const的生命周期_C语言的角落——这些C语言不常用的特性你知道吗?
  3. sort函数的应用习题(二)
  4. Windows 8 IIS中配置PHP运行环境的方法
  5. Cocos2d-X开发中国象棋《九》走棋规则
  6. php sql好处,关于php:使用Doctrine与SQL相比,使用DQL有什么好处?
  7. 获取php服务器ip地址,PHP获取客户端和服务器IP地址
  8. 几个常用的dos命令
  9. java webview事件_捕获“页面已完成加载”事件,并使用xwalk Webview在ionic / cordova MainActivity.java中进行操作...
  10. Java试题库(含答案)
  11. iPhone4s/iPad2无shsh降级iOS6.1.3
  12. 2022电大国家开放大学网上形考任务-农业微生物学非免费(非答案)
  13. 试问甘心从年少轻狂到一事无成吗?
  14. 每日题解:LeetCode 718. 最长重复子数组
  15. python剪辑视频 裁剪_用python进行视频剪辑
  16. 一个出身寒门的状元之编程
  17. php拼音首拼,PHP 汉字转拼音(可首字母)
  18. SSM框架介绍与搭建
  19. Acwing 378.骑士放置(二分图的最大独立集)
  20. 古人对梦的解释_中国古代对梦的解释-精选文档

热门文章

  1. python use ftp to download/updown
  2. 前端更新需要清空浏览器缓存_js清除浏览器缓存的几种方法
  3. 【商业数据分析】—— 用户价值RFM模型详解(小仙女搬运工)
  4. 安装tensorflow报错:Cannot uninstall ‘wrapt‘. It is a distutils installed project and thus we cannot accu
  5. webuploader-上传图片到服务器
  6. 一个 SAP 开发工程师在 SAP 德国总部出差的见闻系列 1:出差 ≠ 公费旅游
  7. 微信控制树莓派运行python_Python+树莓派+人体红外感应模块 实现微信监控
  8. android 工具 Draw 9-patch 和去黑边
  9. python快速实现数字华容道小游戏
  10. 拉普拉斯-Laplacian