编译环境: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