CSEG SEGMENT
ASSUME CS:CSEG
DDOUT PROC
MOV BX,2 ; fortgesetzt durch 2 (Zahlensystemsbasis) dividieren
M1: CMP DX,0 ; hoeherwertige 16 Bit gesetzt ?
JNE M2
CMP AX,BX ; alle Divisionen durchgefuehrt ?
JB M3
M2: MOV CX,AX ; niederwertige 16 Bit sichern
MOV AX,DX ; hoeherwertige 16 Bit als 1. Dividend
MOV DX,0 ; nur hoeherwertige 16 Bit sind 1. Dividend
DIV BX ; durch 10 dividieren
XCHG AX,CX ; niederwertige 16 Bit als 2. Dividend
DIV BX ; erneut durch 10 dividieren
PUSH DX ; abgetrennte Ziffer auf den Stack legen
MOV DX,CX ; naechster 32 Bit Dividend in DX:AX
CALL M1 ; rekursiver Aufruf zwecks Abtrennung naechster Ziffer
POP AX ; abgetrennte Ziffer vom Stack holen
M3: ADD AL,'0' ; ASCII-Code der Ziffer ermitteln
CMP AL,'9' ; ASCII-Luecke zwischen 9 (39h) und A (41h) erwischt ?
JBE M4
ADD AL,7 ; Luecke ueberbruecken
M4: MOV AH,2h ; DOS-Funktionscode Zeichenausgabe
MOV DL,AL ; ASCII-Code des auszugebenden Zeichens in DL
INT 21h ; DOS-Funktion Zeichenausgabe ausfuehren
RET ; und zurueck ...
DDOUT ENDP
MAIN PROC
MOV DX,1234h ; auszugebende Zahl in DX:AX
MOV AX,5678h
CALL DDOUT ; Aufruf der Routine Doppelwortausgabe
MOV AX,4C00h ; normales Programmende
INT 21h ; DOS-Funktion Programmende aufrufen
MAIN ENDP
CSEG ENDS
SSEG SEGMENT STACK
DW 32767 DUP (?)
SSEG ENDS
END MAIN