[汇编版]二分查找法

[汇编版]二分查找法

Binhua Liu

blogicon_011_thumb

    二分查找法(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

 

blogicon_011_thumb声明

    本文为Binhua Liu原创作品。本文允许复制,修改,传递,但不允许用于商业用途。转载请注明出处。本文发表于2010年7月14日。

posted @ 2010-07-14 11:09  Binhua Liu  阅读(1917)  评论(0编辑  收藏  举报