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

Obsah / Utility / TEXT / TextFindWordLast, TextFindWordRev

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


TextFindWordLast, TextFindWordRev - Vyhledání posledního/předešlého slova v textu

Funkce TextFindWordLast vyhledá v textu poslední výskyt daného slova (2 bajtů). Funkce TextFindWordRev vyhledá předešlý výskyt slova (2 bajtů) od dané pozice v textu (včetně).


; -----------------------------------------------------------------------------
;                   Find 2 bytes in text in reverse direction
; -----------------------------------------------------------------------------
; INPUT:	AL = first byte of string to find
;		AH = second byte of string to find
;		EBX = pointer to TEXT
;		EDX = start offset (it can be out of range)
; OUTPUT:	EDX = offset of found bytes (or EDX = -1 if data not found)
;		CY = data not found (EDX = -1)
; NOTES:	Set EDX to TEXTBIGPOS to find last occurrence of the bytes.
; -----------------------------------------------------------------------------

; ------------- Find last occurrence of 2 bytes

TextFindWordLast:
		mov	edx,TEXTBIGPOS	; EDX <- find last occurrence

Na vstupu funkce obsahuje registr AL hodnotu prvního bajtu a registr AH hodnotu druhého bajtu k vyhledání. Registr EBX obsahuje ukazatel na textovou proměnnou s textem k prohledání. Registr EDX obsahuje počáteční offset v textu, od kterého budou bajty vyhledávány. V případě funkce TextFindWordLast je obsah registru EDX nejdříve nastaven na dostatečně vysoké číslo TEXTBIGPOS (hodnota 80000000h) představující ukazatel nastavený za konec textu.

Jsou-li bajty v textu nalezeny, je navrácena v registru EDX pozice (offset) bajtů v textu a příznak CF je vynulován. Nejsou-li bajty nalezen, je v registru EDX navrácena hodnota -1 a je navrácen příznak chyby CY.


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

TextFindWordRev:push	ecx		; push ECX
		push	edi		; push EDI

; ------------- Get number of comparisons (-> ECX)

		mov	edi,[ebx]	; EDI <- data buffer
		mov	ecx,[edi+TEXT_Length] ; ECX <- length of text
		dec	ecx		; ECX <- length - 1

; ------------- Limit maximal offset (-> EDX)

		cmp	edx,ecx		; check maximal offset
		jl	TextFindWordRe2	; offset is OK
		mov	edx,ecx		; EDX <- text length
		dec	edx		; EDX <- offset of last byte

; ------------- Get text address (-> EDI)

TextFindWordRe2:or	edx,edx		; is offset valid?
		js	short TextFindWord6 ; invalid offset
		lea	edi,[edi+TEXT_Text+edx] ; EDI <- start pointer

Po úschově registrů bude omezen maximální počáteční offset v textu (aby neukazoval za konec textu). Do registru ECX se připraví délka textu (v bajtech) snížená o 1 bajt (což je rezerva pro druhý hledaný bajt). Přesahuje-li pozice v textu konec textu, omezí se pozice na poslední pozici v textu. Je-li pozice v textu záporná, nebyly bajty v textu nalezeny (nebo text měl délku 1 nebo menší) a funkce se ukončí s navrácením příznaku chyby CY a s hodnotou -1 v registru EDX. Část kódu pro obsluhu chyby je společná s funkcí TextFindWord. Při platném offsetu v textu se do registru EDI připraví ukazatel na první prohledávaný bajt textu.


; ------------- Find data
	
		mov	ecx,edx		; ECX <- offset
		std			; set direction down
		inc	ecx		; ECX <- number of bytes
TextFindWordRe4:repne	scasb		; find data
		jne	short TextFindWord5 ; data not found
		cmp	ah,[edi+2]	; check second byte
		jne	TextFindWordRe4	; continue searching
		cld			; set direction up

; ------------- Get offset of data (here is NC)

		mov	edx,ecx		; EDX <- remaining bytes

; ------------- OK: Pop registers (here is NC)

		pop	edi		; pop EDI
		pop	ecx		; pop ECX
		ret

Do registru ECX se připraví počet bajtů k prohledání - hledá se směrem zpět, proto počet bajtů odpovídá offsetu bajtu zvýšenému o 1. První bajt se vyhledá instrukcí scasb s nastaveným směrem hledání dolů. Pokud nebyl bajt nalezen, funkce se opět ukončí s navrácením příznaku chyby CY a s hodnotou -1 v registru EDX (a současně se nastaví implicitní směr nahoru). Pokud byl první bajt nalezen, otestuje se druhý bajt. Jestliže druhý bajt nesouhlasí, pokračuje se vyhledáváním prvního bajtu od další pozice v textu. Jsou-li oba bajty v textu nalezeny, z čítače dat ECX se získá offset nalezeného bajtu a funkce se ukončí s vynulovaným příznakem chyby NC.


Obsah / Utility / TEXT / TextFindWordLast, TextFindWordRev