📄 fdd2.asm
字号:
;入口条件:查找内容在R4、R5中,表格首址在DPTR中,数据个数在R7中。
;出口信息:OV=0 时顺序号在累加器A中,址在DPTR中 ;OV=1 时未找到。
;影响资源:PSW、A、B、R1~R7、DPTR 堆栈需求: 2字节
FDD2: MOV R2,#0 ;区间低端指针初始化(指向第一个数据)
MOV A,R7
DEC A
MOV R3,A ;区间高端指针初始化,指向最后一个数据
MOV R6,DPH ;保存表格首址
MOV R7,DPL
FD81: CLR C ;判断区间大小
MOV A,R3
SUBB A,R2
JC FD89 ;区间消失,查找失败
RRC A ;取区间大小的一半
ADD A,R2 ;加上区间的低端
MOV R1,A ;得到区间的中心
MOV DPH,R6
CLR C ;计算区间中心的地址
RLC A
JNC FD82
INC DPH
FD82: ADD A,R7
MOV DPL,A
JNC FD83
INC DPH
FD83: CLR A ;读取该点的内容的高字节
MOVC A,@A+DPTR
MOV B,R4 ;与待查找内容的高字节比较
CJNE A,B,FD84 ;不相同
MOV A,#1 ;读取该点的内容的低字节
MOVC A,@A+DPTR
MOV B,R5
CJNE A,B,FD84 ;与待查找内容的低字节比较
MOV A,R1 ;取顺序号
CLR OV ;查找成功
RET
FD84: JC FD86 ;该点的内容比待查找的内容大否?
MOV A,R1 ;偏大,取该点位置
DEC A ;减一
MOV R3,A ;作为新的区间高端
SJMP FD81 ;继续查找
FD86: MOV A,R1 ;偏小,取该点位置
INC A ;加一
MOV R2,A ;作为新的区间低端
SJMP FD81 ;继续查找
FD89: MOV DPH,R6 ;相同,恢复首址
MOV DPL,R7
SETB OV ;查找失败
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -