diff options
Diffstat (limited to 'private/crt32/string/i386/strlen.asm')
-rw-r--r-- | private/crt32/string/i386/strlen.asm | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/private/crt32/string/i386/strlen.asm b/private/crt32/string/i386/strlen.asm new file mode 100644 index 000000000..4ea531018 --- /dev/null +++ b/private/crt32/string/i386/strlen.asm @@ -0,0 +1,84 @@ + page ,132 + title strlen - return the length of a null-terminated string +;*** +;strlen.asm - contains strlen() routine +; +; Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved. +; +;Purpose: +; strlen returns the length of a null-terminated string, +; not including the null byte itself. +; +;Revision History: +; 04-21-87 SKS Rewritten to be fast and small, added file header +; 05-18-88 SJM Add model-independent (large model) ifdef +; 08-02-88 SJM Add 32 bit code, use cruntime vs cmacros +; 08-23-88 JCR 386 cleanup +; 10-05-88 GJF Fixed off-by-2 error. +; 10-10-88 JCR Minor improvement +; 10-25-88 JCR General cleanup for 386-only code +; 10-26-88 JCR Re-arrange regs to avoid push/pop ebx +; 03-23-90 GJF Changed to _stdcall. Also, fixed the copyright. +; 05-10-91 GJF Back to _cdecl, sigh... +; +;******************************************************************************* + + .xlist + include cruntime.inc + .list + +page +;*** +;strlen - return the length of a null-terminated string +; +;Purpose: +; Finds the length in bytes of the given string, not including +; the final null character. +; +; Algorithm: +; int strlen (const char * str) +; { +; int length = 0; +; +; while( *str++ ) +; ++length; +; +; return( length ); +; } +; +;Entry: +; const char * str - string whose length is to be computed +; +;Exit: +; AX = length of the string "str", exclusive of the final null byte +; +;Uses: +; CX, DX +; +;Exceptions: +; +;******************************************************************************* + + CODESEG + + public strlen +strlen proc \ + uses edi, \ + string:ptr byte + + mov edi,string ; edi -> string + xor eax,eax ; null byte + or ecx,-1 ; set ecx to -1 +repne scasb ; scan for null, ecx = -(1+strlen(str)) + not ecx + dec ecx ; ecx = strlen(str) + mov eax,ecx ; eax = strlen(str) + +ifdef _STDCALL_ + ret DPSIZE ; _stdcall return +else + ret ; _cdecl return +endif + +strlen endp + end |