您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 汇编实验 查找电话号码
实验四查找电话号码一、实验的目的与要求(一)实验目的:学习用汇编语言设计与编写子程序,理解子程序的调用过程。(二)实验要求:(1)要求程序建立一个可存放50项的电话号码表,每项包括人名(20个字符)及电话号码(8个字符)两部分;(2)程序可接收输入人名及相应的电话号码,并把它们加入电话号码表中;(3)凡有新的输入后,程序应按人名对电话号码表重新排序;(4)程序可接收需要查找电话号码的人名,并从电话号码表中查出其电话号码,再在屏幕上以如下格式显示出来。nametel.XXXXXXXX二、实验正文实验分析:查找电话号码程序设计,应注意子程序的设计,合理的设计子程序,使程序思路更清晰,便于设计。实验涉及查找排序,对程序设计提出了更高的要求,数据结构采用二维数组来存储电话信息,还应设置变量用于排序以及查找等子功能的实现。核心的子功能是排序和查找功能,排序采用冒泡排序,并设置标志位,以便提高程序效率,排序时应当注意的是数据段的截止地址,以防发生越界错误。在排序时也嵌套调用子过程交换,此时应该注意,源地址寄存器和目的地址寄存器的变化。查找的功能其实是对电话本的每一项的姓名进行匹配。显示电话本内容是把电话本的每一项先放在一个变量里面,然后显示,直到全部取出为止。由于字符串的操作较多,多次使用si和di寄存器,再适当时候应注意压栈。保存必要的信息,否则会发生越界等严重错误。三、流程图如下:四、实验结果附录:程序源代码如下:;*****************************************************************8data_segsegmentnamcountdw0;thenumbercounttel_tabdb50dup(28dup(''));thetelbooknameitemlabelbyte;storenamemax1db21ncurlendb?nameflddb21dup(?)phoneitemlabelbyte;storenumermax2db9pcurlendb?phoneflddb9dup(?)addenddw?;排序时的tel_tab尾地址指针namtempdb28dup(?),13,10,'$'swapdb0;排序中是否有交换的标志位msg_countdb'Doyouwanttoinsertaitemtophonebook?(Y/N)',13,10,'$'msg_errordb'Error!Pleaseentertherequested...',13,10,'$'msg_inputnamdb'Inputname:','$'msg_inputnumdb'Inputatelephonenumber:','$'msg_inquiredb'Doyouwantatelephonenumber?(Y/N)','$'msg_snamedb'name?',13,10,'$'msg_outtitledb'nametel.',13,10,'$'msg_nomatchdb'NOtEXIT!',13,10,'$'msg_allphonedb'printallRECORD?(Y/N)',13,10,'$'msg_resultdb'nametel.',13,10,'$'data_segends;**********************************************************************stack_segsegmentparastack'stack';定义堆栈段dw256dup(0)stack_segends;*********************************************************************code_segsegment;----------------------------------------------------------------------------mainprocfarassumecs:code_seg,ds:data_seg,es:data_seg,ss:stack_segstart:movax,data_segmovds,ax;初始化数据段moves,ax;初始化附加段xorbx,bxcldleadi,tel_tab;名字表的首地址放入dia1:leadx,msg_countmovah,9int21h;显示信息是否插入一项纪录?(Y/N)'movah,1int21hmovbl,alcallcrlfcmpbl,'n';判断输入jza2cmpbl,'N'jza2cmpbl,'y'jznext0cmpbl,'Y'jznext0movah,9leadx,msg_errorint21hjmpa1next0:leadx,msg_inputnammovah,9int21h;要求输入名字callinput_name;调用input_name输入人名callstor_name;调用stor_name存储人名callinput_phone;调用input_phone输入电话callname_sort;排序jmpa1;是否继续输入?a2:leadx,msg_inquiremovah,9int21h;显示是否查找电话号码movah,1int21hmovbl,alcallcrlfcmpbl,'n'jza3cmpbl,'N'jza3cmpbl,'y'jznext1cmpbl,'Y'jznext1movah,9leadx,msg_errorint21hjmpa2next1:leadx,msg_snamemovah,9int21h;显示要查询电话的姓名callinput_name;输入姓名callname_searchjmpa2a3:leadx,msg_allphone;显示所有电话号码movah,9int21hmovah,1int21hmovbl,alcallcrlf;回车换行cmpbl,'n'jzexitcmpbl,'N'jzexitcmpbl,'y'jznext2cmpbl,'Y'jznext2movah,9leadx,msg_errorint21hjmpa3next2:callprintline;调用子程序打印出所有的电话号码exit:retmainendp;---------------------------------------------------------------------input_nameprocnear;子程序接受输入字符leadx,nameitemmovah,0ahint21hcallcrlf;回车换行movbh,0movbl,ncurlenmovcx,21subcx,bxrepeat1:movnamefld[bx],20hincbxlooprepeat1;输入的名字为20字节,不足的用空格补足retinput_nameendp;-------------------------------------------------------------------------stor_nameprocnear;子程序传送名字的每个字母到siincnamcountcldleasi,namefldmovcx,20repmovsbretstor_nameendp;----------------------------------------------------------------------------input_phoneprocnear;子程序(输入电话号码)leadx,msg_inputnummovah,9int21h;显示要求输入电话号码leadx,phoneitemmovah,10int21hmovbh,0movbl,pcurlenmovcx,9subcx,bxrepeat2:movphonefld[bx],20hincbxlooprepeat2callcrlfcldleasi,phonefldmovcx,8repmovsb;把输入的号码存入namtab表中retinput_phoneendp;----------------------------------------------------------name_sortprocnear;子程序pushdipushaxpushbxcmpnamcount,1jzexit4;比较名字个数是否为一个s1:movswap,0subdi,56movaddend,dileasi,tel_tabs2:movcx,20movdi,siadddi,28movax,dimovbx,sirepecmpsbjbes3callexchanges3:movsi,axcmpsi,addendjbes2cmpswap,0;如果有交换,继续下一趟jnzs1exit4:popbxpopaxpopdiretname_sortendp;--------------------------------------------------------------------exchangeprocnear;交换tel_tab中di,si所指表项的内容movcx,28leadi,namtempmovsi,bxrepmovsbmovcx,28movdi,bxrepmovsbmovcx,28leasi,namtemprepmovsbmovswap,1retexchangeendp;----------------------------------------------------------name_searchprocnear;查找输入的名字leadi,tel_tabpushdimovbx,namcountloop1:leasi,namefldmovcx,20repecmpsb;连续查找匹配名字jefound;找到跳转foundpopdi;没找到di出栈adddi,28pushdidecbxjnzloop1leadx,msg_nomatchmovah,9int21h;没有找到输出信息found:popdileadx,msg_outtitlemovah,9int21hmovsi,dileadi,namtempmovcx,28repmovsbleadx,namtempmovah,9int21h;显示查到的姓名和电话号码retname_searchendp;-------------------------------------------------------printlineprocnear;输出排序结果pushdipushnamcountcallcrlf;回车换行leadx,msg_resultmovah,9int21h;显示升序输出姓名、电话leasi,tel_tabloop2:leadi,namtempmovcx,28repmovsbleadx,namtempmovah,9int21h;显示姓名、电话decnamcountjnzloop2;循环输出popnamcountpopdiretprintlineendp;---------------------------------------------------------crlfprocnear;回车换行movdl,0dhmovah,2int21hmovdl,0ahmovah,2int21hretcrlfendp;---------------------------------------------------------code_segends;***********************************************************endmain五、实验总结本次实验初步了解了子程序的设计,是程序设计模块化,这对于设计较复杂的程序是非常重要的。实验对字符串的处理,要求相对较高,涉及字符串的移动和比较,此外还应该注意在定义缓冲区长度时,应把回车
本文标题:汇编实验 查找电话号码
链接地址:https://www.777doc.com/doc-6040980 .html