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

Obsah / Utility / TEXT / TextFindByteLast, TextFindByteRev

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


TextFindByteLast, TextFindByteRev - Vyhledání posledního/předešlého bajtu v textu

Funkce TextFindByteLast vyhledá v textu poslední výskyt daného bajtu. Funkce TextFindByteRev vyhledá předešlý výskyt bajtu od dané pozice v textu (včetně).


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

; ------------- Find last occurrence of 1 byte

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

Na vstupu funkce obsahuje registr AL hodnotu vyhledávaného bajtu. 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 bude bajt vyhledáván. V případě funkce TextFindByteLast je obsah registru EDX nejdříve nastaven na dostatečně vysoké číslo TEXTBIGPOS (hodnota 80000000h) představující ukazatel nastavený za konec textu.

Je-li bajt v textu nalezen, je navrácena v registru EDX pozice (offset) bajtu v textu a příznak CF je vynulován. Není-li bajt nalezen, je v registru EDX navrácena hodnota -1 a je navrácen příznak chyby CY.


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

TextFindByteRev: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

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

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

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

TextFindByteRe2: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. Přesahuje-li pozice v textu konec textu, omezí se pozice na poslední pozici v textu. Je-li pozice v textu záporná, nebyl bajt v textu nalezen (nebo text měl nulovou délku) 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
		repne	scasb		; find data
		cld			; set direction up
		jne	short TextFindWord6 ; data not found

; ------------- 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. Bajt se vyhledá instrukcí scasb s nastaveným směrem hledání dolů. Implicitně je v systému příznak směru nastavený nahoru, proto se ihned po provedení instrukce příznak směru navrátí do implicitního stavu. Pokud nebyl bajt nalezen, funkce se opět ukončí s navrácením příznaku chyby CY a s hodnotou -1 v registru EDX. V případě nalezení se z čítače dat ECX získá offset nalezeného bajtu a funkce se ukončí s vynulovaným příznakem chyby NC.


Obsah / Utility / TEXT / TextFindByteLast, TextFindByteRev