102 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			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
 |