二分查找(汇编 asm)

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

注:本博客参照了此博客,在此基础上进行了更改。
有问题,欢迎交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值