CRT 的源码分为三部分:

  1. c — C 语言实现
  2. cpp — C++ 实现
  3. asm — 性能优化的汇编版本

strcat

char * __cdecl strcat (
                        char * dst,
                        const char * src
                        )
                {
                        char * cp = dst;
                
                        while( *cp )
                                cp++;                   /* find end of dst */
                
                        while( *cp++ = *src++ ) ;       /* Copy src to end of dst */
                
                        return( dst );                  /* return dst */
                
                }

strcmp

int __cdecl strcmp (
                        const char * src,
                        const char * dst
                        )
                {
                        int ret = 0 ;
                
                        while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
                                ++src, ++dst;
                
                        if ( ret < 0 )
                                ret = -1 ;
                        else if ( ret > 0 )
                                ret = 1 ;
                
                        return( ret );
                }

strcmp asm 版本

        page    ,132
                        title   strcmp.asm - compare two strings
                ;***
                ;strcmp.asm - routine to compare two strings (for equal, less, or greater)
                ;
                ;       Copyright (c) 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.
                ;
                ;       Base Algorithm:
                ;          int strcmp ( const char *str1, const char *str2 )
                ;          {
                ;                  const unsigned char *src1 = (const unsigned char *)str1;
                ;                  const unsigned char *src2 = (const unsigned char *)str2;
                ;                  int ret = 0 ;
                ;
                ;                  while( ! (ret = *src1 - *src2) && *src2)
                ;                          ++src1, ++src2;
                ;
                ;                  if ( ret < 0 )
                ;                          ret = -1 ;
                ;                  else if ( ret > 0 )
                ;                          ret = 1 ;
                ;
                ;                  return( ret );
                ;          }
                ;
                ;Entry:
                ;       const char * src1 - string for left-hand side of comparison
                ;       const char * src2 - string for right-hand side of comparison
                ;
                ;Exit:
                ;       EAX < 0, 0, or >0, indicating whether the first string is
                ;       Less than, Equal to, or Greater than the second string.
                ;
                ;Uses:
                ;       ECX, EDX
                ;
                ;Exceptions:
                ;
                ;*******************************************************************************
                
                        CODESEG
                
                        public  strcmp
                strcmp  proc \
                        str1:ptr byte, \
                        str2:ptr byte
                
                        OPTION PROLOGUE:NONE, EPILOGUE:NONE
                
                ;       .FPO (cdwLocals, cdwParams, cbProlog, cbRegs, fUseBP, cbFrame)
                        .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
                        test    al,al
                        jz      short doneeq
                        cmp     ah,[ecx + 1]
                        jne     short donene
                        test    ah,ah
                        jz      short doneeq
                
                        shr     eax,16
                
                        cmp     al,[ecx + 2]
                        jne     short donene
                        test    al,al
                        jz      short doneeq
                        cmp     ah,[ecx + 3]
                        jne     short donene
                        add     ecx,4
                        add     edx,4
                        test    ah,ah
                        jnz     short dodwords
                
                        align   4
                doneeq:
                        xor     eax,eax
                        ret
                
                        align   8
                donene:
                        ; The instructions below should place -1 in eax if src < dst,
                        ; and 1 in eax if src > dst.
                
                        sbb     eax,eax
                        or      eax,1
                        ret
                
                        align   16
                dopartial:
                        test    edx,1
                        jz      short doword
                
                        mov     al,[edx]
                        add     edx,1
                        cmp     al,[ecx]
                        jne     short donene
                        add     ecx,1
                        test    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
                        test    al,al
                        jz      short doneeq
                        cmp     ah,[ecx + 1]
                        jne     short donene
                        test    ah,ah
                        jz      short doneeq
                        add     ecx,2
                        jmp     short dodwords
                
                strcmp  endp
                
                        end

strlen

size_t __cdecl strlen (
                        const char * str
                        )
                {
                        const char *eos = str;
                
                        while( *eos++ ) ;
                
                        return( eos - str - 1 );
                }