DATA SEGMENT
BUF DB 1, 2, 3, 4, 5, 6, 7, 8, 9
X DB 3
MID DB ?
Y DB ? ;Y:保存查找成功时元素的偏移位置。
SSTR DB 'no find','$'
DATA ENDS
;--------------------------
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
;------------
LEA SI,BUF ;SI:保存BUF存储区中最小元素的偏移地址;
MOV CX,X-BUF ;CX:存放数组的长度;
MOV BX,CX
DEC BX
MOV DI,BX ;DI:保存BUF存储区中最大元素的偏移地址;
MOV AL,X ;AL:保存要查找的数据X:
CMP AL,BUF[SI]
JL DONE ;小于
CMP AL,BUF[DI]
JG DONE ;大于
NEXT : ROR CX,1 ;偶数
JNC NEXT1
DEC CX
SHR CX,1 ;除以2
NEXT1: XOR BL,BL
CBW
MOV BL,[BUF+SI+CX] ;BL:存放BUF存储区中的中间元素;
CMP AL,BL
JZ NEXT2 ;相等
JG NEXT3 ;大于
SUB DI,CX
NEXT4: CMP SI,DI
JG DONE
SUB DI,SI
MOV CX,DI
JMP NEXT
NEXT3: ADD SI,CX
JMP NEXT4
NEXT2: ADD CX,SI
MOV Y ,CL
JMP DOS
DONE: MOV Y,-1
DOS: CMP Y,-1
JZ NEXT5 ;相等转移
MOV DL,Y ;把Y的ASCLL码放到DX中,用除以10取余加上48得到。
MOV BL,10
DIV BL
ADD AH,48
MOV DL,AH
MOV AX,0
MOV AH,2
INT 21H
JMP NEXT6
NEXT5: MOV DX,OFFSET SSTR ;没找到情况给出提示
MOV AX,0
MOV AH,9
INT 21H
NEXT6: MOV AH,4CH
INT 21H
CODE ENDS
END START
折半查找。结果总是 no find。始终执行NEXT5 是怎么回事???如果去掉next5可以正常显示结果。
。。。。。。。。。。。。JMP