umrechnen einer gleitkommazahl
-
hallo!
ich habe ein problem:
mir ist zwar klar, wie ich am papier eine gleitkommazahl in eine dezimalzahl als string umrechne, aber ich habe leider absolut keine ahnung, wie ich das dem assebler beibringe.
hat wer eine ahnung, wie so ein code aussehen könnte??? bin schon total verzweifelt.
danke!
mfg
kathi
-
Kathi schrieb:
hallo!
ich habe ein problem:
mir ist zwar klar, wie ich am papier eine gleitkommazahl in eine dezimalzahl als string umrechne, aber ich habe leider absolut keine ahnung, wie ich das dem assebler beibringe.
hat wer eine ahnung, wie so ein code aussehen könnte??? bin schon total verzweifelt.
danke!
mfg
kathi
was heisst auf dem papier? wenn ich auf dem papier eine (gleitkomma-)zahl hinschreibe dann ist sie bereits in dezimaldarstellung
ausserdem wäre zu wissen welcher art das problem ist: der algorithmus an sich oder dessen umsetzung in assembler. in letzterem falle solltest du den algorithmus vielleicht einmal angeben (denn es gibt durchaus mehr als eine möglichkeit) - am besten als C oder C++ funktion, die man dann direkt zur diskussion einer (inline) assemblerfunktion nutzen könnte. falls ersteres der fall ist, sollte die frage möglicherweise in einem anderen foruum gestellt werden.
-
ich löse das so:
;---------------------------------------------------------- ; dez2ascii ----------------------------------------------- ; ax:= Zahl in binary | ES:DI:= buffer für ASCII-Zahl ; output: ES:DI:= ASCII-Zahl im Buffer ;---------------------------------------------------------- dez2ascii: mov bx,10 ; Wir Teilen immer durch die Basis 10 xor cx,cx ; Anzahl Dezimalstellen am Anfang 0 stelle: xor dx,dx ; hier wird unsere Dezistelle stehen div bx ; wir teilen durch die Basis push dx ; in dx ist jetzt die letzte stelle inc cx ; wir haben ein Zeichen mehr or ax,ax ; wir prüfen ob noch eine Stelle drinn ist... jz short zahl2buff ; wenn 0, dann fange mit dem bufferfuellen an... jmp short stelle ; ansonsten hole naechste stelle zahl2buff: pop ax ; hole stelle vom stack in umgekehrter reihenfolge... add al,30h ; ascii offset zu zahlen mov [di],al ; ...und packe diese in den Buffer inc di ; naechste stelle im Buffer loop zahl2buff ; mache das cx mal mov [di],byte 0 ; beende string immer mit 0 ret ;----------------------------------------------------------
oder laber ich hier offtopic?
-
Naja, so ein bisschen.
Deine Funktion kann mit Gleitkommazahlen irgendwo nicht wirklich was anfangen.
-
Beim Radasm (Windows IDE für Assemblys) ist ein Beispielprojekt für MASM dabei wo sogar verschiedne Verfahren miteinenander verglichen werden. Allerdings sind die etwas umfangreich so dass ich sie nicht unbediengt posten möchte.
Es sollte natürlich klar sein dass Gleitkommazahlen im Rechner anders dargestellt werden als bloß eine Zahl mit einem komma dazwischen ;).
http://de.wikipedia.org/wiki/Gleitkommazahl
-
Nicht umsonst sind die entsprechenden Funktionen in den C-Libraries oft mehrere KB groß.
-
Nobuo T schrieb:
Naja, so ein bisschen.
Deine Funktion kann mit Gleitkommazahlen irgendwo nicht wirklich was anfangen.achso gleitkommazahlen=kommazahlen
Alles klar.
Kommt aber glaub ich auch drauf an in welcher Form die Gleitkomazahl festgehalten wird.
Wenn in zB in ax der Ganzzahlwert steckt und in dx der Nachkommateil, dann kann man doch erst (mit der geposteten funktion) den Ganzzahlteil in einen String umformatieren und dannach erst den Nachkommateil
Dannach würde es reichen die 2 strings ganz einfach hintereinander
(mit Komma dazwischen) auf BS auszugeben.oder laber ich immer noch offtopic
-
linu(x)bie schrieb:
oder laber ich immer noch offtopic
yup, das wäre festkommaarithmetik