Obsah / Utility / TEXTFORM / BinToTextBufN
Zdrojový kód: INCLUDE\UTIL\TEXTFORM.INC, UTIL\TEXTFORM.ASM
Související:
BinToTextBuf | Zformátování čísla BIN do bufferu | |
FormToTextBufN | Délka formátovaného textu |
BinToTextBufN - Délka textu formátovaného čísla BIN
Funkce BinToTextBufN zjistí délku formátovaného čísla BIN v bufferu.
|
Na vstupu funkce obsahuje registrový pár EDX:EAX číslo bez znaménka ke konverzi a registr EBX formátovací parametry FORMPAR (ne ukazatel). Na výstupu je navrácena v registru EAX délka textu.
|
Funkce BinToTextBufN volá interní funkci Bin0ToTextBufN, která nezapočítává požadovanou šířku pole. Porovnáním s požadovanou minimální šířkou se ověří, zda je délka textu čísla větší než požadovaná minimální šířka. Pokud je menší, navrátí funkce požadovanou minimální šířku namísto délky textu bez mezer.
|
Funkce Bin0ToTextBufN zjistí délku textu bez uvažování minimální šířky textu. Na vstupu funkce obsahuje registrový pár EDX:EAX číslo bez znaménka ke konverzi a registr EBX formátovací parametry FORMPAR (ne ukazatel). Na výstupu je navrácena v registru EAX délka textu.
|
Pro výpočet počtu číslic BIN čísla je nutné nejdříve zjistit pozici nejvyššího bitu v čísle. Číslo má velikost 2 dvojregistry, proto musí být informace sloučena z obou dvojregistrů.
Nejdříve bude vyhledána pozice nejvyššího bitu v registru EAX, který obsahuje nižší část čísla (LOW). Instrukce BSR uloží do registru EAX bitový offset nejvyššího nalezeného bitu 1. Pokud byl obsah registru EAX nulový, nastaví se příznak ZF. To využije následující instrukce SETZ, která uloží do registru AH hodnotu 1 v případě nulového obsahu čísla, jinak do AH uloží 0. Přičtením 1 k AL se obdrží v registru AL počet bitů původního čísla LOW. Avšak pokud byl obsah čísla LOW nulový, je obsah registru AL nedefinovaný. Proto je AL zamaskován maskou vygenerovanou z příznaku ZF v registru AH. Výsledkem je, že registr AL obsahuje buď počet bitů v původní nižší části čísla nebo nulu pokud byla nižší část čísla nulová.
Podobným způsobem je zjištěn počet bitů ve vyšší části čísla (HIGH) s tím rozdílem, že počet bitů je uložen do registru DL a je o 32 vyšší.
Další operací se údaje z nižší a vyšší části čísla sloučí do jednoho údaje. Pokud bylo číslo větší než DWORD, má maska v registru DH hodnotu 0FFh. Pokud se číslo vešlo do nižšího DWORD, má maska v DH hdnotu 0. Proto inverzí masky v DH a zamaskováním počtu bitů v AL z nižší části čísla se počet bitů vynuluje v případě, že číslo bylo větší než DWORD. Následnou instrukcí OR se údaje sloučí do registru DL, který ve výsledku obsahuje počet bitů v registrovém páru EDX:EAX.
V binárním formátu čísla odpovídá počet bitů přímo počtu číslic.
|
Vypočtená délka čísla se zvýší podle požadovaného minimálního počtu číslic (zadaného položkou FORMPAR_Prec formátovacích parametrů).
|
Další výpočet musí zajistit doplnění nul k číslu, je-li aktivní příznakový bit FORMFLAG_Zero_b.
Do registru EAX se připraví požadovaná minimální šířka pole (z registru BH, tj. parametr FORMPAR_Width formátovacích parametrů) snížená o případný prefix a sufix. Při malé šířce pole se nuly přidávat nebudou.
Je-li požadován oddělovač řádů (přepínač FORMFLAG_Thsn_b), musí se od počtu znaků odečíst počet oddělovačů. Na 8 číslic připadá 1 znak oddělovače, přičemž před oddělovačem musí být vždy minimálně 1 číslice, proto počet číslic pro danou šířku pole EAX se vypočte inkrementací šířky pole o 1 a vynásobením číslem 8/9.
Po výpočtu počtu číslic potřebných k doplnění čísla nulami se výsledek porovná se skutečnou šířkou čísla a případně se počet číslic zvýší.
|
Je-li požadován oddělovač řádů (je nastaven přepínač FORMFLAG_Thsn_b), je potřeba k délce čísla přičíst oddělovače řádů. Na 8 číslic čísla připadá 1 oddělovač řádů, přičemž před oddělovačem musí být minimálně jedna číslice. Proto se počet oddělovačů získá snížením počtu číslic o 1 a vydělením údaje osmi. Vypočtený počet oddělovačů se přičte ke střadači délky textu v registru EDX.
|
Je-li požadován prefix "0b" před číslem (je nastaven přepínač FORMFLAG_Alt_b), zvýší se délka textu o 2. Současně je zde zajištěno kontrolou minimálního počtu číslic, aby v případě prefixu mělo číslo alespoň 1 číslici (tj. aby při nule byl text "0b0").
|
Je-li požadován sufix "b" za číslem (je nastaven přepínač FORMFLAG_Alt2_b), zvýší se délka textu o 1. Současně je zde zajištěno kontrolou minimálního počtu číslic, aby v případě sufixu mělo číslo alespoň 1 číslici (tj. aby při nule byl text "0b").
Obsah / Utility / TEXTFORM / BinToTextBufN