实验2.4  查找电话号码

1.题目:查找电话号码

2.实验要求:

(1)要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)以及电话号码(8个字符)两部分;

(2)程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中;

(3)凡有新的输入后,程序按照人名对电话号码重新排序;

(4)程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上按照格式输出。

;********************************************************************
datarea  segment
mess1    db    'Please input name:','$'
mess2    db    'Please input telephone number:','$'
mess3    db    'Do you want to search a telephone number?(y/n)','$'
mess4    db    0dh,0ah,'what is the name?','$'
mess5    db    'Not find',0dh,0ah,'$'
mess6    db    'the number you want to store:','$'
crlf     db     0dh,0ah,'$'
stokin1  label  byte
max1      db     21
act1      db     ?
stokn1    db     21 dup(?)
stokin2  label  word
max2      db     9
act2      db     ?
stokn2    db     9 dup(?)
numtable   db     50 dup(28 dup(?))
name_count dw    0
endaddr   dw     ?
swapped   dw     ?
totalnum dw   ?
savenp    db     28 dup(?),0dh,0ah,'$'
searchaddr dw    ?
flag      db     ?
flagb      db     ?
show      db     'name                phone',0dh,0ah,'$'
datarea  ends
;********************************************************************
codesg  segmentassume ds:datarea,cs:codesg,es:datarea
main    proc    farmov ax,datareamov ds,axmov es,axlea di,numtable     ;di must be protectedlea dx,mess6        ;显示信息,请输入想存入的电话号码总数mov ah,09   int 21hmov bx,0newchar:                ;这个是参考书上例2.6,从键盘接收数字,然后转换成ASCII码mov ah,1          ;从键盘接收totalnum,并回显AL=输入字符int 21hsub al,30h         ;ascii to binaryjl next             ;jump if<0cmp al,9            ;is it >9d?jg next             ;yes jumpcbw                 ;byte in AL to word in AX;(digit is now in AX)xchg ax,bx            ;交换mov cx,10             ;put 10 dec in CXmul cx                  ;number times 10 (DX,AX)<-(AX)*srcxchg ax,bx               ;交换add bx,ax              ;add digit to numberjmp newchar                ;get next digitnext:mov totalnum,bxlea dx,crlfmov ah,09int 21ha10:                              lea dx,mess1                ;显示请输入名字mov ah,09int 21hcall input_name  inc  name_countcall stor_name lea dx,mess2                 ;显示请输入电话mov ah,09int 21hcall inphonecall stor_phonecmp  name_count,0je  exitmov bx,totalnumcmp  name_count,bx         ;输入与之前输入总数相等的姓名,电话jnz  a10call name_sorta20:lea dx,mess3                 ;显示是否需要查找电话号码mov ah,09int 21hmov ah,08                     ;键盘输入,无回显,检测ctrl-break 或 Ctrl-C,AL=输入字符int 21hcmp al,'y'jz  a30cmp al,'n'jz  exitjmp a20                          a30:mov ah,09lea dx,mess4             ;显示询问名字int 21hcall input_namea40:call name_search;call printline;dec flag;sub flag,0  ;要是没结束的话;jnz  a40jmp a20exit:mov ax,4c00h            ;;;;带返回码终止,AL=子出口码,AH=返回代码,00=正常终止,01=用Ctrl-c终止,02=严重设备错误终止,03=用功能调用31H终止int 21hmain endp
;--------------------------------------------------------------------
input_name  proc  nearmov ah,0ahlea dx,stokin1int 21hmov ah,09lea dx,crlfint 21hsub bh,bhmov bl,act1mov cx,21sub cx,bx              ;;dst<-dst-src,cx为计数功能寄存器呀
b10:mov stokn1[bx],' '   ;补全空格inc bxloop b10
; b20:; call name_search; sub flag,0; jz b30; lea dx,mess5; mov ah,09; int 21h
; b30:ret
input_name endp
;--------------------------------------------------------------------
stor_name     proc   nearlea  si,stokn1mov  cx,20rep  movsbret
stor_name  endp
;--------------------------------------------------------------------
inphone   proc   nearmov ah,0ahlea dx,stokin2int 21hmov ah,09lea dx,crlfint 21hsub bh,bhmov bl,act2mov cx,9sub cx,bx
c10:mov stokn2[bx],' 'inc bxloop c10ret
inphone endp
;--------------------------------------------------------------------
stor_phone  proc nearlea  si,stokn2mov  cx,8rep  movsb   ;movs 串传送指令 cmps 串比较操作ret
stor_phone endp
;--------------------------------------------------------------------
name_sort  proc near     ;;;;;;;;sub  di,28mov  endaddr,dic1:mov  swapped,0lea  si,numtablec2:mov  cx,20mov  di,siadd  di,28mov  ax,dimov  bx,si   ;cmpsb si-di  movsb di<-sirepz cmpsb   ;repz 当为0时重复串操作;repe 当相等时重复串操作;rep 重复串操作直至计数寄存器count reg 的内容为0为止jbe  c3     ;CF与ZF=1,小于等于则转移;chang order mov si,bxlea di,savenpmov cx,28rep movsbmov cx,28mov di,bxrep movsbmov cx,28lea si,savenprep movsbmov swapped,1c3:mov  si,axcmp  si,endaddrjb   c2        ;CF=1,则转移,小于等于则转移cmp  swapped,0jnz  c1    ;结果不为0则转移ret
name_sort endp
;--------------------------------------------------------------------
name_search proc nearlea  bx,numtablemov  flag,0      ;;;立个flag;mov  flagb,0  d: ;mov  flag,0      ;;;立个flag;mov  flagb,0  mov  cx,20lea si,stokn1mov  di,bxrepz cmpsbjz  d2;jb  dexitadd bx,28            ;下一条cmp  bx,endaddr   jbe  d             ;未结束,继续找;add flagb,flagsub flag,0  ;要是没有找到的话jz  nofjmp  dexit         ;结束,退出nof:  lea dx,mess5mov ah,09int 21h d2:mov searchaddr,bx;mov flag,1         ;标志找到了inc flagcall printline; dec flag;sub flag,0  ;要是没结束的话add bx,28            ;下一条cmp  bx,endaddr   jbe  d             ;未结束,继续找jmp  dexit         ;结束,退出jnz  ddexit:ret
name_search endp
;--------------------------------------------------------------------
printline proc  nearsub flag,0  ;要是没有找到的话jz  nop10:mov ah,09lea dx,showint 21hmov cx,28mov si,searchaddrlea di,savenprep movsblea dx,savenpmov ah,09int 21hjmp fexit
no:    lea dx,mess5mov ah,09int 21h
fexit:  ret
printline endp
;--------------------------------------------------------------------
codesg ends
;--------------------------------------------------------------------
end main       

