⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 p192_2.asm

📁 有关汇编语言的资料
💻 ASM
字号:
;p192.asm,增序正数数组中查找一个正数,折半查找。
;有则将其序号送si并送flag单元,cf←0;否则cf←1,flag单元置-1。
;*******************************************
data	segment
array	dw	10,3,5,15,23,37,49,52,65,78,99
n	dw 	32
flag	dw	0
low_idx	dw	?
hi_idx	dw	?
data	ends
;*******************************************
program	segment
main	proc	far
	assume	cs:program,ds:data,es:data
start:	push 	ds
	sub	ax,ax
	push	ax
	mov	ax,data
	mov	ds,ax		;固定模式
	mov	es,ax
	mov	ax,n		;检索对象
	mov	di,offset array	;没有offset错。
	cmp	ax,es:[di+2]
	ja	chk_la		;比首元素大,继续查找。
	lea	si,es:[di+2]	;找到,且cf=0,si为元素地址。
	je	found
	stc			
	jmp	nomatch		;cf=1,未找到。
chk_la:	mov	si,es:[di]	;di所指为元素个数。
	shl	si,1		;因为是字,所以乘2
	add	si,di		;即si指向最后元素。
	cmp	ax,es:[si]	
	jb	search		;比末元素小,继续查找。
	je	found		;找到,且cf=0,si为元素地址。
	stc
	jmp	nomatch		;cf=1,未找到。
search:	mov	low_idx,1	;low_idx←1,初值。
	mov	bx,es:[di]
	mov 	hi_idx,bx	;hi_idx←元素个数,初值。
	mov	bx,di
mid:	mov	cx,low_idx	;新左端。
	mov	dx,hi_idx	;新右端。
	cmp	cx,dx		
	ja	nomatch		;左端超过右端,即未找到。
	add	cx,dx		;折半。
	shr	cx,1		;(左端+右端)/2。
	mov	si,cx
	shl	si,1
compare:cmp	ax,es:[bx+si]	;和中间的比较。
	je	found		;相等,找到。
	ja	higher		
	dec	cx		;在低一半。
	mov	hi_idx,cx	;中端作右端。
	jmp	mid
higher:	inc	cx		;在高一半。
	mov	low_idx,cx	;中端作左端。
	jmp	mid
nomatch:mov	flag,-1
	stc
	ret
found:	mov 	flag,si
	ret
main	endp
program	ends
	end start

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -