汇编——折半查找

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
    

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值