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!


Anmelden zum Antworten