int64 -> Ansi
-
Hallo,
mein Vorhaben ist im Titel beschreiben.
Für 32bit Integer hab ich es im Groben so gelöst:
Integer /= 10 AnsiZeichen = Rest + 0x30 Loop
Jetzt kommt aber der böse 64bit Integer. Der teilt sich in EDX:EAX auf. Wenn ich jetzt aber das Registerpaar durch 10 teile, gibts einen schönen Overflow...
Wie kann ich das lösen, mir fällt gerade einfach kein Ansatz ein
Danke
-
das ist gar nicht so Einfach: http://webster.cs.ucr.edu/AoA/Windows/HTML/AdvancedArithmetica2.html
In deinem Fall (div. durch Konstante) könnte man die Division aber auch durch eine 128 Bit Multiplikation ersetzen, was einfacher zu implementieren währe. Außerdem musst du die 64Bit-Zahl nur einmal teilen, so dass man den verbleibenden Rest mit DIV weiterverarbeiten kann.
Alternativ kann man sich der FPU bedienen.
-
Ach stimmt, die gute alte FPU hab ich total vergessen!
Naja, eigentlich nur halb vergessen, habe überlegt MMX zu verwenden...bis ich festgestellt habe, dass MMX keinen Div-Befehl hat ?!
Hab ich den irgendwie übersehen, oder gibts den aus einem speziellen Grund nicht?
Ansonsten schau ich mir mal an, wie "_i64toa" das Problem löst.
-
Man findet auch über google ein paar Beispiele dazu, z.B.
http://x86asm.net/articles/working-with-big-numbers-using-x86-instructions/
oder
http://www.godevtool.com/TestbugHelp/FPUvCPU.htmganz allgemein muß man aber verstehen, wie eine handschriftliche Division abläuft, und wie der Prozessor bei solchen Sachen entgegenkommt.
z.B. bei 8 Bit:
5431 : 10 = 543 mit Rest 1
(8 Bit z.B.)54:10 = 5(al) Rest 4(ah) ;nun 3 von oben herunterholen und dranklatschen...
43:10 = 4 (al) Rest 3 (ah) ;1 runterholen und dranklatschen
31:10 = 3 (al) Rest 1 (ah)
...
...add ah,30h
...usw.Man braucht halt einen Registerteil für den Rest, der kann dann nicht gleichzeitig die größere Ergebnis-Zahl abbilden, also entweder Rest oder größere Zahl. Wenn die Ergebniszahl im Registerbereich bleibt, kann die Gesamtzahl natürlich ein wenig größer als Registerbereich sein.
...und man könnte sich natürlich auch mathematisch ein wenig weiterbilden wie etwa mit:
http://www.risc.jku.at/education/courses/ws2011/pasc/Literature/96-29.pdf
(Karatsuba division stichwort google)
-
KleineFrage schrieb:
Wie kann ich das lösen, mir fällt gerade einfach kein Ansatz ein
Muss die Funktion unbedingt in Assembler implementiert werden
In C/C++ gibt es einen 64-Bit Datentyp
(unsigned) long long
.
-
@nachtfeuer:
Danke, die links sehen auf den ersten Blick vielversprechend aus, werde ich mir nachher mal genauer ansehen!@abc.w:
Das wäre doch zu einfach
Die Funktion ist nur zum Lernen da, einen anderen Zweck hat sie eigentlich nicht.
-
Auf meiner Homepage gibt's ein paar Codebeispiele:
http://dcla.rkhb.de/div64.html
HTH
viele grüße
ralph
-
Auch das werde ich mir auf jeden Fall mal anschauen, danke!