汇编实验:查找电话号码
实验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.用Debug命令查看寄存器和内存中的内容 2.不同寻址方式的灵活运用 3.算术及位串处理程序 4.伪指令 敢拼才会赢,详细报告地址: 点击这里 1.用Debug命令查看寄存 ...
- 计算机原理汇编程序实验报告的总结,计算机组成原理及汇编实验报告
计算机组成原理及汇编实验报告 (13页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 17.90 积分 中南大学中南大学计算机组成原理及汇编实验报告计算机组 ...
- 计算机组成原理汇编程序实验,计算机组成原理汇编实验(资料).pdf
计算机组成原理汇编实验(资料) 汇编语言调试工具 DEBUG 的使用 一.实验目的: 1.掌 DEBUG 的基本命令及其功能 2.熟练掌 DEBUG 的常用命令,学会用 DEBUG 调试程序. 3.掌 ...
- 汇编实验三:三个有符号数比较大小
汇编实验三:三个有符号数比较大小 问题 源码 利用库函数io.inc 问题 给出三个有符号数,编写一个比较相等关系的程序: (1) 如果这三个数都不相等,则显示0: (2) 如果这三个数中有两个数相等 ...
- 汇编实验1——利用8255实现LED的流水点亮实验
前言 做这个实验耗时近半天,其中安装虚拟机5小时,编写程序3小时. 踩过不少的坑,比如说一开始一直显示不出来usb插件,最后发现是开关没开:又比如,程序逻辑没有问题,但始终显示不出正确的结果,最后发现 ...
- PTA(java,C++)查找电话号码
查找电话号码 题目描述: 文件phonebook1.txt中有若干联系人的姓名和电话号码. 高富帅 13312342222 白富美 13412343333 孙悟空 13512345555 唐三藏 13 ...
- 汇编实验1及博客初尝试
Part 1 这一篇博客应该不是传说中的技术博客.初闻博客该是小学的计算机课,那个时候老师教我们注册邮箱注册博客注册论坛.注册完了我们便去玩植物大战僵尸,不用动脑子的重复性操作.计算机老师也和我们探究 ...
- 汇编实验之用debug命令查看寄存器和内存中的内容
文章目录 前言 一.用Debug的R命令查看.改变CPU寄存器的内容 r命令查看cpu寄存器内容: r命令改变寄存器中的内容: 二.用Debug的D命令查看内存中的内容 用D命令直接查看内存中的内容 ...
- EVC中嵌汇编实验心得
EVC中嵌汇编实验心得 1.基于X86的CPU可以直接在C/C++中用_asm关键字嵌入汇编程序.有一点要注意:某些系统标识符不可使用. 例如在下面程序中: __asm{ MOV DX , ...
- 汇编实验2.4 查找电话号码phone
;PROGRAM TITLE GOES HERE--PHONE datarea segment message1 db 'Input name:','$' message2 db 'Input a t ...
最新文章
- j2ee gradle构建
- LCD LED OLED QLED区别
- Adblock Plus cjxlist 规则说明与反馈贴
- Description Resource Path Location Type Java compiler level does not match the version of the insta
- Spring Boot 介绍、入门
- virbr0 虚拟网卡卸载方法
- 《R语言入门与实践》第八章:S3 与 R 面对对象编程
- Mac 10.12安装Windows远程桌面工具Microsoft Remote Desktop
- 基于Matlab的人脸识别设计(PCA)
- 【产品】 产品设计:ID工业设计、MD结构设计、HW硬件设计和SW软件设计详解
- HNU 12814 SIRO Challenge(最短路+状态压缩+dp)
- MLO/uboot-spl.bin和uboot.img/uboot.bin
- android自定义url协议,Android平台设置UrlSchemes,实现被第三方应用调用
- 法国内政部选择由金雅拓保护该国关键的通信移动网络
- [ Java面试题 ]Java 开发岗面试知识点解析
- php正则表达式替换字符,php正则表达式如何替换字符
- STM32开发项目:定时器预装载寄存器(ARR)
- element table 表格 修改背景为透明并去除边框
- VS2017、opencv安装
- 简易电影购票APP(jquery mobile+json+web mysql)