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

📄 blksrch.asm

📁 单片机程序设计基础 随书光盘
💻 ASM
字号:
;分块查找算法
IDLST	EQU	2000H	;索引表首址。
N	EQU	6	;有效数据块数目。
OBJH	DATA	30H	;双字节查找对象高字节存放单元。
OBJL	DATA	31H	;双字节查找对象低字节存放单元。
FIND	BIT	00H	;查找成功标志。

	ORG	0000H
	LJMP	TEST
	
	ORG	100H
TEST:	MOV	P2,#HIGH(IDLST);将模拟调试数据装入片外RAM中。
	MOV	R0,#LOW(IDLST)
	MOV	DPTR,#DATS
	MOV	R2,#60H
LOOP:	CLR	A
	MOVC	A,@A+DPTR
	MOVX	@R0,A
	INC	R0
	INC	DPTR
	DJNZ	R2,LOOP
	MOV	OBJH,#78H	;查找对象为7833H。
	MOV	OBJL,#33H
	LCALL	BLKSRCH		;执行分块查找算法,查找成功。
	MOV	OBJH,#2FH	;查找对象为2F68H。
	MOV	OBJL,#68H
	LCALL	BLKSRCH		;执行分块查找算法,查找失败。
STOP:	LJMP	STOP		;结束。

BLKSRCH:MOV	R2,#N	;取有效分块数。
	MOV	DPTR,#IDLST;指向索引表首址。
IDSRCH:	MOVX	A,@DPTR	;读取一个数据块的首址,暂存于R4R5中。
	MOV	R4,A
	INC	DPTR
	MOVX	A,@DPTR
	MOV	R5,A
	INC	DPTR
	MOVX	A,@DPTR	;读取该数据块的最大值。
	MOV	R6,A
	INC	DPTR
	MOVX	A,@DPTR
	INC	DPTR
	CLR	C
	SUBB	A,OBJL	;和查找对象比较。
	MOV	A,R6
	SUBB	A,OBJH
	JNC	IDSRCHE	;不小于查找对象,找到了进行查找的数据块。
	DJNZ	R2,IDSRCH;小于查找对象,继续比较索引表的下一项。
	CLR	FIND	;所有有效数据块的元素均小于查找对象,查找失败。
	RET
IDSRCHE:MOVX	A,@DPTR	;读取下一块的首址。
	MOV	R6,A
	INC	DPTR
	MOVX	A,@DPTR
	CLR	C
	SUBB	A,R5	;减去本块的首址,得到本块的长度。
	MOV	R7,A
	MOV	A,R6
	SUBB	A,R4
	RRC	A	;除2,得到本数据块中双字节数据元素的个数。
	MOV	R6,A
	MOV	A,R7
	RRC	A
	MOV	R7,A	;将数据元素个数存放在R6R7中。
	JZ	BLK0
	INC	R6	;调整双字节计数器的高字节。
BLK0:	MOV	DPH,R4	;指向本块首址。
	MOV	DPL,R5
BLK1:	MOVX	A,@DPTR	;读取一个数据元素。
	INC	DPTR
	MOV	R2,A
	MOVX	A,@DPTR
	INC	DPTR
	XRL	A,OBJL	;和查找对象比较。
	JNZ	BLK2	;低字节不相同,不是查找对象。
	MOV	A,R2	;低字节相同,再比较高字节。
	XRL	A,OBJH
	JZ	BLK3	;高字节也相同,找到了指定对象。
BLK2:	DJNZ	R7,BLK1	;高字节不相同,继续比较下一个数据元素。
	DJNZ	R6,BLK1
	CLR	FIND	;本块内的所有数据元素均比较完了,以失败告终。
	RET
BLK3:	MOV	A,#0FEH	;将地址指针调整到查找对象的位置。
	ADD	A,DPL
	MOV	DPL,A
	JC	BLK4
	DEC	DPH
BLK4:	SETB	FIND	;设立成功标志,DPTR中是查找对象的地址。
	RET

DATS:	DB	20H,1CH,1FH,87H	;第一块首址为201CH,最大值为1F87H。
	DB	20H,28H,30H,35H	;第二块首址为2028H,最大值为3035H。
	DB	20H,34H,54H,62H	;第三块首址为2034H,最大值为5462H。
	DB	20H,3EH,73H,05H	;第四块首址为203EH,最大值为7305H。
	DB	20H,44H,9EH,5FH	;第五块首址为2044H,最大值为9E5FH。
	DB	20H,50H,0B7H,4CH;第六块首址为2050H,最大值为0B74CH。
	DB	20H,60H,00H,00H	;虚拟的第七块首址为2060H。
	DB	05H,3AH,0FH,66H	;双字节数据区开始。
	DB	13H,0D2H,1FH,87H
	DB	15H,6DH,01H,0D9H
	DB	22H,58H,29H,7AH
	DB	30H,35H,2EH,0DH
	DB	21H,84H,30H,09H
	DB	4AH,3DH,4EH,63H
	DB	54H,62H,51H,0D6H
	DB	38H,25H,5CH,0EH
	DB	61H,8AH,73H,05H
	DB	78H,33H,7AH,26H
	DB	8FH,8AH,98H,74H
	DB	9EH,4EH,80H,91H
	DB	0B3H,34H,0AAH,92H
	DB	0A6H,5DH,9FH,39H
	DB	0A1H,96H,0B7H,4CH
	DB	0B6H,21H,0A2H,8EH
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -