Ich muss also den Wert der Zahl in einzelne Dezimal-Ziffern
darstellen.
Das geht ja ganz einfach:
i. Ziffer = ZAHL / 10^(n-i)
Das Problem ist nur, dass meine Zahl 2 Wörter (1 Double Word)
groß ist und die arithmetischen Operationen nur 1 Word-Zahlen
behandeln können.
Du teils so lange durch 10, bis das Doppelwort leer ist. Den jeweiligen Rest schreibst du von rechts nach links als Ziffern.
Das (grösste mögliche Wort + 1) / 10 ist der Faktor, mit dem du das HiWord multiplizierst, das Ergebnis merkst du dir. Der Rest aus (grösstes mögliche Wort + 1) / 10 wird ebenfalls mit dem HiWord multipliziert und zum LoWort addiert (möglichen Überlauf beachten!). Jetzt kannst du das LoWord dividieren und das Ergebnis zum Merker von vorhin hinzuaddieren. Im Merker hast du jetzt die durch 10 dividierte Zahl, der Rest aus der letzten Division wird als Ziffer plaziert.
Nehmen wir ein Wort als 8-bit und teilen 65535 (Hiword 255, LoWord 255). Das (grösste mögliche Wort + 1) / 10 = (255+1)/10 = 25, Rest 6.
HiWord*25 = 6375 -> Merker
HiWord*Rest + LoWord = 255*6 + 255 = 1785
Merker = Merker + 1785 / 10 = 6553
Erste Ziffer (von rechts) ist der Rest der letzten Division 1785 / 10, also 5
Der Merker enthält jetzt 6553. Hiword 25, LoWord 153
HiWord*25 = 625 -> Merker
HiWord*Rest + LoWord = 25*6 + 153 = 303
Merker = Merker + 303 / 10 = 655
Nächste Ziffer (von rechts) ist der Rest der letzten Division 303 / 10, also 3
Der Merker enthält jetzt 655. Hiword 2, LoWord 143
HiWord*25 = 50 -> Merker
HiWord*Rest + LoWord = 2*6 + 143 = 155
Merker = Merker + 155 / 10 = 65
Nächste Ziffer (von rechts) ist der Rest der letzten Division 155 / 10, also 5
Der Merker enthält jetzt 65. Hiword 0, LoWord 65
HiWord*25 = 0 -> Merker
HiWord*Rest + LoWord = 0*6 + 65 = 65
Merker = Merker + 65 / 10 = 6
Nächste Ziffer (von rechts) ist der Rest der letzten Division 65 / 10, also 5
Der Merker enthält jetzt 6. Hiword 0, LoWord 6
HiWord*25 = 0 -> Merker
HiWord*Rest + LoWord = 0*6 + 6 = 6
Merker = Merker + 6 / 10 = 0
Nächste Ziffer (von rechts) ist der Rest der letzten Division 6 / 10, also 6
Merker = 0 -> Wir haben fertig!
Ist programmtechnisch natürlich etwas schwieriger umzusetzen, weil du rekursiv arbeiten musst, da das Produkt aus HiWord*Rest + LoWord überlaufen kann.
HTH