CSEG  SEGMENT
      ASSUME CS:CSEG

DDOUT PROC
      MOV  BX,16    ; fortgesetzt durch 16 (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