查找电话号码Word格式文档下载.docx

上传人:b****2 文档编号:4865628 上传时间:2023-05-04 格式:DOCX 页数:16 大小:31.74KB
下载 相关 举报
查找电话号码Word格式文档下载.docx_第1页
第1页 / 共16页
查找电话号码Word格式文档下载.docx_第2页
第2页 / 共16页
查找电话号码Word格式文档下载.docx_第3页
第3页 / 共16页
查找电话号码Word格式文档下载.docx_第4页
第4页 / 共16页
查找电话号码Word格式文档下载.docx_第5页
第5页 / 共16页
查找电话号码Word格式文档下载.docx_第6页
第6页 / 共16页
查找电话号码Word格式文档下载.docx_第7页
第7页 / 共16页
查找电话号码Word格式文档下载.docx_第8页
第8页 / 共16页
查找电话号码Word格式文档下载.docx_第9页
第9页 / 共16页
查找电话号码Word格式文档下载.docx_第10页
第10页 / 共16页
查找电话号码Word格式文档下载.docx_第11页
第11页 / 共16页
查找电话号码Word格式文档下载.docx_第12页
第12页 / 共16页
查找电话号码Word格式文档下载.docx_第13页
第13页 / 共16页
查找电话号码Word格式文档下载.docx_第14页
第14页 / 共16页
查找电话号码Word格式文档下载.docx_第15页
第15页 / 共16页
查找电话号码Word格式文档下载.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

查找电话号码Word格式文档下载.docx

《查找电话号码Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《查找电话号码Word格式文档下载.docx(16页珍藏版)》请在冰点文库上搜索。

查找电话号码Word格式文档下载.docx

读入姓名到tname缓冲区并把不满20位部分补空格

name_search

tname缓冲区的姓名

查找结果放在bx寄存器

在号码表查找tname缓冲区的姓名,找到则bx存放该记录的地址,否则(bx)=-1

crlf

回车换行

输出回车换行

stor_name

把tname缓冲区的姓名移动到号码表,对应记录数tab_len增1,endaddr增28

把姓名从缓冲区移动到号码表

inphone

电话号码

把inphone缓冲区的号码移动到号码表中

读入电话号码并转存到号码表中

name_sort

从tab_len取出记录数,从endaddr取出最后一个记录地址。

号码表中只有最后一个记录无序,前面记录有序

排序

对号码表进行排序(用插入排序,每次输入一个联系人后进行排序)

print_all

号码表的地址

显示号码表中的所有电话号码

printline

要显示的联系人地址存放在bx

显示单个联系人的信息

四、实验总结与体会。

Ø

先画好程序框图和模块调用图,并在编码中不断修改完善,对把握程序的整体结构很有帮助。

把模块设计成子程序在主程序调用,分解了整个程序功能,降低了设计的难度,同时方便调试和修改。

程序中添加适当的辅助变量,可以简化操作,如本程序设表长tab_len和endaddr(电话表最后一个基址)方便排序、插入等操作。

程序需要良好的人机交互,应该有各种操作提示和警告信息。

程序中输入输出等要有容错处理,要能对各种可能情况作出反应。

使用跳转指令时应注意跳转是否超出范围,Jmp指令能够实现无条件远转移,但je,jb等条件转移指令只能段内短转移,如有需要可以跳转到一个地方再用jmp跳转。

使用循环结构时不要忘记了结束条件,导致死循环。

因为汇编接近机器语言,直接对内存操作,所以脑中要有内存单元,单元地址等的清晰概念和形象,对数据在内存中表示、各种寻址方式、各寄存器的用途、用法都应该相当熟悉。

汇编语言没有像其他高级语言的数据类型的概念,数据都是以二进制存储。

通过这个综合设计,对寄存器的默认组合、使用,常用指令,各种寻址方式基本能够熟练运用。

个人感觉汇编与其他高级语言的操作上的区别:

汇编语言把每一步操作都细化。

所以写起来比较麻烦些,但只有想不到,没有做不到的,只要想的出来的,汇编应该都可以写出来。

程序调试主要是用debug。

Debug是个十分好用的工具,通过设置断点,可以调试任意程序任意部分,通过单步执行可以十分清楚各寄存器和地址单元的变化来找出错误。

五、源程序

datasegment

tel_tabdb50dup(28dup('

'

));

tel_tab电话本空间

tab_lendw0;

已存联系人数目

endaddrdw0;

最后一个联系人的地址+28

tnamedb21,?

20dup('

),?

;

姓名缓冲区

tphonedb9,?

