2025-04-27 07:49:33 -04:00

102 lines
2.2 KiB
NASM

page ,132
title memcmp - compare to blocks of memory
;***
;memcmp.asm - compare two blocks of memory
;
; Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved.
;
;Purpose:
; defines memcmp() - compare two memory blocks lexically and
; find their order.
;
;Revision History:
; 05-16-83 RN initial version
; 07-20-87 SKS rewritten for speed
; 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 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
;***
;int memcmp(buf1, buf2, count) - compare memory for lexical order
;
;Purpose:
; Compares count bytes of memory starting at buf1 and buf2
; and find if equal or which one is first in lexical order.
;
; Algorithm:
; int
; memcmp (buf1, buf2, count)
; char *buf1, *buf2;
; unsigned count;
; {
; if (!count)
; return(0);
; while (--count && *buf1 == *buf2)
; {
; buf1++;
; buf2++;
; }
; return(*buf1 - *buf2);
; }
;
;Entry:
; char *buf1, *buf2 - pointers to memory sections to compare
; unsigned count - length of sections to compare
;
;Exit:
; returns -1 if buf1 < buf2
; returns 0 if buf1 == buf2
; returns +1 if buf1 > buf2
;
;Uses:
;
;Exceptions:
;
;*******************************************************************************
CODESEG
public memcmp
memcmp proc \
uses edi esi, \
buf1:ptr byte, \
buf2:ptr byte, \
count:IWORD
mov esi,buf1 ; si = buf1
mov edi,buf2 ; di = buf2
;
; choose ds:si=buf1 and es:di=buf2 so that the CARRY flag
; gets the right way by the REP CMPSB instruction below.
;
xor eax,eax
mov ecx,count
jecxz short done
repe cmpsb ; compare while equal, at most "count" bytes
je short done ; buf1 == buf2? (AX = 0)
; buf1 < buf2 buf1 > buf2
sbb eax,eax ; AX=-1, CY=1 AX=0, CY=0
sbb eax,-1 ; AX=-1 AX=1
done:
ifdef _STDCALL_
ret 2*DPSIZE + ISIZE ; _stdcall return
else
ret ; _cdecl return
endif
memcmp endp
end