一、实验内容
已知任意长度字符串str,以00h结束,长度小于200h,编写汇编程序,实现在该字符串中搜索匹配子串substr(以00h结束,长度小于80),若找到,则将found单元置为ffh,并将匹配位置(匹配位置以字符串str首地址为0参考点)存放在pos单元中;否则,将found单元置为00h。要求编写完整程序,并上机通过调式能运行。
二、算法思想
搜索查找采用了Brute-Force算法,一个简单而广泛使用的暴力搜索,它在文本中对可能匹配模式串的任何位置检查匹配是否存在。一个指针SI跟踪文本,另一个指针DI跟踪模式串。对于每一个SI都会启动一次匹配搜寻,若模式匹配则将found单元置为ffh,并将匹配位置存放于pos单元。否则重置DI为0并将SI移动到下一个位置进行下一次匹配。若最后未找到匹配,则found单元置为00h。
BF算法虽然在最坏情况下的运行时间与MN成正比,但在实际应用场景中,大部分情况它的运行时间一般与M+N成正比。它在一般情况下都工作良好(Java的String类型的indexOf()方法使用的就是BF算法)。
三、运行结果截图
- 能找到匹配的情况:FOUND=FFH,POS存放匹配位置,如下图所示:
- 未能找到匹配的情况:FOUND=00H,如下图所示:
四、程序源码
DATA SEGMENT
STR DB "ACCCUB3121NA31CBB098621XXJDB"
DB "SZ57BVVC3ACBBXXJDBSZ4329AX56"
DB "SZACM34XAAB565757BVVC356CNKJ"
DB "POACM8901AB565098HNKJD56CNK0"
DB "I8930934MHBDV27839B4501B48YZ",00h
SUBSTR DB "ACBBXXJDBSZ43S29AX",00h
FOUND DB 0
POS DW 0
DATA ENDS
CODE SEGMENT
ASSUME:CS:CODE,DS:DATA
START:MOV AX,DATA
MOV DS,AX
LEA SI,STR
LEA DI,SUBSTR
COMPARE: ;源串循环
CMP BYTE PTR[SI],00h ;检测源串是否结束
JZ DONE1 ;若结束,则说明未找到匹配
MOV DL,BYTE PTR[SI]
CMP DL,BYTE PTR[DI]
JNZ L1
INC DI
CMP BYTE PTR[DI],00h ;检测匹配子串是否结束
JZ DONE2 ;若结束,则说明找到了匹配
L1: INC SI
JMP COMPARE
DONE1: MOV CL,00H
MOV FOUND,CL
JMP NEXT
DONE2: MOV CL,0FFH
MOV FOUND,CL
LEA BX,SUBSTR ;计算匹配位置
SUB DI,BX
SUB SI,DI
ADD SI,1
MOV POS,SI
NEXT:
MOV AH,4CH
INT 21H
CODE ENDS
END START