汇编语言查找匹配字符串

合集下载

用汇编语言实现字符的匹配

用汇编语言实现字符的匹配

上海电力学院实验报告计算机硬件实验课程题目:字符的匹配班级:姓名:学号:一.实验目的1)掌握MASM工具调试汇编程序2)熟悉DOS功能调用3)学会用汇编语言编写程序,并掌握各功能号的作用二.实验目的:能够进行简单的功能程序的编辑操作三.实验内容:四.实验程序:data segment 定义数据段string db '12345' 定义要比较的字符buffer db 40,0,40 dup(?) 定义一个数据缓冲区string1 db 'yes!',0dh,0ah, '$' 定义匹配时显示yesstring2 db 'not match!',0dh,0ah, '$' 定义不匹配是显示not matchdata ends 数据段定义结束code segment 定义代码段assume cs:code,ds:datastart: mov ax,0 初始化dsmov ax,datamov ds,axlea dx,buffer 在缓冲区的地址输入字符mov ah,0ahint 21hmov si,dx 把缓冲区的地址给源串指针si add si,2 si加2是指针指向第一个字符 lea di,string 把目标串指针给 dimov cx,5 设循环次数为5CLD 指针按地址增量变化repe cmpsb 执行串比较指令jz right 完全相等则转rightlea dx,string2 否则显示not matchmov ah,09hint 21hjmp over 结束right: lea dx,string1 显示yesmov ah,09hint 21hjmp over 结束over: mov ah,4chint 21hcode endsend start五.流程图:开始(数据段、代码段定义)Table=123456;string1=’no match ’;string2=’yes ’定义string 10缓冲格从键盘上输入要查询的数据段Si=dx;di=table;cldRepe cmpsb 重复比较ZF=1是Right 跳转输出Wrong 跳转输出回到DOS结束六.实验结果:七.实验心得:这次实验是前几次理论编写实验程序中最复杂的一个,刚开始我一个人做时并没有将它完整的做出来,而且感觉遇到问题颇多,后来通过与其他同学的合作谈论,这才得到实验结果,满足要求,只是到现在还留有一个问题,就是得到结果后会将前一句话覆盖,始终没解决掉。

字符串匹配汇编语言程序设计

字符串匹配汇编语言程序设计

学号:课程设计题目字符串匹配汇编语言程序设计学院自动化学院班级电气1003班姓名申廷进指导教师徐腊梅2013 年01 月17 日课程设计任务书学生姓名:申廷进专业班级:电气1003班指导教师:徐腊梅工作单位:自动化学院题目: 字符串匹配汇编语言程序设计要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1)根据提示信息,从字符输入两个字符串,实现两个字符串的比较,如果两个字符串的字符只要有一个相同则显示“MATCH”,否则显示“NOMATCH”。

2)可连续输入字符进行比较,直至单击“Q”或“q”键退出程序。

时间安排:1.9 课设题目,设计内容;1.9—1.10 查资料,算法、方案设计。

1.10—1.13 (硬)软件设计1.14—1.15 调试程序1.16—1.17 写课设报告1.18 答辩指导教师签名:年月日系主任(或责任教师)签名:年月日1 设计总体方案 (2)1.1 设计目的 (2)1.2 设计要求及其条件 (2)1.3 设计方案 (2)2 程序流程图分析 (3)2.1 转移流程图的分析 (3)2.2 流程图总体分析 (3)3 程序段落的说明 (5)3.1 换行回车键的定义 (5)3.2 提示信息和字符串的定义 (5)3.3 DOS功能和部分指令的说明 (6)4 程序调试说明、结果记录与分析 (7)4.1 程序调试说明 (7)4.2 调试结果说明 (7)4.3 分析结果 (9)5心得体会 (9)参考文献 (11)附件 (12)微型计算机简称微机,由于其具备人脑的某些功能,所以也称其为微电脑。

是由大规模集成电路组成的、体积较小的电子计算机。

它是以微处理器为基础,配以内存储器及输入输出接口电路和相应的辅助电路而构成的裸机。

把微型计算机集成在一个芯片上即构成单片微型计算机。