问题及收获

这个代码需要自己动手编写实现,也是写了很久,调了很久,然后终于能运行啦,然而还是有不满意的地方,最开始我实现的代码只能每次显示一个人名,如果有重复的时候,那么同样也是只显示一个人名(见下图),所以我就着手这个问题开始解决。最开始我写的代码在查找的部分,只是查找到了就返回输出,所以只能输出一个名字,后来我修改之后,每次都是查找到结束位置再返回,这样就可以实现输出重复的人名了。我后来还考虑过插入重复人名的时候,显示提示,已经插入过了,不过这部分我改了好久,不知道为什么没有实现,它就是始终不能输出“插入重复”这句话,而且还会有其他的问题(见下图)。还有,在这个实验中,我用到的排序算法是参考书上的冒泡排序实现的,字符的输入,转换等这部分程序在书上也有参考,所以这部分没有遇到什么难题。

修改后:

关于显示“插入重复”信息无法解决的运行结果:

汇编实验:查找电话号码相关推荐

  1. 完整详细的汇编实验报告

    完整详细的汇编实验报告 1.用Debug命令查看寄存器和内存中的内容 2.不同寻址方式的灵活运用 3.算术及位串处理程序 4.伪指令 敢拼才会赢,详细报告地址: 点击这里 1.用Debug命令查看寄存 ...

  2. 计算机原理汇编程序实验报告的总结,计算机组成原理及汇编实验报告

    计算机组成原理及汇编实验报告 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 17.90 积分 中南大学中南大学计算机组成原理及汇编实验报告计算机组 ...

  3. 计算机组成原理汇编程序实验,计算机组成原理汇编实验(资料).pdf

    计算机组成原理汇编实验(资料) 汇编语言调试工具 DEBUG 的使用 一.实验目的: 1.掌 DEBUG 的基本命令及其功能 2.熟练掌 DEBUG 的常用命令,学会用 DEBUG 调试程序. 3.掌 ...

  4. 汇编实验三:三个有符号数比较大小

    汇编实验三:三个有符号数比较大小 问题 源码 利用库函数io.inc 问题 给出三个有符号数,编写一个比较相等关系的程序: (1) 如果这三个数都不相等,则显示0: (2) 如果这三个数中有两个数相等 ...

  5. 汇编实验1——利用8255实现LED的流水点亮实验

    前言 做这个实验耗时近半天,其中安装虚拟机5小时,编写程序3小时. 踩过不少的坑,比如说一开始一直显示不出来usb插件,最后发现是开关没开:又比如,程序逻辑没有问题,但始终显示不出正确的结果,最后发现 ...

  6. PTA(java,C++)查找电话号码

    查找电话号码 题目描述: 文件phonebook1.txt中有若干联系人的姓名和电话号码. 高富帅 13312342222 白富美 13412343333 孙悟空 13512345555 唐三藏 13 ...

  7. 汇编实验1及博客初尝试

    Part 1 这一篇博客应该不是传说中的技术博客.初闻博客该是小学的计算机课,那个时候老师教我们注册邮箱注册博客注册论坛.注册完了我们便去玩植物大战僵尸,不用动脑子的重复性操作.计算机老师也和我们探究 ...

  8. 汇编实验之用debug命令查看寄存器和内存中的内容

    文章目录 前言 一.用Debug的R命令查看.改变CPU寄存器的内容 r命令查看cpu寄存器内容: r命令改变寄存器中的内容: 二.用Debug的D命令查看内存中的内容 用D命令直接查看内存中的内容 ...

  9. EVC中嵌汇编实验心得

    EVC中嵌汇编实验心得 1.基于X86的CPU可以直接在C/C++中用_asm关键字嵌入汇编程序.有一点要注意:某些系统标识符不可使用. 例如在下面程序中: __asm{   MOV   DX   , ...

  10. 汇编实验2.4 查找电话号码phone

    ;PROGRAM TITLE GOES HERE--PHONE datarea segment message1 db 'Input name:','$' message2 db 'Input a t ...

最新文章

  1. j2ee gradle构建
  2. LCD LED OLED QLED区别
  3. Adblock Plus cjxlist 规则说明与反馈贴
  4. Description Resource Path Location Type Java compiler level does not match the version of the insta
  5. Spring Boot 介绍、入门
  6. virbr0 虚拟网卡卸载方法
  7. 《R语言入门与实践》第八章:S3 与 R 面对对象编程
  8. Mac 10.12安装Windows远程桌面工具Microsoft Remote Desktop
  9. 基于Matlab的人脸识别设计(PCA)
  10. 【产品】 产品设计:ID工业设计、MD结构设计、HW硬件设计和SW软件设计详解
  11. HNU 12814 SIRO Challenge(最短路+状态压缩+dp)
  12. MLO/uboot-spl.bin和uboot.img/uboot.bin
  13. android自定义url协议,Android平台设置UrlSchemes,实现被第三方应用调用
  14. 法国内政部选择由金雅拓保护该国关键的通信移动网络
  15. [ Java面试题 ]Java 开发岗面试知识点解析
  16. php正则表达式替换字符,php正则表达式如何替换字符
  17. STM32开发项目:定时器预装载寄存器(ARR)
  18. element table 表格 修改背景为透明并去除边框
  19. VS2017、opencv安装
  20. 简易电影购票APP(jquery mobile+json+web mysql)

热门文章

  1. JAVA王思聪吃热狗程序_易语言制作王校长吃热狗游戏的源码
  2. 华为设备OSPF配置命令
  3. 计算机的使用编码,计算机中使用的编码
  4. ABB 机器人DH参数
  5. Matlab读取显示图像顺序
  6. instantclient oracle oci
  7. RS485协议详解RS485与RS232优缺点比较
  8. activiti工作流简介
  9. 软考(一)-软考开始了
  10. 办公自动化计算机操作试题及答案,办公自动化考试试题及答案