You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
3.3 KiB
163 lines
3.3 KiB
page ,132
|
|
title strcmp.asm - compare two strings
|
|
;***
|
|
;strcmp.asm - routine to compare two strings (for equal, less, or greater)
|
|
;
|
|
; Copyright (c) 1985-2001, 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...
|
|
; 05-26-93 GJF Tuned for the 486.
|
|
; 06-14-93 GJF Testing wrong byte of ax against 0 in one case.
|
|
; 06-16-93 GJF Added .FPO directive.
|
|
; 06-12-01 PML inc->add 1, dec->sub 1 for Pentium 4 perf (vs7#267015)
|
|
;
|
|
;*******************************************************************************
|
|
|
|
.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
|
|
add eax,1
|
|
ret
|
|
|
|
align 4
|
|
dopartial:
|
|
test edx,1
|
|
jz short doword
|
|
|
|
mov al,[edx]
|
|
add edx,1
|
|
cmp al,[ecx]
|
|
jne short donene
|
|
add ecx,1
|
|
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
|