cmpstri.asm

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

ASM
82
字号
; #########################################################################

    .486
    .model flat, stdcall
    option casemap :none   ; case sensitive

    .code

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

cmpsi proc src:DWORD, dst:DWORD, ln:DWORD

  ; -----------------------------------------------------------
  ; algorithm compares any two byte sequences CASE INSENSITIVE
  ; and returns zero if they are identical or the character
  ; count where the two byte sequences mismatch.
  ; -----------------------------------------------------------

    push ebx
    push esi
    push edi

    jmp @F
    align 16
  table:
    db   0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15
    db  16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31
    db  32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47
    db  48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63
    db  64, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111
    db 112,113,114,115,116,117,118,119,120,121,122, 91, 92, 93, 94, 95
    db  96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110,111
    db 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127
    db 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143
    db 144,145,146,147,148,149,150,151,152,153,154,155,156,156,158,159
    db 160,161,162,163,164,165,166,167,168,169,170,171,172,173,173,175
    db 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191
    db 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207
    db 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223
    db 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239
    db 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255
  @@:

    lea ebx, table      ; table base address
    mov esi, src        ; 1st string in ESI
    mov edi, dst        ; 2nd string in EDI
    mov ecx, ln         ; length in ECX
    add ecx, esi        ; add ESI to get exit condition

  @@:
    mov al, [esi]       ; get 1st byte
    inc esi
    xlatb               ; replace it with byte in table
    mov ah, al          ; store it in AH
    mov al, [edi]       ; get 2nd byte
    inc edi
    xlatb               ; replace it with byte in table
    cmp ah, al          ; compare if equal
    jne @F              ; jump out if not equal
    cmp esi, ecx        ; exit on length
    jl @B
  @@:

    sub esi, src

    .if esi == ln
      xor eax, eax
    .else
      mov eax, esi
    .endif

    pop edi
    pop esi
    pop ebx

    ret

cmpsi endp

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

    end

⌨️ 快捷键说明

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