⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bfsrch.asm

📁 在定时器中断中做LED的PWM输出 AT89C2051实现A/D转换的C51程序 单片机开发系统 指令系统 程序设计 定时与中断 系统扩展 接口技术 串行口
💻 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 + -