summaryrefslogtreecommitdiffstats
path: root/private/crt32/string/i386/strcmp.asm
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/string/i386/strcmp.asm')
-rw-r--r--private/crt32/string/i386/strcmp.asm104
1 files changed, 104 insertions, 0 deletions
diff --git a/private/crt32/string/i386/strcmp.asm b/private/crt32/string/i386/strcmp.asm
new file mode 100644
index 000000000..6024848b5
--- /dev/null
+++ b/private/crt32/string/i386/strcmp.asm
@@ -0,0 +1,104 @@
+ page ,132
+ title strcmp.asm - compare two strings
+;***
+;strcmp.asm - routine to compare two strings (for equal, less, or greater)
+;
+; Copyright (c) 1985-1991, 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).
+;
+;Revision History:
+; 04-21-87 SKS Module rewritten to be fast and small
+; 05-17-88 SJM Add model-independent (large model) ifdef
+; 08-04-88 SJM convert to cruntime/ add 32-bit support
+; 08-23-88 JCR Minor 386 cleanup
+; 10-25-88 JCR General cleanup for 386-only code
+; 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
+;***
+;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
+
+ .lall
+
+ public strcmp
+strcmp proc \
+ uses edi esi, \
+ src:ptr byte, \
+ dst:ptr byte
+
+
+ mov esi,[src] ; si = source
+ xor eax,eax ; mingle register instr with mem instr.
+ mov edi,[dst] ; di = dest
+
+ or ecx,-1 ; cx = -1
+ repne scasb ; compute length of "dst"
+ not ecx ; CX = strlen(dst)+1
+ sub edi,ecx ; restore DI = dst
+ repe cmpsb ; compare while equal, at most length of "dst"
+ je short toend ; dst == src? (AX = 0)
+ ; dst < src dst > src
+ sbb eax,eax ; AX=-1, CY=1 AX=0, CY=0
+ sbb eax,-1 ; AX=-1 AX=1
+toend:
+
+ifdef _STDCALL_
+ ret 2*DPSIZE ; _stdcall return
+else
+ ret ; _cdecl return
+endif
+
+strcmp endp
+ end