汇编学习笔记->二分查找

编译环境:emu8086
附:汇编常用跳转指令及其检测位
https://blog.csdn.net/c529283955/article/details/103015482

使用二分查找在给定的有序数组中查找特定元素

若找到则输出Found,否则输出Not Found

datas segment
    n db 9
    num db -60,-30,0,6,10,30,76,90,126
    info1 db 'Found.$'
    info2 db 'Not found.$'
    left db 0
    right db 0
    two db 2
    focusNum db 6    
datas ends

codes segment
    assume cs:codes,ds:datas,es:datas;
start:
    ;标准开局    
    mov ax,datas
    mov ds,ax
    mov es,ax
    
    mov dl,focusNum;设置目标数字 
    
    ;设置左右区间,使用left,right变量存储,用bx存储数组首地址
    mov al,0
    mov left,al
    mov al,n
    mov right,al
    lea bx,num
    
binaryFunc:     ;二分函数,将在此处将目标数与middleNum进行比较
    mov ah,0    ;将ah置0,以便使用div指令
    mov al,right;al=right
    add al,left ;al=left+right
    div two     ;ax /= 2,由于除数two是8位的,因此ax/2的余数 放在ah,商放在al中
    mov ah,0    ;将余数清零
    mov si,ax   ;si标记区间中部middle
    ;middle=al=(left+right)/2
    cmp dl,bx[si];目标数与middleNum比较
    jz found
    jl smaller;focusNum is smaller than the middleNum
    jg bigger ;focusNum is bigger than the middleNum
smaller:
    dec al       ;因为已经和middle比较过了,将区间缩小 ,区间相当于[left,middle-1] ,也可以说相当于[left,middle)
    mov right,al ;更新区间右端点
    cmp al,left  ;比较左右端点是否相等
    jne binaryFunc     ;不相等,继续跳转到二分函数binaryFunc
    jmp singleCompare  ;相等,因此只需比较单个值  
bigger:
    inc al       ;因为已经和middle比较过了,将区间缩小 ,区间相当于[middle+1,right] ,也可以说相当于(middle,rihgt]
    mov left,al  ;更新区间左端点
    cmp al,right
    jne binaryFunc
    jmp singleCompare
singleCompare:
    mov si,ax    ;欲取出al(8),但不可直接mov si,al。又因为ah=0,所以取出ax(16)si(16)结果是相等的
    cmp dl,bx[si]
    je found
    jne notfound
found:
    lea dx,info1
    jmp print
notfound:
    lea dx,info2
    jmp print
print:
    mov ah,09h   ;调用Dos功能,输出字符串
    int 21h
    ;exit
    mov ah,4ch
    int 21h            
codes ends
end start
    

由于使用了变量来存储区间的左右端点,因此对寄存器的处理大幅简化(妈妈再也不用担心不够寄存器用了 )

发布了19 篇原创文章 · 获赞 2 · 访问量 4190

猜你喜欢

转载自blog.csdn.net/c529283955/article/details/103139336