学习微机课程,主要内容包括微型计算机体系结构、8086微处理器和指令系统、汇编语言、设计以及微型计算机各个组成部分,而汇编语言是其中一大板块。

汇编:判断两个字符串是否相等(匹配)

汇编:判断两个字符串是否相等(匹配)

汇编:判断两个字符串是否相等(匹配);编程从键盘输入两个字符串到内存缓冲区,并比较两个字符串是否相同;;如相同,输出match;如不同,输出no match。

;经修改的代码能够循环使用DATAS SEGMENTdata1 DB 100 DUP(?)data2 DB 100 DUP(?)string DB 0DH,0AH,$tital1 DB Please input the first string :,0DH,0AH,$tital2 DB Please input the second string :,0DH,0AH,$tital3 db Do you want to have a try again(if yes,input y,else input n ): ,0dh,0ah,$ result1 db match,0dh,0ah,$ result2 db no match,0dh,0ah,$temp DW 0DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX MOV si,0tip1: ;输出抬头1LEA dx,tital1MOV ah,09hINT 21Hfirst: ;输入第一个字符串MOV ah,01h ;输入字符放在AL 中INT 21H ;以回车作为结束符cmp al,0dhje tip2MOV data1[si],AL;保存在内存中INC siJMP firsttip2:LEA dx,stringMOV AH,09HINT21HMOV temp,si ; 保存si 使得下一个字符串和它做比较MOV si,0 ;输出抬头2LEA dx,tital2MOV ah,09hINT 21Hsecond: ;输入第二个字符串MOV AH,01H ;输入字符放在AL 中INT 21H ;同样以回车作为结束符CMP AL,0DHje outputmovdata2[si],al ;保存到内存inc sijmp secondoutput:LEA dx,stringMOV AH,09HINT21HCMP temp,si ;判断长度是否相等JNE nomatchMOV si,0pipei:MOV AL,DATA1[si];判断是否每个字符都相等MOV AH,DATA2[si]INC siCMPAL,AHJNE nomatchCMP si,tempJE MATCHJMP pipeiMATCH: LEA DX,result1 ;不匹配就输出结论1 MOV AH,09H INT 21H JMP EXITnomatch:LEA DX,result2 ;匹配就输出结论2 MOV AH,09H INT 21HEXIT: ;询问是否要继续进行leadx,tital3 mov ah,09h int 21h mov ah,01h int 21h cmp al,y lea dx,string mov ah,09h int 21h je start cmp al,n je over jmp exitover: ;结束MOV AH,4CH INT 21HCODES。

汇编语言---字符串操作指令

汇编语言---字符串操作指令

