?? 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個字節(jié)。
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 ;結(jié)束。
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 ;取主串尚未參與比較的元素個數(shù)。
CLR C
SUBB A,M ;和模式串的長度比較。
JNC QS0 ;不短于模式串,可以進行下一輪匹配操作。
CLR FIND ;比模式串還短,匹配失敗。
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -