Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bscreator 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 ;nchstes Pufferelement auswhlen
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
-
vlt solltest du den pointer inkrementieren als dekrementieren *grins*
-
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],dx
Hier verwendest du einen 16 Bit Memory Zugriff, der dir die vorherigen Stellen mit 0 überschreibt.
mov [String + bx], dl
Sollte funktionieren.
-
a
-
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...
-
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.
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