汇编语言---字符串操作指令汇编语言---字符串操作指令字符串操作指令的实质是对一片连续的存储单元进行处理,这片连续的存储单元由隐含指针DS:SI或ES:DI来指定;字符串操作指令可对内存单元按照字节、字、双字进行处理,并能根据操作对象的字节数使变址寄存器SI/DI增加或减少1、2、4字节;规定如下:A.当DF=0时,变址寄存器SI/DI增加1、2、4字节;即:变址寄存器SI/DI递增的步长可以是1、2、4字节;B.当DF=1时,变址寄存器SI/DI减少1、2、4字节;即:变址寄存器SI/DI递减的步长可以是1、2、4字节;一、取字符串数据指令(Load String Instruction)从指针DI:SI所指定的内存单元开始,取一个字节/字/双字,然后存入到AL/AX/EAX中,并根据标志位DF的值对寄存器SI 做相应的增减;把存放字符串数据的连续存储区当做是数据源,使用寄存器SI;该指令的执行不会影响任何标志位;指令格式: LODS 地址表达式LODSB/LODSW 地址表达式LODS 地址表达式;80386+在指令LODS中,它会根据"地址表达式"的属性来决定读取一个字节、字或双字;即:当该地址表达式的属性为字节、字或双字时,将从指针DI:SI处读取一个字节到AL中,或读取一个字到AX中,或读取一个双字到EAX中,与此同时,SI还将分别增减1、2、4字节;取字符串数据指令的功能示意图如下图所示:二、置字符串数据指令(Store String Instruction)该指令把寄存器AL/AX/EAX中的值存入指针ES:DI所指向内存单元开始的一片存储单元中,并根据标志位DF的值对寄存器DI做相应的增减;把存放字符串的连续存储区当做是数据的目的地,使用寄存器DI;该指令的执行并不会影响任何标志位;指令格式: STOS 地址表达式STOSB/STOSW 地址表达式STOSD 地址表达式;80386+置字符串数据指令的功能示意图如下图所示:三、字符串传送指令(Move String Instruction)该指令把指针DS:SI所指向的字节、字或双字传送给指针ES:DI所指向的内存单元,并根据标志位DF的值对寄存器DI 和SI分别作相应的增减;该指令的执行并不会影响任何标志位;指令格式: MOVS 地址表达式1,地址表达式2MOVSB/MOVSW 地址表达式1,地址表达式2MOVSD 地址表达式1,地址表达式2 ;80386+字符串传送指令的功能示意图如下图所示:四、输入字符串指令(Input String Instruction)该指令是从某一指定端口接受一个字符串,并存入到一片连续的存储单元中;输入端口由寄存器DX指定,存储单元的首地址由指针ES:DI 来确定,读入的数据个数由寄存器CX来确定;在指令的执行过程中,还要根据标志位DF的值来对寄存器DI做相应的增减;把存放字符串的连续存储区当做是数据的目的地;该指令不会影响任何标志位;与指令有关的操作数ES、DI、DX和CX等都是隐含操作数; 指令格式: INS 地址表达式INSB/INSW 地址表达式INSD 地址表达式;80386+五、字符串输出指令(Output String Instruction)该指令是把一个给定的字符串输出到一个指定的端口中;输出端口由通用寄存器DX指定,输出数据的首地址由指针DS:SI确定,输出数据的个数由计数寄存器CX来确定;在指令执行的过程中,还要根据方向标志DF的值来对变址寄存器SI 做相应的增减;该指令的执行并不会影响任何标志位;与指令有关的操作数DS、SI、DX和CX等都是隐含操作数; 指令格式: OUTS 地址表达式OUTSB/OUTSW 地址表达式OUTSD 地址表达式;80386+六、字符串比较指令(Compare String Instruction)该指令是把指针DS:SI所指向的字节、字、双字的值与指针ES:DI 所指向的字节、字、双字的值相减,并用所得到的差来设置相关标志位;与此同时,变址寄存器SI和DI也将根据方向标志位DF的值做相应的增减;指令格式: CMPS 地址表达式1,地址表达式2CMPSB/CMPSW 地址表达式1,地址表达式2CMPSD 地址表达式1,地址表达式2 ;80386+受影响的标志位: AF,CF,OF,PF,SF,ZF字符串比较指令的功能示意图如下图所示:七、字符串扫描指令(Scan String Instruction)该指令是用指针ES:DI所指向字节/字/双字的值与相应的AL/AX/EAX的值相减,并依据所得到的差值来设置相关标志位;与此同时,变址寄存器DI还将根据方向标志DF的值来做相应的增减;指令格式: SCAS 地址表达式SCASB/SCASW 地址表达式SCASD 地址表达式;80386+受影响的标志位: AF,CF,OF,PF,SF,ZF字符串扫描指令的功能示意图如下图所示:八、重复字符串操作指令(Repeat String Instruction)前面的字符串操作指令:取字符串数据、置字符串数据、字符串传送、输入字符串、输出字符串、字符串比较、字符串扫描,等指令,都是执行一次所具有的功能;但是,每个字符串通常都是由多个字符组成的,所以,需要重复执行这些字符串操作指令;为了满足这种需要,指令系统提供了一组重复前缀指令;虽然在这些字符串指令的前面都可以添加一个重复前缀指令,但是由于指令执行结果的差异,对某个具体的字符串指令又不用重复前缀指令而改用其它循环来实现重复的需要;重复字符串操作指令对标志位的影响是由被重复的字符串操作指令来决定;1.重复前缀指令REP(Repeat String Instruction) 重复前缀指令是重复其后指定的字符串操作指令,重复的次数由计数寄存器CX来决定;指令格式:REP LODS/LODSB/LODSW/LODSDREP STOS/STOSB/STOSW/STOSDREP MOVS/MOVSB/MOVSW/MOVSDREP INS/INSB/INSW/INSDREP OUTS/OUTSB/OUTSW/OUTSD重复前缀指令的执行步骤如下:STEP1:判断: CX=0STEP2:如果CX=0,则结束重复操作,执行程序中的下一条指令;STEP3:否则,CX=CX-1(不影响相关标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行完后,再转到步骤STEP1;从上面的重复前缀指令格式来看,虽然我们可以使用重复前缀指令来重复取字符串数据指令(第一组指令),但是可能会因为指令的执行结果而在程序中几乎不会使用;例如:编写一段程序,计算字符串"12345abcdefg"中各个字符的ASCII之和;解:......MESS DB '12345abcdefg' ;在数据段进行变量说明......MOV AX,SEG MESSMOV DS,AXLEA SI,MESS ;用DS:SI来指向字符串的首地址;MOV CX,13D ;重复次数XOR BX,BX ;置求和的初值为0REP LODSB ;循环去处字符; ......从程序片段中看,虽然"REP LODSB"能从字符串中逐一取出每个字符,但这个操作是在同一条指令中完成的,程序的其它指令根本无法处理每次取出的字符数据,指令的执行结果是:AL中只保存了最后一次取出的字符'h'的ASCII码;所以,为了实现本例的要求,不能使用重复前缀指令,而要把指令"REP LODSB"改写成如下四条指令:XOR AH,AH ;为后面的累加做准备AGAIN:LODSBADD BX,AX ;AL是被取出的字符,AH已被清0LOOP AGAIN2.条件重复前缀指令(Repeat String Conditionally) 条件重复前缀指令与重复前缀指令的功能相似,所不同的是:条件重复前缀指令中的重复次数不仅由CX来决定,而且还会由标志位ZF的值来决定;根据ZF所起的作用又可分为两种:相等重复前缀指令和不等重复前缀指令;A.相等重复前缀指令:指令格式:REPE/REPZ SCAS/SCASB/SCASW/SCASDREPE/REPZ CMPS/CMPSB/CMPSW/CMPSD该重复前缀指令的执行步骤如下:STEP1:判断条件: CX!=0 且ZF=1STEP2:如果条件不成立,则结束重复操作,执行程序中的下一条指令;STEP3:否则,CX=CX-1(不影响任何标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行后,再转到步骤STEP1;B.不等重复前缀指令:指令格式:REPNE/REPNZ SCAS/SCASB/SCASW/SCASDREPNE/REPNZ CMPS/CMPSB/CMPSW/CMPSD该重复前缀指令的执行步骤如下:STEP1:判断条件:CX!=0 且ZF=0STEP2:如果条件不成立,则结束重复操作,执行程序中的下一条指令;STEP3:否则,CX=CX-1(不影响任何标志位),并执行重复前缀指令后面指定的字符串操作指令,在该指令执行完后,再转到步骤STEP1;。

汇编实验二查找匹配字符串审批稿

汇编实验二查找匹配字符串审批稿

汇编实验二查找匹配字符串YKK standardization office【 YKK5AB- YKK08- YKK2C- YKK18】实验三查找匹配字符串1.实验目的:查找匹配字符串SEARCH。

2. 实验要求:程序接收用户键入的一个关键字以及一个句子。

如果句子中不包含关键字则显示“No match!”;如果句子中包含关键字则显示“Match!”,且把该句子中的位置用十六进制数显示出来。

实验结果:要求程序的执行过程如下:Enter keyword:abcEnter Sentence: We are studying abc.Match at location:11H of the sentence.Enter Sentence: xyz, Ok?No match.Enter Sentence: ^C3. 实验报告要求:(1)分析要点及调试后的正确程序。

(2) 实验体会。

源代码:DATAREA SEGMENTSTRING1 DB "Enter keyword:$"STRING2 DB "Enter sentence:$"STRING3 DB "Match at location:$"STRING4 DB "No match!",13,10,"$"STRING5 DB "H of the sentence.$" keyword DB 50D,?,51D DUP(?) sentence DB 50D,?,51D DUP(?) DATAREA ENDSCODE SEGMENTMAIN PROC FARASSUME CS:CODE,DS:DATAREA,ES:DATAREA START:PUSH DSSUB AX,AXPUSH AXMOV AX,DATAREAMOV DS,AXMOV ES,AXLEA DX,STRING1MOV AH,09HINT 21HLEA DX,keywordMOV AH,0AHINT 21HMOV AH ,02HMOV DL,0AHINT 21HLEA DX,STRING2MOV AH,09HINT 21HLEA DX,sentenceMOV AH,0AHINT 21HMOV AH,02HMOV DL,0AHINT 21HLEA SI,keyword+2 ;关键词LEA DI,sentence+2MOV AX,0MOV AL,[sentence+1] ;句子字符个数MOV AH,[keyword+1] ;关键词字符个数CMP AL,AHJL NOSUB AL,AHMOV AH,0MOV CX,AXINC CXCOMPARE:PUSH CXMOV CX,3 ;建议采用mov ax,字符个数,使字符的个数不固定CLDREPZ CMPSBJZ MATCHMOV AX,3 ;建议采用mov ax,字符个数SUB AX,CXSUB SI,AX ;关键词回到词首MOV AX,2 ;建议采用mov ax,字符个数-1SUB AX,CXSUB DI,AXPOP CXLOOP COMPARENO: LEA DX,STRING4MOV AH,09HINT 21HJMP EXITMATCH: POP CXMOV BX,DILEA DX,STRING3MOV AH,09HINT 21HSUB BX,OFFSET sentence+2SUB BX,2 ;首地址所在字符串中的地址CALL CHANGELEA DX,STRING5MOV AH,09HINT 21HEXIT:RETMAIN ENDPCHANGE PROC NEAR PUSH AXPUSH BXPUSH CXPUSH DXMOV CH,4MOV CL,4 ROTATE: ROL BX,CL MOV AL,BLAND AL,0FHADD AL,30HCMP AL,3AHJL PRINTITADD AL,7H PRINTIT:MOV DL,ALMOV AH,2INT 21HDEC CHJNZ ROTATEPOP DXPOP CXPOP BXPOP AXRETCHANGE ENDP CODE ENDSEND START。

汇编语言查找匹配字符串

汇编语言查找匹配字符串

汇编语言实验二查找匹配字符串一、目的查找匹配字符串SEARCH二、实验内容程序接收用户键入的一个关键字以及一个句子。

如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。

流程图三、设计和编码DATA SEGMENTmess1 DB 'Enter keyword:','$'mess2 DB 'Enter Sentence:','$'mess3 DB 'Match at location:','$'mess4 DB 'NOT MATCH.',13,10,'$'mess5 DB 'H if the sentence',13,10,'$' N YY Y输入关键字结束关键字长度=0输入句子句子长度<关键字长度Y保存关键字长度到cx ,cx 入栈,保存总循环次数(句子长度-关键字长度+1)到al ,将句子的首地址放进bx(作为基址寄存器) si=di=0(变址寄存器)开始比较[bx+di]与[si]是否相等si+1,di+1,cx-1(同时指向下一个字符)YN bx+1(句子指向下一个字符) cx 出栈,再入栈,si,di 清零,al-1 cx 是否为0N 匹配完成,调用子程序输出al 是否为0 不匹配,输出change DB 13,10,'$'stoknin1 label bytemax1 db 10act1 db?stokn1 db 10 dup(?)stoknin2 label bytemax2 db 50act2 db?stokn2 db 50 dup(?)DATA ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODE SEGMENT;*************************************代码段main proc farassume cs:code,ds:data,es:dataSTART:push dssub AX,AXsub BX,BXsub DI,DIsub SI,SIpush AX ;为返回dos并清空后面要用到的寄存器MOV AX,DATAMOV DS,AXLEA DX,mess1MOV ah,09INT 21h ;输出Enter keywordLEA DX,stoknin1MOV ah,0ah ;用21号中段的0ah号功能获取关键字INT 21hcmp act1,0je exit ;如果为空直接退出程序a10:;********************************输入Sentence并判断LEA DX,changeMOV ah,09INT 21h ;输出回程,换行LEA DX,mess2MOV ah,09INT 21h ;输出Enter Sentence:LEA DX,stoknin2MOV ah,0ahINT 21h ;用21号中段的0ah号功能获取句子MOV AL,act1CBWMOV CX,AX ;保存关键字长度到cxPUSH CX ;cx入栈MOV AL,act2cmp AL,0je a50 ;保存句子长度到al,若句子为空则跳转显示not match SUB AL,act1js a50 ;若句子长度小于关键字长度,则跳转显示not match INC ALCBWLEA BX,stokn2 ;将句子的首地址放进BXMOV DI,0MOV SI,0a20:;****************************************比较,内循环MOV AH,[BX+DI]CMP AH,stokn1[SI] ;遇见字符不相等就跳转到a30jne a30INC DIINC SIDEC CX ;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完CMP CX,0je a40jmp a20a30:;*****************************************外循环,BX+1,清空si,di继续内循环比较INC BXDEC ALcmp AL,0je a50MOV DI,0MOV SI,0POP CXpush CXjmp a20a40:;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出SUB BX,offset stokn2INC BXLEA DX,changeMOV ah,09INT 21hLEA DX,mess3MOV ah,09INT 21hCALL btohLEA DX,mess5MOV ah,09INT 21hjmp a10;****************************************二进制转换十六进制btoh PROC NEARMOV CH,4rotate: MOV CL,4ROL BX,CLMOV AL,BLand AL,0fhadd AL,30hcmp al,3ahjl printitadd al,7hprintit:MOV dl,alMOV ah,2int 21hdec chjnz rotateretbtoh endpa50:;*****************************************显示not matchLEA DX,changeMOV ah,09INT 21hLEA DX,mess4MOV ah,09INT 21hjmp a10exit:retmain endpCODE ENDSEND START 四、运行结果及分析五、实验小结六、附录(选)。

汇编语言实验二查找匹配字符串

汇编语言实验二查找匹配字符串

汇编语言实验二查找匹配字符串一、目的查找匹配字符串SEARCH二、实验内容程序接收用户键入的一个关键字以及一个句子。

如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。

流程图N YY Y输入关键字结束关键字长度=0输入句子句子长度<关键字长度Y保存关键字长度到cx ,cx 入栈,保存总循环次数(句子长度-关键字长度+1)到al ,将句子的首地址放进bx(作为基址寄存器) si=di=0(变址寄存器)开始比较[bx+di]与[si]是否相等si+1,di+1,cx-1(同时指向下一个字符)YN bx+1(句子指向下一个字符) cx 出栈,再入栈,si,di 清零,al-1 cx 是否为0N 匹配完成,调用子程序输出al 是否为0 不匹配,输出三、设计和编码DATA SEGMENTmess1 DB'Enter keyword:','$'mess2 DB'Enter Sentence:','$'mess3 DB'Match at location:','$' mess4 DB'NOT MATCH.',13,10,'$' mess5 DB'H if the sentence',13,10,'$'change DB 13,10,'$'stoknin1 label bytemax1 db 10act1 db?stokn1 db 10 dup(?)stoknin2 label bytemax2 db 50act2 db?stokn2 db 50 dup(?)DATA ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODE SEGMENT;*************************************代码段main proc farassume cs:code,ds:data,es:dataSTART:push dssub AX,AXsub BX,BXsub DI,DIsub SI,SIpush AX ;为返回dos并清空后面要用到的寄存器MOV AX,DATAMOV DS,AXLEA DX,mess1MOV ah,09INT 21h ;输出Enter keywordLEA DX,stoknin1MOV ah,0ah ;用21号中段的0ah号功能获取关键字INT 21hcmp act1,0je exit ;如果为空直接退出程序a10:;********************************输入Sentence并判断LEA DX,changeMOV ah,09INT 21h ;输出回程,换行LEA DX,mess2MOV ah,09INT 21h ;输出Enter Sentence:LEA DX,stoknin2MOV ah,0ahINT 21h ;用21号中段的0ah号功能获取句子MOV AL,act1CBWMOV CX,AX ;保存关键字长度到cxPUSH CX ;cx入栈MOV AL,act2cmp AL,0je a50 ;保存句子长度到al,若句子为空则跳转显示not match SUB AL,act1js a50 ;若句子长度小于关键字长度,则跳转显示not match INC ALCBWLEA BX,stokn2 ;将句子的首地址放进BXMOV DI,0MOV SI,0a20:;****************************************比较,内循环MOV AH,[BX+DI]CMP AH,stokn1[SI] ;遇见字符不相等就跳转到a30jne a30INC DIINC SIDEC CX ;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完CMP CX,0je a40jmp a20a30:;*****************************************外循环,BX+1,清空si,di继续内循环比较INC BXDEC ALcmp AL,0je a50MOV DI,0MOV SI,0POP CXpush CXjmp a20a40:;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出SUB BX,offset stokn2INC BXLEA DX,changeMOV ah,09INT 21hLEA DX,mess3MOV ah,09INT 21hCALL btohLEA DX,mess5MOV ah,09INT 21hjmp a10;****************************************二进制转换十六进制btoh PROC NEARMOV CH,4rotate: MOV CL,4ROL BX,CLMOV AL,BLand AL,0fhadd AL,30hcmp al,3ahjl printitadd al,7hprintit:MOV dl,alMOV ah,2int 21hdec chjnz rotateretbtoh endpa50:;*****************************************显示not matchLEA DX,changeMOV ah,09INT 21hLEA DX,mess4MOV ah,09INT 21hjmp a10exit:retmain endpCODE ENDSEND START 四、运行结果及分析五、实验小结六、附录(选)。

字符串匹配算法

字符串匹配算法

字符串匹配算法字符串匹配算法是计算机科学中重要的算法之一,用于在一个字符串中查找特定的子串。

在实际应用中,字符串匹配算法被广泛地应用于文本搜索、数据处理和模式识别等领域。

本文将介绍常见的字符串匹配算法,包括暴力匹配算法、KMP算法和Boyer-Moore算法。

1. 暴力匹配算法暴力匹配算法,也称为朴素匹配算法,是最简单的字符串匹配算法之一。

它的思想是从主串的第一个字符开始,逐个与子串进行比较,直到找到匹配或者遍历完整个主串。

具体实现时,可以使用两个指针分别指向主串和子串的第一个字符,然后循环比较两个指针所指向的字符。

如果字符相等,则继续比较下一个字符;如果字符不相等,则移动主串的指针到下一个位置,再重新开始比较。

暴力匹配算法的时间复杂度为O(mn),其中m为主串长度,n为子串长度。

由于需要逐个比较字符,效率较低,尤其在处理大规模文本时。

2. KMP算法KMP算法(Knuth-Morris-Pratt算法)是一种高效的字符串匹配算法,可以在O(m+n)的时间复杂度内完成匹配。

该算法利用了子串内部的特点,避免了不必要的字符比较。

KMP算法的核心思想是构建一个部分匹配表,用于记录子串中每个位置的最长可匹配前缀和后缀的长度。

构建部分匹配表的过程可以在预处理阶段完成,时间复杂度为O(n)。

具体实现时,通过匹配过程中的前后指针的移动,根据部分匹配表和主串的字符进行比较。

如果字符匹配,则同时向后移动两个指针;如果字符不匹配,则根据部分匹配表的信息,移动子串的指针到指定位置,继续进行匹配。

KMP算法的优势在于避免了不必要的比较操作,提高了匹配效率。

它在文本搜索、模式识别等领域得到广泛应用。

3. Boyer-Moore算法Boyer-Moore算法是一种基于字符比较和移动的字符串匹配算法,具有较高的效率。

该算法先从子串的末尾开始与主串进行比较,然后根据比较结果选择合适的移动策略。

Boyer-Moore算法结合了两种不同的启发式策略,分别是坏字符规则和好后缀规则。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编语言实验二查找匹配字符串
一、目的
查找匹配字符串SEARCH
二、实验内容
程序接收用户键入的一个关键字以及一个句子。

如果句子中不包含关键字则显示‘NO match!’;如果句子中包含关键字则显示‘MATCH’,且把该字在句子中的位置用十六进制数显示出来。

流程图
N Y
Y Y
输入关键字
结束
关键字长度=0
输入句子
句子长度<关键字长度
Y
保存关键字长度到cx,cx 入栈,保存总循环次数(句子长度-关键字长度+1)
到al,将句子的首地址放进bx(作为基址寄存器)si=di=0(变址寄存器)
开始比较[bx+di]与[si]是否相等
si+1,di+1,cx-1(同时指向下一个字符)
Y
N bx+1(句子指向下一个字符)cx 出栈,再入栈,si,di 清零,al-1cx 是否为0
N 匹配完成,调用子程序输出
al 是否为0
不匹配,输出三、设计和编码
DATA SEGMENT mess1DB 'Enter keyword:','$'mess2DB 'Enter Sentence:','$'mess3DB 'Match at location:','$'mess4DB 'NOT MATCH.',13,10,'$'mess5DB 'H if the sentence',13,10,'$'
change DB13,10,'$'
stoknin1label byte
max1db10
act1db?
stokn1db10dup(?)
stoknin2label byte
max2db50
act2db?
stokn2db50dup(?)
DATA ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODE SEGMENT
;*************************************代码段
main proc far
assume cs:code,ds:data,es:data
START:
push ds
sub AX,AX
sub BX,BX
sub DI,DI
sub SI,SI
push AX;为返回dos并清空后面要用到的寄存器
MOV AX,DATA
MOV DS,AX
LEA DX,mess1
MOV ah,09
INT21h;输出Enter keyword
LEA DX,stoknin1
MOV ah,0ah;用21号中段的0ah号功能获取关键字
INT21h
cmp act1,0
je exit;如果为空直接退出程序
a10:
;********************************输入Sentence并判断
LEA DX,change
MOV ah,09
INT21h;输出回程,换行
LEA DX,mess2
MOV ah,09
INT21h;输出Enter Sentence:
LEA DX,stoknin2
MOV ah,0ah
INT21h;用21号中段的0ah号功能获取句子
MOV AL,act1
CBW
MOV CX,AX;保存关键字长度到cx
PUSH CX;cx入栈
MOV AL,act2
cmp AL,0
je a50;保存句子长度到al,若句子为空则跳转显示not match SUB AL,act1
js a50;若句子长度小于关键字长度,则跳转显示not match INC AL
CBW
LEA BX,stokn2;将句子的首地址放进BX
MOV DI,0
MOV SI,0
a20:
;****************************************比较,内循环
MOV AH,[BX+DI]
CMP AH,stokn1[SI];遇见字符不相等就跳转到a30
jne a30
INC DI
INC SI
DEC CX;没遇到一个相等的字符,cx-1,cx不为0则比较下一个字符,当cx为0是说明关键字比较完
CMP CX,0
je a40
jmp a20
a30:
;*****************************************外循环,BX+1,清空si,di继续内循环比较
INC BX
DEC AL
cmp AL,0
je a50
MOV DI,0
MOV SI,0
POP CX
push CX
jmp a20
a40:
;*****************************************match,将bx减去句子的首地址加一得到关键字所在位置,调用二进制转十六进制子函数将位置输出
SUB BX,offset stokn2
INC BX
LEA DX,change
MOV ah,09
INT21h
LEA DX,mess3
MOV ah,09
INT21h
CALL btoh
LEA DX,mess5
MOV ah,09
INT21h
jmp a10
;****************************************二进制转换十六进制
btoh PROC NEAR
MOV CH,4
rotate:MOV CL,4
ROL BX,CL
MOV AL,BL
and AL,0fh
add AL,30h
cmp al,3ah
jl printit
add al,7h
printit:
MOV dl,al
MOV ah,2
int21h
dec ch
jnz rotate
ret
btoh endp
a50:
;*****************************************显示not match
LEA DX,change
MOV ah,09
INT21h
LEA DX,mess4
MOV ah,09
INT21h
jmp a10
exit:
ret
main endp
CODE ENDS
END START 四、运行结果及分析
五、实验小结
六、附录(选)。

相关文档
最新文档