汇编实验:电话簿(1)实现一个电话簿

文章正文
发布时间:2024-06-26 05:29

汇编实验报告-电话簿 1. 题目要求:编写一个电话簿,要求至少有三条以上信息,每条信息包括人名与电话号码.对于改电话簿用户可以自己初始化信息,并且根据姓名查找对应的电话号码。 2. 运行环境:Windows11+MASM 3. 题目分析:

题目要求我们使用子程序建立一个电话号码表,其中存有人名和电话号,并且可以匹配。
首先考虑建立电话簿的问题,我们需要一片存储空间,被划分为姓名和电话号码,并且需要一个计数器记录存储了多少个。假设电话号码都是11个字符,姓名最多可以是15个字符。不妨规定电话簿最多可以有90行信息,则我们需要的存储空间位90*(11+15)。
再考虑匹配问题。之前实验我们已经做过字符串匹配,因此可以将其修改一下,使其不返回匹配到的字符串下标,而是返回姓名和电话号码的字符串。
此外,我们还需考虑一些细节问题,比如怎样将读取的姓名和电话号码关联起来、如何解决没有匹配到的情况、如何解决重名情况的发生等等,不过这些都是待解决的细节。

4. 流程图绘制:根据分析和题目要求绘制主函数的流程图:

流程图

5. 各部分与功能的流程图/程序:

数据段定义:当我们定义数据段时,我们要考虑的有以下几方面因素:

存储整个电话簿的存储区,大小应为90*(11+15)。

存储一个人的姓名的存储区,用于存储、匹配查找时使用

存储一个人电话号码phone的存储区,用于存储、匹配查找时使用

提示信息

存储末尾地址

数据段定义:

data segment mess1 db 'New name:','$' mess2 db 'New phone number:','$' mess3 db 'Do you want to search?(y/n)','$' mess4 db 0dh,0ah,'whats the name?','$' mess5 db 'Not find',0dh,0ah,'$' mess6 db 'How many numbers do you want to store(less than 10):','$' mess7 db 'Wrong num!',0dh,0ah,'$' mess8 db 'CNT:','$' crlf db 0dh,0ah,'$' ;下面定义名字的存储区,15个字符+$ max1 db 15 act1 db ? stokn1 db 15 dup(?) ;下面定义phone的存储区 +$ max2 db 11 act2 db ? stokn2 db 11 dup(?) table db 9 dup(26 dup(?));9*(15+11)个存储空间 name_cnt db 0 endaddr dw ? totnum db ? savenp db 26 dup(?),0dh,0ah,'$';保存最后输出的名字 searchaddr dw ? show db 'name phone',0dh,0ah,'$' data ends

输入与保存姓名函数input_name /store_name:
这两个函数主要执行的功能是将用户输入的name字符串存入到stoken1的暂存区中,留待之后使用(可能是存到存储区中,也可能用于字符串匹配)。

流程图

程序段代码如下:

input_name proc near lea dx,max1 mov ah,0ah int 21h;输入缓冲区 lea dx,crlf mov ah,09 int 21h;换行回车,为了输入phone sub bh,bh mov bl,act1 mov cx,15 sub cx,bx putspace:;填充空格,为了输出时数据和表头对齐 mov stokn1[bx],' ' inc bx loop putspace ret input_name endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; store_name proc near mov cx,15 lea si,stokn1 rep movsb ret store_name endp

输入与保存电话号码函数input_phone /store_phone

与input_name/store_name的功能类似。

流程图

image-20221026235421874

程序段代码如下:

input_phone proc near lea dx,max2 mov ah,0ah int 21h mov ah,09;输入缓冲区 lea dx,crlf int 21h sub bh,bh mov bl,act2 mov cx,11 sub cx,bx space: mov stokn2[bx],' ' inc bx loop space ret input_phone endp ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; store_phone proc near mov cx,11 lea si,stokn2 rep movsb ret store_phone endp

姓名匹配函数search_name

该函数功能是供用户在查找时进行字符串匹配,若要查询的名字与电话簿中一条信息的name匹配,则开始打印该条信息。

流程图

image-20221027082916544

代码段如下:

name_search proc near lea bx,table sear: mov cx,15 mov di,bx lea si,stokn1 repz cmpsb jz yep ;不匹配,就往存储区下一个name找 add bx,26 cmp bx,endaddr;看是不是到末尾了 jbe sear lea dx,mess5;到最后也每匹配上,结束 mov ah,09 int 21h ret yep:;找到了,输出! mov ah,09 lea dx,show int 21h ;此时bx保存着匹配的字符串首支 mov cx,26 mov si,bx lea di,savenp rep movsb;把最终结果放入di的savenp里,因为他带$可显示 lea dx,savenp mov ah,09 int 21h ret name_search endp codesg ends 6.运行结果

初始化

image-20221027083422689

查找功能

image-20221027083525759

可见功能正常,成功实现。

首页
评论
分享
Top