Fehler in MASM Programm unter 16bit / DOS
-
Hallo! Ich arbeite gerade ein Buch durch zu 16bit Assembler unter DOS durch (bin also noch Anfänger
). Jetzt wollte ich mir eine Funktion schreiben, die mir eine Zahl in der Konsole ausgibt. Hier erstmal der Code:
; Unterprogramm, das eine 16 bit zahl im ax Register in der Konsole ausgibt DATEN SEGMENT zahl dw 23497 ; die zahl, die ausgegeben werden soll DATEN ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATEN Anfang: mov ax,DATEN mov ds,ax mov ax, zahl ; ax register wird ausgegeben call ZahlAusgeben ; print zahl ; programm beenden mov ah,4Ch int 21h ; UNTERPROGRAMM HIER ZahlAusgeben PROC NEAR push ax ; register zwischenspeichern push cx push dx push bx xor dx,dx ; high part clearen (zahl nur in ax, da 16 bit) mov bx,10 ; divisor mov cx, 5 ; maximale Anzahl digits einer 16bit zahl schleifeUP: div bx ; teile ax durch 10, rest in dx push dx ; die entsprechende ziffer zwischenspeichern loop schleifeUP mov cx, 5 ; maximale Anzahl dezimalstellen einer 16bit zahl mov ah, 02h ; für ausgabe in konsole (print character in dl) schleifeUP2: pop dx ; hole ziffer in umgekehrter reihenfolge add dx, 48 ; umwandeln der zahl in ascii character int 21h ; printe character in dl loop schleifeUP2 pop bx ; register wiederherstellen pop dx pop cx pop ax RET ZahlAusgeben ENDP CODE ENDS END Anfang
Die idee ist folgende: Ich bringe die Zahl, die ich ausgeben will, in das ax register. Dann teile ich die zahl 5 mal durch 10 (16 bit Zahl kann maximal 5 dezimale Stellen haben). Nach dem div steht also die Ziffer, die ich ausgeben will, in dx und in ax steht jetzt der neue, durch 10 geteilte wert.
Doch statt "23497" gibt mir mein Programm immer "80617" aus. Die letzte Ziffer (also die "7") scheint dabei immer richtig zu sein. Allerdings sehe ich nicht, wo mein Fehler liegt. Kann jemand mal mit dem Zaunpfahl winken?
-
Kann es sein, dass der int-21h-Aufruf in der Schleife (Zeile 42) das ax-Register verändert, so dass die
Ausgabe-Funktion (mov ah,02) nicht mehr richtig funktioniert?DOS-Assembler ist bei mir ca. 20 Jahre her.
Vielleicht liege ich falsch.
-
DX muss in der Schleife schleifeUP auf 0 gesetzt werden.
-
Wow! Danke für die schnellen Antworten!
@quaimodule: du hast natürlich recht. Damit funktionierts. Danke!