您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 字符串的查找与替换汇编实现
汇编程序设计——语言翻译机(一)实验内容本次汇编程序设计题目选自2006年百度之星程序设计大赛初赛题目。原题如下:百度的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套他们独特的缩率语。他们在平时的交谈,会议,甚至在各中技术文档中都会大量运用。为了让新员工可以更快地适应百度的文化,更好地阅读公司的技术文档,人力资源部决定开发一套专用的翻译系统,把相关文档中的缩率语和专有名词翻译成日常语言。输入数据:输入数据包含三部分1.第一行包含一个整数N(N=10000),表示总共有多少个缩率语的词条。2.紧接着有N行的输入,每行包含两个字符串,以空格隔开。第一个字符串为缩率语(仅包含大写英文字符,长度不超过10),第二个字符串为日常语言(不包含空格,长度不超过255)。3.从第N+2开始到输入结束为包含缩略语的相关文档。(总长度不超过1000000个字符)输出数据:将缩率语转换成日常语言,其他字符保留原样。输入样例:6PS(门户搜索部)NLP(自然语言处理)PM(产品市场部)HR(人力资源部)PMD(产品推广部)MD(市场发展部)百度的部门包括PS,PM,HR,PMD,MD等等,其中PS还包括NLP小组。输出样例:百度的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等,其中门户搜索部还包括自然语言处理小组。(二)算法流程图本程序算法流程图如下:main:注:input函数中使用0ah系统调用时输入完一个词条和文本后需要将缓冲区中字符串末尾回车符替换为$。开始输出提示;callinput;callrank;BX=string[0].word1;SI=AX;[SI]=’$’以X首地址和BX为入口参数callstrstr;AX=0?SI+被替换词条长度;callstrcpy;AX=BX,AX+22指向替换词条;callstrcat;callstrstr;输出XBX=BX+64结束AX=0?yesyesnonorank(排序):Num-1=0?SI=-1INCSI;DI=SI;INCDIstring[si].count1=string[di].count1?temp=string[si];string[si]=string[di];string[di]=temp;di=num-1?si=num-2?returnyesnonononoyesyesyesstrstr(查找):SI=要替换词条的首地址;DI=文本首地址;[DI]=’$’?CX=要替换的词条长度;CLD;REPEEMPSB;ZF=1?returnAX=DIAX=0INCDIyesyesnonostrcpy(复制):Strcat(粘贴):returnDi=‘$’SI=源串首地址;DI=目的串首地址;[di]=[si];Incsi;Incdi;Incdi;Incsi;incdiSI=源串首地址;Di=y首地址;[si]=’$’?noyesreturn[DI]=[SI]DI=‘$’?DI=‘$’??nonoyesyes(三)实验结果(四)源程序.modelsmall.586.datanumdb?;替换词条个数buf0db5;输入词条个数缓存count0db?word0db5dup(0)tihuanstrucbuf1db20;结构体,储存数据count1db?word1db20dup('$')buf2db40count2db?word2db40dup('$')tihuanendsstringtihuan100dup();结构体数组,存储词条temptihuanbuf3db100;输入句子缓存count3db?xdb100dup('$')ydb100dup('$')notedb'此程序实现了字符串的查找替换。例如',0ah,0dh,'输入(每行以回车键结束)',0ah,0dh,'2',0ah,0dh,'NWPU',0ah,0dh,'TheNorthwesternPolytechnicalUniversity',0ah,0dh,'Beijing',0ah,0dh,'Xian',0ah,0dh,'NWPUisoneofthebestuniversitiesinBeijing.',0ah,0dh,'则输出',0ah,0dh,'TheNorthwesternPolytechnicalUniversityisoneofthebestuniversitiesinXian.',0ah,0dh,'Nowpleaseenter:$'note1db'请输入词条个数:',0ah,0dh,'$'note2db'请输入被替换的词条:',0ah,0dh,'$'note3db'请输入替换词条:',0ah,0dh,'$'note4db'请输入文本:',0ah,0dh,'$'note5db'替换结果为:',0ah,0dh,'$'.code.startupmovax,@data;数据段段基址moves,axcrmacro;宏:回车movdl,0dhmovah,2int21hendmlfmacro;宏:换行movdl,0ahmovah,2int21hendmmovdx,offsetnote;输出提示movah,9int21hcrlfcallinputcallrankmoval,numandax,00ffhmovcx,axmovbx,offsetstring[0].word1lop:movax,offsetxpushaxpushbxcallstrstrcmpax,0jznextwordmovsi,axmoval,[si+1];和下边第三行是为了解决缩略词条字数为1时的BUG!mov[si],'$'mov[si+1],almoval,[bx-1]andax,00ffhaddsi,axmovax,offsetypushaxpushsicallstrcpymovax,offsetxpushaxmovax,bxaddax,22pushaxcallstrcatmovax,offsetxpushaxmovax,offsetypushaxcallstrcatjmplopnextword:addbx,64looplopmovdx,offsetnote5;输出提示5movah,9int21hmovdx,offsetxmovah,9int21h.exitinputprocnear;输入函数movdx,offsetnote1;输出提示1movah,9int21hmovdx,offsetbuf0;输入词条个数0~99movah,0ahint21hmovbl,1;ASCII值转换为数值movbh,0moval,count0andax,00ffhmovcx,axlop0:movsi,cxsubsi,1moval,word0[si]subal,30hmulbladdbh,almoval,blmovah,10mulahmovbl,allooplop0movnum,bhlfmoval,num;输入替换词条andax,00ffhmovcx,ax;num值送计数器movdi,0ffffhleabx,string[0]lop1:movdx,offsetnote2;输出提示2movah,9int21hmovdx,bxmovah,0ahint21hlfmovsi,bxmoval,[si+1]andax,00ffhaddsi,2addsi,axmov[si],'$'movdx,offsetnote3;输出提示3movah,9int21haddbx,22movdx,bxmovah,0ahint21hlfmovsi,bxmoval,[si+1]andax,00ffhaddsi,2addsi,axmov[si],'$'addbx,42looplop1movdx,offsetnote4;输出提示4movah,9int21hmovdx,offsetbuf3;输入文本movah,0ahint21hlfmovsi,offsetbuf3moval,[si+1]andax,00ffhaddsi,2addsi,axmov[si],'$'retinputendp;输入完毕rankprocnear;排序函数leabx,string[0]movdl,numanddx,00ffhdecdxcmpdx,0jznonemovsi,0ffffhlop3:incsimovdi,si;外循环movbp,bxlop4:incdi;内循环addbp,64moval,[bx].count1movah,[bp].count1cmpal,ahjaenextpushsi;string[si]与string[di]交换pushdimovcx,64movsi,bx;temp=string[si]leadi,tempcldrepmovsbmovcx,64movsi,bp;string[si]=string[di]movdi,bxrepmovsbmovcx,64leasi,temp;string[di]=tempmovdi,bprepmovsbpopdipopsinext:cmpdi,dxjnzlop4addbx,64movax,dxdecaxcmpsi,axjnzlop3none:retrankendpstrstrprocnear;查找替换词在句子中第一次出现的位置,若找到把其偏移地址AX,否则把0送AX。堆栈传递入口参数pushbppushcxmovbp,spmovsi,[bp+6]movdi,[bp+8]lop5:cmp[di],'$'jzno;不存在pushdipushsimoval,[si-1]andax,00ffhmovcx,axcldrepecmpsbjzfoundpopsipopdiincdijmplop5found:popsi;找到popdimovax,dijmpexit0no:movax,0exit0:popcxpopbpret4strstrendpstrcpyprocnear;字符串复制函数pushbpmovbp,spmovsi,[bp+4]movdi,[bp+6]nex:moval,[si]cmpal,'$'jzexit1moval,[si]mov[di],alincsiincdijmpnexexit1:mov[di],'$';末尾加'$'!!!否则多次用y后会出错。如:第一次将asd复制进y中,则y为asd$,若第二次将m复制进y,若末尾不加$,popbp;则y为msd$,导致合并xy时将sd也合并了进去ret4strcpyendpstrcatprocnear;字符串合并pushbpmovbp,spmovsi,[bp+4]movdi,[bp+6]lop6:moval,[di]cmpal,'$'jzmoveincdijmplop6move:moval,[si]mov[di],alcmpal,'$'jzexit2incsiincdijmpmoveexit2:popbpret4strcatendpend(五)实验总结虽然本次实验要求简单明了,但我们在实际编程,尤其是运用汇编语言编写程序的过程中,还是遇到了一些困难,例如输出函数中未将缓冲中的回车符替换为$;strcpy函数中未在y字符串后加上$等。我组成员查阅书本及相关资料,查找汇编指令的用法、BIOS中断调用、系统功能调用、磁盘数据的查询、存取等相关知识。将困难逐一解决,最终成功运行程序,并得出了正确结果。通过这次实验,我们对汇编语言的编程特点也有了更加深入的认识,自身的编程能力和逻辑思考能力也有了很大提升。
本文标题:字符串的查找与替换汇编实现
链接地址:https://www.777doc.com/doc-3402928 .html