Results 1 to 3 of 3

Thread: strcmp

  1. #1
    jim mcnamara
    Guest
    Here's MS code from the runtime strcmp module:
    Code:
    ***
    ;strcmp.asm - routine to compare two strings (for equal, less, or greater)
    ;
    ;       Copyright (c) 1985-1997, Microsoft Corporation. All rights reserved.
    ;
    ;Purpose:
    ;       STRCMP compares two strings and returns an integer
    ;       to indicate whether the first is less than the second, the two are
    ;       equal, or whether the first is greater than the second, respectively.
    ;       Comparison is done byte by byte on an UNSIGNED basis, which is to
    ;       say that Null (0) is less than any other character (1-255).
    ;
    ;*******************************************************************************
    
            .xlist
            include cruntime.inc
            .list
    
    page
    ;***
    ;strcmp - compare two strings, returning less than, equal to, or greater than
    ;
    ;Purpose:
    ;       Compares two string, determining their lexical order.  Unsigned
    ;       comparison is used.
    ;
    ;       Algorithm:
    ;          int strcmp ( src , dst )
    ;                  unsigned char *src;
    ;                  unsigned char *dst;
    ;          {
    ;                  int ret = 0 ;
    ;
    ;                  while( ! (ret = *src - *dst) && *dst)
    ;                          ++src, ++dst;
    ;
    ;                  if ( ret < 0 )
    ;                          ret = -1 ;
    ;                  else if ( ret > 0 )
    ;                          ret = 1 ;
    ;
    ;                  return( ret );
    ;          }
    ;
    ;Entry:
    ;       const char * src - string for left-hand side of comparison
    ;       const char * dst - string for right-hand side of comparison
    ;
    ;Exit:
    ;       AX < 0, 0, or >0, indicating whether the first string is
    ;       Less than, Equal to, or Greater than the second string.
    ;
    ;Uses:
    ;       CX, DX
    ;
    ;Exceptions:
    ;
    ;*******************************************************************************
    
            CODESEG
    
            public  strcmp
    strcmp  proc
    
            .FPO    ( 0, 2, 0, 0, 0, 0 )
    
            mov     edx,[esp + 4]   ; edx = src
            mov     ecx,[esp + 8]   ; ecx = dst
    
            test    edx,3
            jnz     short dopartial
    
            align   4
    dodwords:
            mov     eax,[edx]
    
            cmp     al,[ecx]
            jne     short donene
            or      al,al
            jz      short doneeq
            cmp     ah,[ecx + 1]
            jne     short donene
            or      ah,ah
            jz      short doneeq
    
            shr     eax,16
    
            cmp     al,[ecx + 2]
            jne     short donene
            or      al,al
            jz      short doneeq
            cmp     ah,[ecx + 3]
            jne     short donene
            add     ecx,4
            add     edx,4
            or      ah,ah
            jnz     short dodwords
    
            align   4
    doneeq:
            xor     eax,eax
            ret
    
            align   4
    donene:
            ; The instructions below should place -1 in eax if src < dst,
            ; and 1 in eax if src > dst.
    
            sbb     eax,eax
            sal     eax,1
            inc     eax
            ret
    
            align   4
    dopartial:
            test    edx,1
            jz      short doword
    
            mov     al,[edx]
            inc     edx
            cmp     al,[ecx]
            jne     short donene
            inc     ecx
            or      al,al
            jz      short doneeq
    
            test    edx,2
            jz      short dodwords
    
    
            align   4
    doword:
            mov     ax,[edx]
            add     edx,2
            cmp     al,[ecx]
            jne     short donene
            or      al,al
            jz      short doneeq
            cmp     ah,[ecx + 1]
            jne     short donene
            or      ah,ah
            jz      short doneeq
            add     ecx,2
            jmp     short dodwords
    
    strcmp  endp
    
            end

  2. #2
    New Member
    Join Date
    Sep 2001
    Location
    London, UK
    Posts
    7
    Tell me what you think?

    _strcmp proc STDCALL wrd1:dword, wrd2:dword
    mov ecx, wrd1
    mov edx, wrd2
    xor eax, eax

    @@lop:
    mov bl, byte ptr [ecx]
    mov bh, byte ptr [edx]
    cmp bl, bh
    jne @@err
    cmp bl, 0
    je @@done
    cmp bh, 0
    je @@done
    inc ecx
    inc edx
    jmp @@lop

    @@err:
    ret

    @@done:
    mov eax, 1
    ret

    _strcmp endp

  3. #3
    Hyperactive Member Warmaster199's Avatar
    Join Date
    Aug 2000
    Location
    Canada
    Posts
    306
    Using GNU Inline Assembler(Taken from LINUX)

    extern inline int strcmp(const char * cs,const char * ct)
    {
    register int __res __asm__("ax");
    __asm__("cld\n"
    "1:\tlodsb\n\t"
    "scasb\n\t"
    "jne 2f\n\t"
    "testb %%al,%%al\n\t"
    "jne 1b\n\t"
    "xorl %%eax,%%eax\n\t"
    "jmp 3f\n"
    "2:\tmovl $1,%%eax\n\t"
    "jb 3f\n\t"
    "negl %%eax\n"
    "3:"
    :"=a" (__res):"D" (cs),"S" (ct):"si","di");
    return __res;
    }
    Designer/Programmer of the Comtech Operating System(CTOS)

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width