V assembleri to bude trocha ťažšie. Ak chceš napísať sám funkciu na prevedenie DWORDU na reťazec, tak dalo by sa postupovať nejako takto:
Keďže pracujeme s 32-bitovými registrami, najväčšie takéto číslo v desiatkovej sústave je
4 294 967 295 - obsahuje desať čísel, teda v slučke s desiatimi opakovaniami sa bude číslo v registri eax postupne deliť číslami počnúc 1000000000, 100000000, ... , 10, 1. Výsledok po delení sa vypíše ( popis vypísania viď nižšie ) a potom sa do registru eax uloží zvyšok po delení (i keď neviem, či sa zvyšok neukladá iba do 16-bitového registra ???). Týmto vypadne číslica, ktorá je najviac vľavo (tá, ktorú sme vypísali) a pokračuje sa v cykle.
Je mi jasné, že z toho popisu je to nepredstaviteľné, tak to názorne ukážem, ale na menšom čísle - trojcifernom:
Citácia:
číslo = 123
123 / 100 = 1 , zvyšok 23
- vypíše sa jednotka (výsledok delenia), a pokračuje sa so zvyškom
23 / 10 = 2 , zvyšok 3
- vypíše sa dvojka a pokračuje sa
3 / 1 = 3 , zvyšok 0
- vypíše sa trojka a cyklus skončil (cyklus = počet cifier)
Čím viac cifier, tým viac s tým je roboty. Ak teda stačí vypísať číslo napr po
65535 (16-bitov), ušetríš si takmer polovicu roboty.
Popis vypísania jednej cifry:
Ak si všimneš v
ASCII tabuľke hodnoty číselných znakov, tak si uvedomoiš, že k cifre stačí prirátať hodnotu 0x30 a dostane sa jej ASCII vyjadrenie. Napríklad v registri máme číslo 3. Ak k nemu pripočítame 0x30, dostaneme číslo 0x33, čo je hexadecimálne vyjadrenie čísla 3 v ASCII tabuľke.
// toto bol postup, ako to spraviť čisto v assebmleri. Môžeš ale použiť aj nejakú funkciu na to určenú, uloženú v nejakej knižnici, ktorú iba inkludneš. Tuším sa dá použiť aj samotná
printf, ale osobne som to ešte neskúšal.