Autor Thema: Zahl in Text umwandeln  (Gelesen 3460 mal)

bscreator

  • Gast
Gespeichert
« am: 12. January 2008, 16:31 »
Hallo OS-Coder,
hab ein kleines Problem:
Ich will eine in AX stehende Zahl ausgeben. Das Prinzip kenn ich, aber bei der Ausgabe erscheint, wenn z.B. AX mit dem Wert 65000 initialisiert worden ist, nur die 6 auf dem Bildschirm.
Findet ihr den Fehler ?

IntToStr:
push dx
push ax

call Stellen
xor cx,cx
xor dx,dx
mov cx,10
IntToStrStart:
div cx            ;Zahl durch 10 teilen
add dx,30h   ;in ASCII konvertieren
mov [String+bx],dx   ;in Puffer schreiben
dec bx                       ;n„chstes Pufferelement ausw„hlen
mov dx,0                   ;Rest wieder loeschen
cmp ax,0                   ;ganzzahliger Anteil 0 ?
je IntToStrEnde        ;ja->Ende
jmp IntToStrStart

IntToStrEnde:
pop ax
pop dx
retn

Die Funktion "Stellen" liefert die Anzahl der Stellen einer Zahl über BX zurück. Also bei 60000 ist BX dann 4. (von 0 bis 4 = 5 Stellen).
String ist ein aus 6 Elementen bestehendes Array, das mit 0 initialisiert ist.

Danke für eure Hilfe

Toaster

  • Beiträge: 38
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 12. January 2008, 17:32 »
vlt solltest du den pointer inkrementieren als dekrementieren *grins*

Korona

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 12. January 2008, 18:21 »
Das dekrementieren von bx ist richtig :roll:
Beim ersten Anblick sehe ich da keinen Bug, evt. liegt der Fehler in der Ausgabe?

EDIT: Hab doch nen Fehler gefunden:
mov [String+bx],dxHier verwendest du einen 16 Bit Memory Zugriff, der dir die vorherigen Stellen mit 0 überschreibt.
mov [String + bx], dlSollte funktionieren.
« Letzte Änderung: 12. January 2008, 18:25 von Korona »

Toaster

  • Beiträge: 38
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 12. January 2008, 19:32 »
         a
« Letzte Änderung: 12. January 2008, 19:40 von Toaster »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 12. January 2008, 19:39 »
bx ist nicht mit Null initialisiert. Er schreibt an String + 4, 3, 2, 1 und 0. Ich nehme an, der Fehler liegt eher bei der Ausgabe, die er uns nicht verrät.

Davon abgesehen ist der Code ein schönes Beispiel dafür, daß es in Assembler nicht automatisch besser wird als in einer Hochsprache...
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

bscreator

  • Gast
Gespeichert
« Antwort #5 am: 12. January 2008, 19:47 »
Danke für eure Beitrage. Es stimmt, es war der 16-Bit-Memory Zugriff. Durch das Ausbessern von DX durch DL wird die ganze Zahl ausgegeben.
Zitat
Davon abgesehen ist der Code ein schönes Beispiel dafür, daß es in Assembler nicht automatisch besser wird als in einer Hochsprache...
Du bringst es auf den Punkt...

Danke für eure Beiträge

 

Einloggen