[汇编版]二分查找法
二分查找法(Binary Search)大家都很熟悉,我就不介绍算法了,下面是我用汇编实现的二分查找法,采用的编译环境是Visual Studio2008,部署环境请参考<用Visual Studio 2008编写Win32汇编程序>。
TITLE Binary Search
.386
.MODEL flat,stdcall
ExitProcess PROTO, dwExitCode:DWORD
.data
Numbers DWORD 1,3,7,9,12,13,34,35,88,999,1011,1013
LEN DWORD ($-Numbers)/4
.code
main PROC
mov EBX, OFFSET Numbers
mov ECX, LEN
mov EDX,3
call BinarySearch
main ENDP
;----------------------------------
BinarySearch PROC
;Search specific value from the array through binary search, return the index
;Receive: EBX is a pointer that point to the array, ECX is the len of array,
; EDX is the value that we try to find out
;Return: EAX is the index of the searched value
;----------------------------------
push ECX
push ESI
push EDI
;check parameters
CMP EBX,0
JZ FAIL
CMP ECX,0
JZ FAIL
;ESI will be used as the head index of the searched array, EDI will be used as the tail index of the searched array
mov ESI,0
mov EDI,ECX
Dec EDI
;Begin to search
;ECX will be used as the middle index, it is equal (ESI+EDI)/2;
;EAX will be used as the value that ECX point to
L1:
mov ECX,0
mov ECX,ESI
add ECX,EDI
SAR ECX,1
mov EAX,[EBX+ECX*4]
CMP EAX,EDX
JZ SUCCESS
;If ESI==EDI,and the search value haven't found out, go to FAIL
CMP ESI,EDI
JZ FAIL
CMP EAX,EDX
JG GREATER
;if EAX<EDX
Mov ESI,ECX
Inc ESI
jmp L1
;if EAX>EDX
GREATER:
MOV EDI,ECX
Dec ESI
jmp L1
SUCCESS:
Mov EAX,ECX
jmp FINISH
FAIL:
Mov EAX,-1
jmp FINISH
FINISH:
pop EDI
pop ESI
pop ECX
ret
BinarySearch ENDP
END main
声明
本文为Binhua Liu原创作品。本文允许复制,修改,传递,但不允许用于商业用途。转载请注明出处。本文发表于2010年7月14日。