Obsah / Utility / TEXT / TextFindWordFirst, TextFindWord
Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextFindWordFirst, TextFindWord - Vyhledání prvního/dalšího slova v textu
Funkce TextFindWordFirst vyhledá v textu první výskyt daného slova (2 bajtů). Funkce TextFindWord vyhledá první výskyt slova (2 bajtů) od dané pozice v textu (včetně).
|
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 TextFindWordFirst je obsah registru EDX nejdříve vynulován, čímž se zajistí nastavení ukazatele na začátek 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 nalezeny, je v registru EDX navrácena hodnota -1 a je navrácen příznak chyby CY.
|
Po úschově registrů bude omezen minimální počáteční offset v textu (aby neukazoval pod hodnotu 0). Pro zrychlení kódu se nepoužije instrukce skoku, ale využijí se operace s registry. Po testu obsahu registru EDX se nastaví obsah registru CL na hodnotu 0, pokud byl offset nezáporný, nebo 1, pokud byl offset záporný. Po rozšíření hodnoty do registru ECX a dekrementaci bude registr ECX obsahovat hodnotu -1 (tj. 0FFFFFFFFh) pokud byl offset nezáporný, nebo hodnotu 0, pokud byl offset záporný. Zamaskováním offsetu v registru EDX registrem ECX se zajistí vynulování obsahu registru EDX v případě, že offset byl záporný.
|
Do registru ECX se připraví celková délka prohledávaného textu (v bajtech) snížená o 1 bajt (což je rezerva pro druhý hledaný bajt) a do registru EDI ukazatel na začátek prohledávaného textu (posunutý na počáteční pozici k prohledání).
|
Odečtením pozice počátku textu zůstane v registru ECX počet zbylých bajtů k prohledání - při podtečení se funkce ukončí s navrácením příznaku chyby CY a s hodnotou -1 v registru EDX. Je-li počet bajtů kladný, vyhledá se první bajt v textu. Nebyl-li nalezen (instrukce SCASB navrátí příznak NZ) funkce se opět ukončí s příznakem chyby CY a hodnotou -1 v registru EDX. 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, obsahuje registr ECX počet zbylých bajtů. Dvojitou inkrementací a odečtením od celkové délky textu se obdrží v registru EDX offset nalezeného slova v textu. Funkce je ukončena s vynulovaným příznakem chyby NC.
|
Nejsou-li bajty v textu nalezeny, je do registru EDX nastavena hodnota -1 jako příznak neplatného offsetu a funkce je ukončena s nastaveným příznakem chyby CY. Tato část kódu je společná i pro další funkce (TextFindByte, TextFindByteRev atd.).
Obsah / Utility / TEXT / TextFindWordFirst, TextFindWord