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