Obsah / Utility / TEXTFORM / SDWToTextBufN
Zdrojový kód: INCLUDE\UTIL\TEXTFORM.INC, UTIL\TEXTFORM.ASM
Související:
SDWToTextBuf | Konverze neformátovaného čísla DWORD se znaménkem na text | |
FormToTextBufN | Délka formátovaného textu |
SDWToTextBufN - Délka textu neformátovaného čísla DWORD se znaménkem
Funkce SDWToTextBufN zjistí velikost bufferu potřebného k dekódování neformátovaného čísla DWORD se znaménkem do bufferu.
|
Na vstupu funkce obsahuje registr EAX číslo se znaménkem ke konverzi a registr ECX požadovanou minimální délku textu (včetně znaménka). Na výstupu navrací funkce v registru EAX délku textu v bajtech.
|
Je-li konvertované číslo nezáporné, je obsluha převedena na funkci pro zjištění délky čísla bez znaménka UDWToTextBufN, jinak se pokračuje obsluhou záporných čísel.
|
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. Nula se v tomto místě nemůže vyskytnout.
|
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. Současně se přičte další 1, aby se započítalo záporné znaménko.
|
Po zjištění skutečné délky čísla se vypočtený počet číslic porovná se zadanou minimální délkou textu a je-li menší, použije se namísto vypočtené délky zadaná minimální délka textu.
Obsah / Utility / TEXTFORM / SDWToTextBufN