[汇编版]二分查找法

[汇编版]二分查找法

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日。

转载于:https://www.cnblogs.com/Binhua-Liu/archive/2010/07/14/1777084.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
汇编语言是一种低级语言,可以直接操作计算机硬件。实现二分查找汇编语言代码如下: ``` section .data array db 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 array_size equ $ - array section .text global _start _start: mov eax, 0 ; 左边界 mov ebx, array_size ; 右边界 mov ecx, 5 ; 要查找的元素 binary_search: cmp eax, ebx ; 检查左右边界是否交叉 jg not_found ; 如果左边界大于右边界,则未找到 mov edx, eax ; 计算中间位置 add edx, ebx shr edx, 1 mov al, byte [array + edx] ; 获取中间位置的元素 cmp al, cl ; 比较中间位置的元素与要查找的元素 je found ; 如果相等,则找到了 jl move_right ; 如果中间位置的元素小于要查找的元素,则向右移动左边界 jg move_left ; 如果中间位置的元素大于要查找的元素,则向左移动右边界 move_right: inc eax jmp binary_search move_left: dec ebx jmp binary_search found: ; 找到了,可以在这里进行相应的处理 jmp exit not_found: ; 未找到,可以在这里进行相应的处理 exit: ; 程序退出 mov eax, 1 xor ebx, ebx int 0x80 ``` 上述代码使用了一个有序数组进行二分查找。首先,将左边界`eax`设置为0,右边界`ebx`设置为数组的大小。然后,将要查找的元素`ecx`设置为5。接下来,使用循环进行二分查找,直到找到目标元素或者左右边界交叉。在每次循环中,计算中间位置并获取中间位置的元素进行比较。如果中间位置的元素等于要查找的元素,则找到了;如果中间位置的元素小于要查找的元素,则向右移动左边界;如果中间位置的元素大于要查找的元素,则向左移动右边界。最后,根据是否找到目标元素进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值