assume cs:code,ds:data
data segment
arr db -40,-30,-9,0,1,3,4,6,9,10 ;排好顺序的数组
len equ $-arr;数组长度
str1 db 'Found.$'
str2 db 'Not Found.$'
left dw 0;左边界
right dw 0;右边界
two dw 2; 求 middle 是需要两数之和除以2,这个变量就是分母2
find_num db -1;待查找的数
data ends
code segment
start:
mov ax,data
mov ds,ax
;初始 left 为 0
mov ax,0
mov left,ax
;初始 right 为 数组最后一个元素位置
mov ax,len-1
mov right,ax
;查找函数
fun:
mov dx,0 ;存放 div 的余数
;求两数之和
mov ax,right
add ax,left
div two
; 由于 two 为 16位 , 则 div的结果 ax存放商,dx存放余数
;ax就是我们要的 middle : (left+right)/2
mov si,ax;将 ax 赋值给 si
mov al,find_num; 临时把 find_num 赋值给 al,便于比较
cmp al,arr[si];比较中间数与代查找的数
jz found;相等说明找到了
jl smaller; find_num 在中间数左边
jg bigger; find_num 在中间数的右边
smaller:
mov ax,si; 将 ax 的值变回原来的数字 即 (right+left)/2
dec ax;ax-1
mov right,ax;find_num 比中间数小,说明在数组左半部分,将 ax(middle)赋给右边界
cmp ax,left;左右边界是否重合
jne fun;不重合继续进行查找
jmp compare ;重合只需要再简单的比较一下
bigger:
;与上面 smaller 思路一样
mov ax,si
inc ax
mov left,ax
cmp ax,right
jne fun
jmp compare
compare:
;比较,跟上上述思路一样
mov si,ax
mov al,find_num
cmp al, arr[si]
;左右边界已经重合,结果要么相等,要么不相等,不会再进行查找了
je found
jne notfound
; 后面就是一些简单的输出
found:
lea dx,str1
jmp exit
notfound:
lea dx,str2
jmp exit
exit:
mov ah,9
int 21h
mov ax,4c00h
int 21h
code ends
end start
注:本博客参照了此博客,在此基础上进行了更改。
有问题,欢迎交流