Obsah / Utility / TEXTFORM / BinToTextBuf
Zdrojový kód: INCLUDE\UTIL\TEXTFORM.INC, UTIL\TEXTFORM.ASM
Související:
BinToTextBufN | Délka textu formátovaného čísla BIN | |
FormToTextBuf | Zformátování textu do bufferu |
BinToTextBuf - Zformátování čísla BIN do bufferu
Funkce BinToTextBuf zkonvertuje 64-bitové celé číslo bez znaménka na text ve formátovaném binárním (dvojkovém) tvaru.
|
Na vstupu funkce obsahuje registrový pár EDX:EAX číslo bez znaménka ke konverzi, registr EBX obsahuje formátovací parametry FORMPAR (ne ukazatel), registr ECX ukazatel na popisovač národnostních informací NATIONAL, registr ESI čítač zbylého místa v cílovém bufferu a registr EDI ukazatel do cílového bufferu. Na výstupu z funkce jsou registry ESI a EDI posunuty na novou ukládací pozici.
Funkce používá lokální proměnné s bázovým registrem EBP. Proměnné s kladným offsetem (BINNumL, BINNat a BINNumH) jsou použity jen pro čtení, jejich obsah není modifikován. BINNumL je nižší dvojslovo vstupního čísla (vstupní registr EAX). BINNat je ukazatel na národnostní informace NATIONAL (vstupní registr ECX). BINNumH je vyšší dvojslovo vstupního čísla (vstupní registr EDX). BINForm jsou formátovací parametry FORMPAR (vstupní registr EBX). BINLen je délka ukládaného textu. BINStack je velikost lokálních proměnných v zásobníku.
|
Pomocné makro BINTOTEXTBUFDIG je používáno uvnitř funkce k uložení jedné BIN číslice. Makro modifikuje vstupní číslo v registrovém páru EDX:EBX. V registru ESI je čítač volného místa v cílovém bufferu snížený o 1. EDI je ukazatel konce dat v cílovém bufferu (číslo se ukládá odzadu). Obsah registru AL se funkcí zničí.
Inkrementací čítače volného místa v registru ESI se provede test, zda je ukazatel do cílového bufferu platný. Není-li čítač kladný, ukazuje ukazatel za konec cílového bufferu, v tom případě se přeskočí část ukládající další znak.
Z registru BL se obdrží nejnižší bajt dekódovaného čísla a zamaskováním číslem 1 se připraví nejnižší bit čísla, který bude další číslicí dekódovaného čísla. Přičtením ASCII znaku "0" se číslo zkonvertuje na ASCII číslici, která se uloží do cílového bufferu.
Ukazatel cílového bufferu se sníží a rotací dvojregistru EDX:EBX o 1 bit doprava se číslo posune o jednu číslici k vyšším řádům.
|
Na začátku funkce BinToTextBuf je nejdříve proveden test volného místa v cílovém bufferu. Není-li v cílovém bufferu volné místo, funkce se ihned ukončí.
Po úschově registrů se vytvoří v zásobníku místo pro lokální proměnné. Do proměnné BINForm se uschovají formátovací parametry z registru EBX.
|
Ke zformátování čísla v bufferu je potřeba nejdříve znát délku čísla. Délka čísla se zjistí funkcí Bin0ToTextBufN, která na rozdíl od funkce BinToTextBufN ignoruje parametr minimální šířky pole s údajem. Délka čísla se uchová do proměnné BINLen a do registru EDX.
|
Není-li číslo zarovnáno doleva (příznakový bit FORMFLAG_Left_b), je nutno před číslo doplnit úvodní mezery. Do registru ECX se připraví z registru BH (což je parametr FORMPAR_Width z popisovače formátovacích parametrů) požadovaná šířka pole. Odečtením délky textu z registru EDX se obdrží zbývající šířka pro okraje. Je-li to kladné číslo, bude se pokračovat dále. Má-li být text centrován, použije se pouze polovina mezer se zaokrouhlením dolů.
V cyklu se ukládají znaky mezer do cílového bufferu. Počet mezer je v registru ECX. Dekrementací registru ESI se ověřuje, zda bude v bufferu místo pro další znak. Pokud čítač ESI dosáhne nuly, dosáhlo se konce cílového bufferu a funkce se ukončí.
|
Volitelně se může před začátek čísla uložit prefix "0b" (je-li nastaven příznakový bit FORMFLAG_Alt_b). Postupně se ukládají znaky "0" a "b", přičemž je dekrementací čítače v registru ESI sledováno volné místo k uložení dalšího znaku. Dosáhne-li čítač nuly, funkce se ukončí. Současně s ukládáním prefixu se v registru ECX dekrementuje údaj zbývající délky textu o 2.
Po uložení prefixu se testem příznakového bitu FORMFLAG_Alt2_b zjistí, zda se bude ukládat sufix "b". Pokud ano, sníží se údaj zbývající délky textu o 1.
|
Při přípravě registrů ke konverzi se do dvojregistru EDX:EBX načte konvertované číslo. Přičtením zbývající délky textu čísla k EDI a odečtením od ESI se ukládací ukazatel posune za konec ukládaného textu. Není-li délka textu v registru ECX platné kladné číslo, přeskočí se část pro ukládání čísla.
Po úschově zápisových ukazatelů ESI a EDI se dekrementací EDI nastaví ukládací ukazatel na poslední znak čísla.
|
Není-li nastaven příznakový bit FORMFLAG_Thsn_b, bude se číslo dekódovat bez oddělovačů řádů. Během konverze obsahuje registrový pár EDX:EBX konvertované číslo, registr ESI čítač volného místa - 1, registr EDI ukazatel na konec ukládaného textu a registr ECX čítač znaků k uložení. K dekódování čísla se používá makro BINTOTEXTBUFDIG, které je opakovaně voláno ve smyčce s čítačem ECX.
|
Při konverzi čísla s oddělovači řádů obsahuje registrový pár EDX:EBX konvertované číslo, registr ESI čítač volného místa - 1, registr EDI ukazatel na konec ukládaného textu, registr ECX čítač znaků k uložení, registr AH čítač řádů a třetí bajt registru EAX (tj. bity 16 až 23) znak oddělovače řádů.
Do třetího bajtu registru EAX se připraví znak oddělovače řádů - do registru EAX se načte z BINNat ukazatel na popisovač národnostních informací, z něj z NAT_ThsndSep do registru AL znak oddělovače řádů, který se rotací o 16 bitů posune na pozici 3. bajtu. Do registru AH se připraví čítač řádů.
K dekódování čísla se používá makro BINTOTEXTBUFDIG, které je opakovaně voláno ve smyčce s čítačem ECX. Na začátku smyčky je dekrementován čítač řádů v registru AH. Pokud dosáhne nuly, uloží se znak oddělovače pomocí makra TOTEXTBUFSEP, sníží se čítač zbývajících znaků a do registru AH se připravý nový čítač řádů.
|
Po dekódování textu čísla se navrátí ukládací registry ESI a EDI, které ukazovaly za konec ukládaného čísla. Ukazatele se upraví tak, aby nepřesahovaly konec bufferu - tj. přesahující ukládací ukazatel EDI se přičtením čítače ESI posune na konec a poté se čítač zbylého místa vynuluje.
|
Je-li nastaven v registru formátovacích parametrů příznakový bit FORMFLAG2_Alt2, uloží se za konec čísla sufix "b". Po uložení sufixu se dekrementací čítače volného místa ESI zkontroluje zbývající volné místo, při dosažení konce bufferu se funkce ukončí.
|
Poslední operací je uložení mezer za koncem čísla. Do registru EAX je načtena délka textu (bez mezer), do registru ECX požadovaná šířka pole, odečtením zůstane v registru ECX počet zbývajících mezer. Pokud žádné mezery pro okraje nezbyly, funkce se ukončí.
Je-li nastaven příznakový bit FORMFLAG1_Left, je číslo zarovnáno doleva, ihned se přejde k ukládání mezer za číslo. Není-li tento příznak nastaven a není-li nastaven ani příznakový bit FORMFLAG2_Cent, bylo číslo zarovnáno doprava a mezery tedy již byly uloženy dříve, takže se funkce ukončí. Jinak platí, že číslo je centrováno. Do registru ECX se připraví poloviční počet mezer, ale tentokrát se zaokrouhlí nahoru (aby se zachytila případná lichá mezera).
Následuje ukládání mezer do bufferu. Počet mezer je dán čítačem v registru ECX. Současně se sleduje zbývající volné místo v cílovém bufferu čítáním registru ESI. Pokud dosáhne nuly, bylo dosaženo konce bufferu a smyčka se ukončí.
Obsah / Utility / TEXTFORM / BinToTextBuf