汇编实验:电话簿(1)实现一个电话簿
汇编实验报告-电话簿
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的功能类似。
-
流程图
-
程序段代码如下:
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匹配,则开始打印该条信息。
-
流程图
-
代码段如下:
-
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.运行结果
-
初始化
-
查找功能
可见功能正常,成功实现。