8dup('

;

号码缓冲区

tempdb28dup(?

);

一个联系人的临时空间

inamedb13,10,'

Inputname:

'

13,10,'

$'

iphonedb13,10,'

Inputatelephonenumber:

go_ondb13,10,'

Continueinsert?

<

Y/N>

;

提示是否继续插入联系人

snamedb13,10,'

Name?

name_edb13,10,13,10,'

Thenamehasbeeninthetable!

Pleaseinputagain!

text2db13,10,'

NameTel.'

text3db13,10,'

Thenameisnotinthetelephonetable!

text4db13,10,13,10,'

Doyouwantatelephonenumber?

dataends

codesegment

****************************************************************************

主程序

-------------------------------------------------------------------------------------

mainprocfar

assumecs:

code,ds:

data,es:

data

start:

pushds;

保存旧数据用于返回

subax,ax

pushax

movax,data;

数据段、附加段初始化

movds,ax

moves,ax

inname:

leadx,iname;

提示输入姓名

movah,09h

int21h

callinput_name;

调用读入姓名子程序

callname_search;

调用查找子程序,

cmpbx,-1;

如表中不存在该联系人

jestor;

则跳转到stor

callcrlf;

回车换行

leadx,name_e;

否则提示该联系人已在表中,提示重新输入

jmpinname

stor:

callstor_name;

调用姓名转存子程序,把姓名移动到表中

leadx,iphone;

提示输入电话号码

callinphone;

调用读入号码子程序

callname_sort;

排序

callcrlf

leadx,go_on;

提示是否继续插入

choice1:

movah,07;

读取用户选择

cmpal,'

y'

jeinname

Y'

n'

jeprint_all;

如选择不插入,则显示所有记录

N'

jeprint_all

jmpchoice1

print_all:

callprintall;

显示所有记录

want_search:

callcrlf

leadx,text4;

提示是否查找号码

movah,09

choice2:

jesearch;

如果为y或Y则跳转到查找search

jesearch

;

为n或N则退出程序

jeexit_m

jmpchoice2

search:

leadx,sname;

提示用户输入要查找的姓名

读入姓名

查找

是否查找到?

jenot_find;

(bx)=1则跳转到未找到not_find

leadx,text2;

找到则输出'

callprintline;

显示查找到的联系人

jmpwant_search;

跳转到提示查找

not_find:

;

未找到

leadx,text3;

输出'

jmpwant_search

exit_m:

ret

printallprocnear

**************************************************************************

显示所有电话。

显示电话表中的所有姓名和号码,查看排序结果是否正确

----------------------------------------------------------------------------------------------

输出'

leabx,tel_tab;

号码表基址

rept1:

callprintline;

显示联系人

addbx,28;

求下一个联系人首地址

cmpbx,endaddr;

是否到达表尾?

jbrept1;

未到达则继续显示

ret

printallendp

*******************************************************************

输入姓名子程序:

读入姓名到tname缓冲区,并把不满20位的部分

补上空格(方便查找时的比较)

----------------------------------------------------------------------------------

input_nameprocnear

noinputn:

leadx,tname;

movah,0ah;

调用dos0ah读入字符串功能

cmptname[1],0;

如果输入为回车

jenoinputn;

继续等待输入

xorbx,bx

movbl,tname[1]

movcx,20

subcx,bx

set_blank:

movtname[bx+2],20h;

把不满20位的部分补空格

incbx

loopset_blank

input_nameendp

*****************************************************************

stor_name,该子程序把tname缓冲区的姓名转存入号码表中

---------------------------------------------------------------------------------

stor_nameprocnear

xorcx,cx

movcl,tname[1];

字符个数

leasi,tname[2]

movdi,endaddr

cld

repmovsb

inctab_len;

联系人人数增1

addendaddr,28;

最后一个联系人地址增28

stor_nameendp

***************************************************************

获取号码子程序:

读入用户输入的号码到tphone缓冲区,然后

转存入号码表对应位置

------------------------------------------------------------------------------------

inphoneprocnear

noinputp:

callcrlf

leadx,tphone

movah,0ah

int21h;

调用dos0a号功能输入字符串

cmptphone[1],0;

判断输入是否为回车

jenoinputp;

是,则继续等待输入

movcl,tphone[1]

leasi,tphone[2]

subdi,8;

待插入位置

repmovsb;

移动

ret

inphoneendp

**********************************************************************

排序子程序(用直接插入排序),对号码表进行按人名从小到大排序

--------------------------------------------------------------------------------------------------

name_sortprocnear

cmp[tab_len],1;

记录数1,不用排序

jeexitn

leadi,tel_tab;

第一个记录地址

movsi,endaddr

subsi,28;

最后一个记录-待排序记录的地址

next1:

movcx,20

movax,si;

暂存两个地址

movdx,di

repecmpsb;

查找插入位置

jbinsert

movsi,ax

movdi,dx

adddi,28;

比较下一个

cmpdi,si;

是否比较完

jbnext1;

没有则继续比较

jmpexitn;

否则排序完成

insert:

movcx,28

leadi,temp

待排序数据放到缓冲区

movdi,ax

next2:

movcx,28

movsi,di

subsi,28

记录后移

subdi,56

cmpdi,dx

janext2

leasi,temp

插入到待插位置

exitn:

ret

name_sortendp

******************************************************************************

姓名查找子程序。

入口参数为tname缓冲区的人名,用寄存器bx返回结果,找到则返回该

姓名对应记录的地址,未找到则返回(bx)=-1

-------------------------------------------------------------------------------------------------------------------

name_searchprocnear

cmptab_len,0;

记录为0,无法查找

jeexit_nofind

leasi,tname[2];

待查姓名地址

暂存si

从第一个记录开始查找

rsearch:

movdi,bx

repecmpsb

jzexit_n

查找下一个

cmpbx,endaddr

jbrsearch

exit_nofind:

movbx,-1;

未找到则(bx)=-1

exit_n:

name_searchendp

显示姓名和电话子程序。

待显示的记录的地址保存在bx寄存器。

-----------------------------------------------------------------------------------------

printlineprocnear

pushax;

保存ax

xorsi,si

movcx,28;

共28个字符

movah,02h;

调用dos2号显示字符功能

nextc:

movdl,[bx][si];

待显示字符

incsi;

输出下一个字符

loopnextc

popax

printlineendp

******************************************************************************

回车换行子程序

crlfprocnear

pushdx

movah,02h

movdl,0dh;

回车

movdl,0ah;

换行

popdx

crlfendp

-----------------------------------------------------------------------------------------

mainendp;

主程序结束

codeends;

代码段结束

endstart;

程序结束

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2