Obsah / Utility / TEXT / TextAddIntSig
Zdrojový kód: INCLUDE\UTIL\TEXT.INC, UTIL\TEXT.ASM
TextAddIntSig - Přidání neformátovaného celého čísla se znaménkem na konec textového řetězce
Funkce TextAddIntSig přidá neformátované celé číslo se znaménkem na konec textového řetězce.
|
Na vstupu funkce obsahuje registr EAX celé číslo se znaménkem. Registr EBX obsahuje ukazatel na textovou proměnnou, ke které se má číslo přidat. V případě chyby paměti je navrácen chybový příznak CY a obsah textové proměnné se nezmění.
|
Konvertované číslo se uchová do registru ESI. Pomocí funkce TextCopyWrite se provede kopie textu před zápisem. Pokud nastane chyba paměti, funkce se ukončí s chybou a text zůstane nezměněn.
|
Číslo v ESI se převede na absolutní hodnotu. Do registru EDX se přednastaví délka textu 0 nebo 1 podle toho, zda bude číslo obsahovat znaménko mínus "-".
|
Pro konverzi čísla je potřeba znát délku textu, protože dekódování čísla se provádí odzadu. Do registru ECX se přednastaví 1 jako minimální délka čísla pro případ nuly. Instrukcí BSR se vyhledá pozice nejvyššího bitu "1" v čísle. Pokud bylo číslo nula, použije se délka čísla 1. Inkrementací pozice bitu v registru EAX se obdrží počet bitů čísla.
|
Z počtu bitů se zjistí počet číslic čísla tak, že počet bitů (což je dvojkový logaritmus čísla) se vydělí konstantou ln 10 / ln 2 = 3.3219, tím se převede na dekadický logaritmus, což znamená počet číslic. Vlivem zaokrouhlení na celá čísla ale tento údaj není ještě přesný, proto se upřesní tak, že se konvertované číslo porovná s hranicemi podle tabulky IntMul10 (obsahující mocniny 10) a počet číslic se opraví na správnou hodnotu.
|
Voláním funkce TextResize se nastaví nová velikost datového bufferu, tj. stará velikost zvýšená o zjištěný počet číslic ECX a zjištěnou délku znaménka EDX. Pokud nastane chyba paměti, funkce se ukončí s chybou a text zůstane nezměněn.
|
Pokud je číslo negativní (obsah registru EDX je 1), uloží se znaménko mínus "-" za konec starého textu. Do registru EDI se připraví adresa konce datového bufferu.
|
Nyní je vše již připraveno a může být zahájena konverze čísla na číslice. Konverze se bude provádět od konce bufferu, proto se nastaví příznak směru ukládání dolů.
K získání další (nejnižší) číslice bude číslo vyděleno 10. Pro zrychlení konverze se namísto dělení použije rychlejší operace násobení převrácenou hodnotou. Podíl zůstane v registru EDX. Opětovným vynásobením číslem 10 a odečtením od původního čísla se získá zbytek po dělení. Vzhledem k rozsahu výsledku není třeba dělat plné násobení, stačí jen násobit nejnižší bajt podílu (v registru DL). Zbytek po dělení se přičtením "0" převede na ASCII znak a uloží do bufferu EDI. Poté se pokračuje další číslicí čítáním registru ECX.
Obsah / Utility / TEXT / TextAddIntSig