?? bfsrch.asm
字號:
;直觀的模式匹配算法(BF算法)。
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 BFSRCH ;匹配成功,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 BFSRCH ;匹配失敗,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."
BFSRCH: MOV DPTR,#S ;指向主串首址。
MOV A,N ;取主串長度。
CLR C
SUBB A,M ;減去模式串的長度。
INC A ;加一。
MOV R7,A ;得到最大匹配操作遍數。
BF0: MOV R0,#T ;指向模式串首址。
MOV R6,M ;準備將模式串全部元素參與比較。
MOV R4,DPH ;保存主串當前的匹配起始位置。
MOV R5,DPL
BF1: MOVX A,@DPTR ;讀取主串的一個元素。
XRL A,@R0 ;和模式串的一個元素進行比較。
JNZ BF2 ;不相同,本次匹配失敗。
INC R0 ;相同,指向模式串的下一個元素。
INC DPTR ;指向主串的下一個元素,準備繼續比較。
DJNZ R6,BF1 ;模式串的全部元素均比較完否?
SETB FIND ;全部比較完畢,匹配成功。
MOV DPH,R4 ;取本次匹配操作的主串起始位置。
MOV DPL,R5
RET ;由DPTR返回匹配起始位置。
BF2: MOV DPH,R4 ;主串指針回到本次匹配操作的起始位置。
MOV DPL,R5
INC DPTR ;后移一個元素,準備進行下一輪匹配操作。
DJNZ R7,BF0 ;如未達到最大匹配操作次數,則進行下一輪匹配。
CLR FIND ;全部匹配操作次數已經用完,匹配失敗。
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -