首页 > 编程语言 >汇编实验:电话簿(2)电话簿的增删改查操作

汇编实验:电话簿(2)电话簿的增删改查操作

时间:2022-11-29 15:22:49浏览次数:38  
标签:lea name di 改查 mov 增删 电话簿 bx

汇编实验报告-电话簿

1. 题目要求:对上周写的电话簿增加对通讯录的增加、删除、更改操作。

2. 运行环境:Windows11+MASM

3. 题目分析:

题目要求我们在上一周电话簿的基础上,增加对通讯录的增加、删除、更改操作。
首先考虑新增的问题。由于上一周的电话簿刚开始就要求录入信息,并且使用了专门的函数inputname实现name和phone的输入,因此我们可以直接复用改代码段。
再考虑通讯录的更改功能。我们的想法是借助之前查找功能里的字符串匹配代码段,先让用户输入旧的name进行匹配,若匹配上则先保存旧name在存储区的首址,要求用户输入新的name和phone,对其进行覆盖。在这个基础上,想实现删除功能也就十分简单了:我们只需借用修改功能的思路,对要删除的name和phone全部以20H替换,这样在查询name时必定不会匹配,相当于通讯录中已经不存在这一条了。

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

流程图

5. 各功能实现的流程图与程序:

  1. 增加操作
  • 分析:添加操作中,我们不需要查找新增name和现有name的比较,只需要将其追加到存储区尾部即可。因此该功能实现的难点就在于对尾部的定位。之前的实验中,我们定位了endaddr作为最后一个name的首址,故我们可以直接+26获得待存储name的首址。但是原先的inputname的di并不由人为指定,因此我们每次做add的时候都需要将di定位到endadrr+26的地址位置。

  • 添加操作流程图

    添加操作
  • 添加操作代码段:只需在操作菜单函数search_or_not里加入对add操作的回应即可,以下为增加部分:

    cmp al,'a'
    jne contin
    mov bx,endaddr;这里di指向旧串末尾
    add bx,26
    mov di,bx
    lea dx,crlf;输出提示信息
    mov ah,09h
    int 21h
    jmp inputname
  1. 修改操作
  • 分析:修改操作中,我们需要首先询问用户要修改哪个name,将其与存储区中name依次匹配,匹配到就要求用户输入新name和phone,然后直接覆盖原来存储区的旧数据即可。
  • 修改操作流程图
    修改操作
  • 修改操作代码段:需另外编写启动函数、查找和覆盖函数。
   name_change proc near
    lea bx,table
sear2:
    mov  cx,15
    mov di,bx 
    lea si,stokn1
    repz cmpsb
    jz  do_change;匹配上了,此时bx是老name起始地址
    ;不匹配,就往存储区下一个name找
    add bx,26
    cmp bx,endaddr;看是不是到末尾了
    jbe sear2
    lea dx,mess5;到最后也每匹配上,结束
    mov ah,09
    int 21h 
    ret

do_change:;已经匹配到原有的name了,现在应做的是提示用户输入新的name和phone,然后放到老name后的存储
    lea dx,mess1;输出提示信息
    mov ah,09h
    int 21h
    push bx;bx是老name起始地址,先保存起来。
    call input_name
     lea dx,mess2;输出提示信息
    mov ah,09h
    int 21h
    call input_phone
    ;此时新的name和phone已经分别存入stokn1\stokn2
    pop bx
    mov di,bx
    mov cx,15
    lea si,stokn1
    rep movsb;存入新name
    mov cx,11
    lea si,stokn2
    rep movsb;存新phone
    jmp search_or_not

name_change endp
  1. 删除操作
  • 分析:在做完修改操作后,删除就显得尤为简单了。删除操作和修改操作很类似,只是我们可以用20H来覆盖原来的name和phone,使得后续查找不可能再与其匹配。这样对用户而言,该信息就已被删除。
  • 删除操作流程图
    删除操作
  • 删除操作代码段:需另外编写启动函数、查找和覆盖函数。
    name_delete proc near
lea bx,table
sear3:
    mov  cx,15
    mov di,bx 
    lea si,stokn1
    repz cmpsb
    jz  middle1;匹配上了,此时bx是老name起始地址
    ;不匹配,就往存储区下一个name找
    add bx,26
    cmp bx,endaddr;看是不是到末尾了
    jbe sear3
    lea dx,mess5;到最后也每匹配上,结束
    mov ah,09
    int 21h 
    ret

;已经匹配到原有的name了,现在应做的是把空格填充放到老name后的存储
;填充空格,现在BX保存着该覆盖的起始地址
middle1:
mov cx,15
push bx
sub bx,bx;归0
putspace1:
    ; lea dx,mess9;test
    ; mov ah,09
    ; int 21h 
    mov stokn1[bx],' '
    inc bx
    loop putspace1
mov cx,11
sub bx,bx;归0
putspace2:
    mov stokn2[bx],' '
    inc bx
    loop putspace2
instead:;把stoken1\stoken2放入table原内存
    mov cx,15
    pop bx
    mov di,bx;现在di指向老name起始地址
    lea si,stokn1
    repz movsb
    mov cx,11
    lea si,stokn2
    repz movsb
    ret
name_delete endp

. 主函数修改

  • 分析:在四个功能完成后,主函数还需修改菜单,使用户输入a选择添加、输入d选择删除、输入c选择修改。

  • 主函数中search_or_not代码段修改:

search_or_not:
    lea dx,mess3;输出提示信息
    mov ah,09h
    int 21h
    sub al,al;准备获取order
    mov ah,07h
    int 21h
    cmp al,'n'
    je exit;不查退出
    cmp al,'a'
    jne contin
    mov bx,endaddr;这里di指向旧串末尾
    add bx,26
    mov di,bx
    lea dx,crlf;输出提示信息
    mov ah,09h
    int 21h
    jmp inputname
    ;测试
contin:
    cmp al,'t'
    je test_jmp
    ;测试结束
    cmp al,'s'
    je getname
    cmp al,'c'
    je change
    cmp al,'d'
    je delete

6. 测试与运行结果

  1. 初始化电话簿
    我们用jack,tom,jean三个人的name和phone进行初始化,现在电话簿有三条信息。
    初始化电话簿lea,name,di,改查,mov,增删,电话簿,bx
    From: https://www.cnblogs.com/czy-blogs/p/16935481.html

相关文章

  • 用 Java 对 hbase 进行CRUD增删改查操作
    本文以HBase0.90.2为例,介绍如何在Windows系统,EclipseIDE集成环境下,使用Java语言,进行HBase客户端编程,包含建立表、删除表、插入记录、删除记录、各种方式下的查询操作等。......
  • spl增删改查语句
    增:insertinto语句删:delete语句改:update语句查:select语句 语法:一、增加insertinto表名values(值1,值2,...)列如:向表student中插入一条数据:insertintostuden(na......
  • 第2章-MyBatis实践之增删改查
    目录一、概述二、映射1.查询2.新增、更新、删除3.SQL片段4.参数三、附录1.示例代码2.参考文献MyBatis是一款优秀的持久层框架,它的强大之处正是SQL语句映射,这一......
  • go gin的增删改查
    packagehandlerimport("github.com/gin-gonic/gin""sshfortress/model")funcMachineAll(c*gin.Context){q:=model.MachineQ{}err:=c.ShouldBindQuery......
  • Net6 操作时序数据库influxdb,数据插入查询/增删存储桶
    十年河东,十年河西,莫骑少年穷学无止境,精益求精官方文档:​​https://docs.influxdata.com/influxdb/v2.4/api/​​1、项目详情<ProjectSdk="Microsoft.NET.Sdk"><Property......
  • go-商品服务-web第二节-增删改查
    一.新建商品1.配置路由goods-web/router/goods.gopackagerouterimport( "github.com/gin-gonic/gin" "mxshop-api/goods-web/api/goods")funcInitGoodsRout......
  • mysql增删改查
    目录:SQL语言分类1、DDL:数据定义语言创建新的数据库创建新的表删除指定的数据表删除指定的数据库2、DML管理表中的数据......
  • 后台管理增删查改统一性代码--若依前后端分离版本
    controller:@PreAuthorize("@ss.hasPermi('system:role:list')")//和数据库中的menu中的字段有关系@GetMapping("list")publicTableDataInfolist(SysRolerole){start......
  • Django ORM 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询
    DjangomodelORM数据表相关操作分析思路,创建数据表对于表操作,表之间的关联关系,必须理解他们之间的关系,对于编程很重要。可以看看映射关系、外键和relationship查询,至少明......
  • flask SQLAlchemy 增删改查
    前言一直在用flask+ SQLAlchemy,每次数据联动,因为踩过坑,就更新一下自己的认识,若有错误,请谅解准备模块click==8.1.3Flask==1.1.2Flask-SQLAlchem......