data segment
shuzu db 1,5,8,14,15,16,17,18,19,20, 21 dup(18h)
ends
code segment
assume: cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov es,ax
mov ah,1 ;输入第一位
int 21h
mov ah,10
sub al,'0' ;存放的是ASCII码,减0变成十进制
mul ah ;第1位乘10才是十位
mov dh,al ;先把十位放到dh
mov ah,1 ;输入第二位
int 21h
sub al,'0'
add dh,al ;十位和个位相加,放到dh中
lea bx,shuzu
mov cx,10 ;cx放的是最大数的下标
mov ax,0 ;ax放最小数的下标
L1: cmp ax,cx ;如果ax比dx大,说明最小数的下标移动到最大的后面去了
jg L3 ;没有找到
mov di,ax
add di,cx
sar di,1 ;di是中间数的坐标,(ax+cx)/2
cmp dh,shuzu[bx+di]
jz L4 ;找到了该字符
cmp dh,shuzu[bx+di]
jb L2 ;比中间数小的情况
add di,1 ;比中间数大的情况,最小的下标加1再乘2
mov ax,di
jmp L1
L2: sub di,1 ;类似最大的下标减1再除以2
mov cx,di ;实质是最大的下标跳到中间
jmp L1
L3: mov dl,'N'
jmp L5 ;再结束
L4: mov dl,'Y'
L5: mov ah,2
int 21h
ends
end start