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