📄 qucksrch.asm
字号:
;改进的快速模式匹配算法(80C52)。
S EQU 2000H ;主串首址。
T EQU 30H ;模式串首址。
N DATA 38H ;主串长度存放单元。
M DATA 39H ;模式串长度存放单元。
FIND BIT 00H ;匹配成功标志。
ORG 0000H
LJMP TEST
ORG 100H
TEST: MOV N,#5BH ;主串长度为91个字节。
MOV P2,#HIGH(S)
MOV R0,#LOW(S)
MOV DPTR,#LIST
MOV R2,N
LOOP: CLR A
MOVC A,@A+DPTR
MOVX @R0,A
INC R0
INC DPTR
DJNZ R2,LOOP
MOV M,#6 ;模式串为"80C552"。
MOV T,#"8"
MOV T+1,#"0"
MOV T+2,#"C"
MOV T+3,#"5"
MOV T+4,#"5"
MOV T+5,#"2"
LCALL QSRCH ;匹配成功,FIND=1,DPTR=2004H。
MOV M,#5 ;模式串为"80C51"。
MOV T,#"8"
MOV T+1,#"0"
MOV T+2,#"C"
MOV T+3,#"5"
MOV T+4,#"1"
LCALL QSRCH ;匹配失败,FIND=0。
STOP: LJMP STOP ;结束。
LIST: DB "The 80C552 has " ;主串。
DB "two redeced power "
DB "modes of operation: "
DB "the idle mode and the "
DB "power-down mode."
QSRCH: MOV DPTR,#S ;指向主串首址。
MOV R7,N ;主串全部元素均未参与比较。
QS0: MOV R0,#T ;指向模式串首址。
MOV R6,M ;准备将模式串全部元素参与比较。
MOV R4,DPH ;保存主串当前的匹配起始位置。
MOV R5,DPL
QS1: MOVX A,@DPTR ;读取主串的一个元素。
XRL A,@R0 ;和模式串的一个元素进行比较。
JNZ QS2 ;不相同,本次匹配失败。
INC R0 ;相同,指向模式串的下一个元素。
INC DPTR ;指向主串的下一个元素。
DEC R7 ;主串尚未参与比较的元素减少一个。
DJNZ R6,QS1 ;模式串的全部元素均比较完否?
SETB FIND ;全部比较完毕,匹配成功。
MOV DPH,R4 ;取本次匹配操作的主串起始位置。
MOV DPL,R5
RET ;由DPTR返回匹配起始位置。
QS2: CJNE R0,#T,QS3;如果不是模式串的第一个元素,主串指针不变。
INC DPTR ;如果是模式串的第一个元素,主串指针后移。
DEC R7 ;主串尚未参与比较的元素减少一个。
QS3: MOV A,R7 ;取主串尚未参与比较的元素个数。
CLR C
SUBB A,M ;和模式串的长度比较。
JNC QS0 ;不短于模式串,可以进行下一轮匹配操作。
CLR FIND ;比模式串还短,匹配失败。
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -