Obsah / Utility / TEXTFORM / UDWToTextBufN
Zdrojový kód: INCLUDE\UTIL\TEXTFORM.INC, UTIL\TEXTFORM.ASM
Související:
UDWToTextBuf | Konverze neformátovaného čísla DWORD bez znaménka na text | |
FormToTextBufN | Délka formátovaného textu |
UDWToTextBufN - Délka textu neformátovaného čísla DWORD bez znaménka
Funkce UDWToTextBufN zjistí velikost bufferu potřebného k dekódování neformátovaného čísla DWORD bez znaménka do bufferu.
|
Na vstupu funkce obsahuje registr EAX číslo bez znaménka ke konverzi a registr ECX požadovaný minimální počet číslic. Na výstupu navrací funkce v registru EAX délku textu v bajtech.
|
Délka textu bude odvozena z dekadického logaritmu čísla, tedy z dekadického řádu nejvyšší číslice. Výchozím údajem bude binární logaritmus, tedy počet bitů v čísle, které je zjištěno instrukcí BSR (hledání bitu směrem zpět) a následnou inkrementací nalezené pozice nejvyššího bitu. Je-li číslo nula, bude se pokračovat s počtem číslic 0.
|
Zjištěný binární logaritmus bude převeden na dekadický logaritmus vydělením číslem ln 10 / ln 2 = 3,3219 (přibližně). Namísto dělení se použije rychlejší operace násobení převrácenou hodnotou, tj. číslem 10000h / 3.3219 (zaokrouhleno nahoru). Po posunu o 16 bitů doprava se v registru EBX obdrží výsledný dekadický logaritmus (přesněji jeho celočíselná část).
|
Přibližný počet číslic je již známý, ale údaj je potřeba ještě upřesnit, protože binární logaritmy mohou ležet přes hranici dekadických logaritmů. K tomu slouží tabulka IntMul10, která obsahuje násobky 10 snížené o 1, tedy čísla 0, 9, 99, 999 atd. Porovnáním původního čísla s hranicí podle vypočteného dekadického logaritmu čísla se upřesní, zda číslo leží nad hranicí nebo pod hranicí a pokud leží nad hranicí, počet číslic se zvýší o 1.
|
Po zjištění skutečné délky čísla se vypočtený počet číslic porovná se zadaným minimálním počtem číslic a je-li menší, použije se namísto vypočtené délky zadaný minimální počet číslic.
Obsah / Utility / TEXTFORM / UDWToTextBufN