Obsah / Utility / TEXT/ UDWToTextBuf
Zdrojový kód: INCLUDE\UTIL\TEXTFORM.INC, UTIL\TEXTFORM.ASM
Související:
UDWToTextBufN | Délka textu neformátovaného čísla DWORD bez znaménka | |
FormToTextBuf | Zformátování textu do bufferu |
UDWToTextBuf - Konverze neformátovaného čísla DWORD bez znaménka na text
Nejčastější operací při převodu čísel na text je konverze 32-bitového celého čísla na text bez formátování. Proto je na tuto operaci k dispozici samostatná funkce UDWToTextBuf, která zajistí rychlou konverzi čísla na text.
|
Na vstupu funkce obsahuje registr EAX číslo bez znaménka ke konverzi, registr ECX požadovaný minimální počet číslic, registr ESI zbývající volné místo v cílovém bufferu a registr EDI ukazatel na cílový buffer. Na výstupu z funkce jsou registry ESI a EDI posunuty na novou zápisovou pozici.
|
Běžný postup při dekódování čísla bývá dělením získávat číslice "odzadu" čísla, ukládat je do zásobníku a poté v opačném pořadí navracet a ukládat do výstupního bufferu. V jádru systému je nutné šetřit se zásobníkem, proto se použije ukládání čísla přímo do výstupního bufferu, což je ve výsledku i rychlejší operace.
Pomocí funkce UDWToTextBufN se zjistí délka konvertovaného čísla a posune se ukládací adresa bufferu i čítač zbylých dat. Pokud nastalo podtečení čítače zbylých dat, proběhne konverze pomalejší opatrnou metodou.
|
Nedojde-li k přeplnění výstupního bufferu, může se použít rychlá konverze bez kontroly konce bufferu. Při konverzi se číslo postupně dělí deseti a zbytek po dělení se ukládá jako číslice od konce bufferu k začátku.
Pro zrychlení konverze se namísto pomalé operace dělení použije rychlejší operace násobení převrácenou hodnotou čísla 10. Vynásobením číslem 800000000h/10 (zaokrouhleno nahoru) a posunem registru EDX o 3 bity doprava se obdrží v registru EDX číslo vydělené 10.
Pro získání zbytku po dělení je nutno výsledek dělení vynásobit zpět číslem 10 a od původního čísla odečíst. Vzhledem k rozsahu výsledku postačí namísto celého dvojslova vynásobit pouze nejnižší bajt (což je poměrně rychlá operace) a výsledek poté odečíst od nižšího bajtu původního čísla. Přičtením ASCII znaku "0" se výsledný zbytek po dělení zkonvertuje na číslici, která se uloží do bufferu. V konverzní smyčce se dále pokračuje pro požadovaný počet číslic v registru ECX.
|
Dojde-li k přeplnění výstupního bufferu, je nutné provést pomalou konverzi s kontrolou platnosti ukládací adresy. Při konverzi se číslo postupně dělí deseti a zbytek po dělení se ukládá jako číslice od konce bufferu k začátku.
Pro zrychlení konverze se namísto pomalé operace dělení použije rychlejší operace násobení převrácenou hodnotou čísla 10. Vynásobením číslem 800000000h/10 (zaokrouhleno nahoru) a posunem registru EDX o 3 bity doprava se obdrží v registru EDX číslo vydělené 10.
Pro získání zbytku po dělení je nutno výsledek dělení vynásobit zpět číslem 10 a od původního čísla odečíst. Vzhledem k rozsahu výsledku postačí namísto celého dvojslova vynásobit pouze nejnižší bajt (což je poměrně rychlá operace) a výsledek poté odečíst od nižšího bajtu původního čísla. Přičtením ASCII znaku "0" se výsledný zbytek po dělení zkonvertuje na číslici.
Před uložením do výstupního bufferu je nedříve posunut čítač zbylého místa v bufferu. Číslice se uloží do bufferu pouze v případě, že čítač volného místa v bufferu je větší než 0, tj. ukazatel není za koncem bufferu. V konverzní smyčce se dále pokračuje pro požadovaný počet číslic v registru ECX.
Po ukončení konverze je nutné provést ošetření ukazatele bufferu tak, aby ukazoval maximálně na konec bufferu, ale ne dále (tj. aby čítač zbylých dat byl 0). To se zajistí přičtením čítače zbylých dat (který címe že je záporný) k cílovému ukazateli a vynulováním čítače dat.
Obsah / Utility / TEXTFORM / UDWToTextBuf