📄 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 + -