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

汇编实验报告-电话簿

1. 题目要求:编写一个电话簿,要求至少有三条以上信息,每条信息包括人名与电话号码.对于改电话簿用户可以自己初始化信息,并且根据姓名查找对应的电话号码。

2. 运行环境:Windows11+MASM

3. 题目分析:

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

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

流程图

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

  1. 数据段定义:当我们定义数据段时,我们要考虑的有以下几方面因素:
  • 存储整个电话簿的存储区,大小应为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
  1. 输入与保存姓名函数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
  1. 输入与保存电话号码函数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
  1. 姓名匹配函数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.运行结果

  1. 初始化

    image-20221027083422689
  2. 查找功能

    image-20221027083525759

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

posted @ 2022-11-29 15:12  丘丘王  阅读(346)  评论(0编辑  收藏  举报
鼠标点击页面特效

尝试在空白处点击鼠标