bsearch.asm

来自「工欲善其事」· 汇编 代码 · 共 87 行

ASM
87
字号
; #########################################################################

    .486                      ; create 32 bit code
    .model flat, stdcall      ; 32 bit memory model
    option casemap :none      ; case sensitive

    .code

;##########################################################################

BinSearch proc startpos:DWORD,source:DWORD,lnsrc:DWORD,
                pattern :DWORD,lnpatn:DWORD

    push ebx
    push esi
    push edi

    mov edi, pattern
    mov al, [edi]       ; get 1st byte

    mov esi, source
    mov ecx, lnsrc
    add esi, ecx
    neg ecx
    add ecx, startpos

    dec lnpatn

    jmp main_loop

  ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%

  pre_loop:
    pop ecx
    inc ecx

  main_loop:
  ; ------------
  ; unroll by 2
  ; ------------
    cmp al, [esi+ecx]
    je pre_sub
    inc ecx
    jz nMatch

    cmp al, [esi+ecx]
    je pre_sub
    inc ecx
    jnz main_loop
  ; ------------
    jmp nMatch

  pre_sub:
    push ecx
    mov edi, pattern
    sub edi, ecx
    mov ebx, lnpatn

  sub_loop:
    mov ah, [esi+ecx+1]
    cmp ah, [edi+ecx+1]
    jne pre_loop
    inc ecx
    dec ebx
    jnz sub_loop

  ; %%%%%%%%%%%%%%%%%%%%%%%%%%%%

    pop eax
    add eax, lnsrc
    jmp Outa_Here

  nMatch:
    mov eax, -1

  Outa_Here:
    pop edi
    pop esi
    pop ebx

    ret

BinSearch endp

; #########################################################################

    end

⌨️ 快捷键说明

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