Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Utility / TEXT / TextEqu

Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM


TextEqu - Porovnání textů na shodu

Funkce TextEqu porovná dva texty na shodu s rozlišením velkých a malých písmen.


; -----------------------------------------------------------------------------
;                     Compare text strings to equality
; -----------------------------------------------------------------------------
; INPUT:	EAX = first text string TEXT
;		EBX = second text string TEXT
; OUTPUT:	CY = string are not equal
; NOTES:	Comparison is case sensitive.
; -----------------------------------------------------------------------------

Na vstupu funkce obsahuje registr EAX ukazatel na první textovou proměnnou a registr EBX ukazatel na druhou textovou proměnnou. Pokud texty nejsou přesně shodné, navrátí funkce nastavený příznak CY.


; ------------- Push registers

TextEqu:	push	eax		; push EAX
		push	ecx		; push ECX
		push	esi		; push ESI
		push	edi		; push EDI

; ------------- Prepare pointers to text strings

		mov	esi,[eax]	; ESI <- data buffer of first text
		mov	edi,[ebx]	; EDI <- data buffer of second text
		cmp	esi,edi		; compare data buffers
		je	TextEqu8	; string are identical

Na začátku funkce se připraví ukazatele na datové buffery prvního a druhého textu. Pokud jsou ukazatele shodné, jedná se o identický text a funkce se rychle ukončí s příznakem NC.


; ------------- Compare length of strings

		mov	eax,[esi+TEXT_Length] ; EAX <- length of first text
		cmp	eax,[edi+TEXT_Length] ; compare length of strings
		jne	TextEqu6	; strings have different length

Porovnají se délky textů - pokud se liší, texty nejsou shodné a funkce se ukončí s nastaveným příznakem CY.


; ------------- Prepare pointers to compare strings

		add	esi,TEXT_Text	; ESI <- start of first text
		add	edi,TEXT_Text	; EDI <- start of second text

; ------------- Compare strings (here is NC)

		mov	ecx,eax		; ECX <- length of strings
		jecxz	TextEqu8	; empty strings are equal (here is NC)
		shr	ecx,2		; ECX <- length of strings in DWORD
		repe	cmpsd		; compare strings in DWORD
		jne	TextEqu6	; string are not equal
		and	eax,byte 3	; EAX <- length in last DWORD
		jz	TextEqu8	; strings are equal
		xchg	eax,ecx		; ECX <- length in last DWORD
		repe	cmpsb		; compare string in last DWORD
		je	TextEqu8	; strings are equal

; ------------- Pop registers

TextEqu6:	stc			; set error flag
TextEqu8:	pop	edi		; pop EDI
		pop	esi		; pop ESI
		pop	ecx		; pop ECX
		pop	eax		; pop EAX
		ret

Ukazatele se posunou na začátky textů a provede se porovnání textů, v případě rozdílu se navrátí nastavený příznak CY.


Obsah / Utility / TEXT / TextEqu