PUBLIC STROUT1
        PUBLIC STROUT2

CODE    SEGMENT PUBLIC
        ASSUME CS:CODE

STROUT1 PROC
        PUSH BP
        MOV  BP,SP
        PUSH DS         ; DS sichern
        MOV  DS,[BP+6]  ; Anfangsadresse des Strings laden
        MOV  BX,[BP+4]
        MOV  CH,0       ; Laenge des Strings laden
        MOV  CL,[BX]
        CMP  CX,0       ; leerer String ?
        JE   MARKE1B
        MOV  SI,1       ; String-Index auf erstes Zeichen
MARKE1A:
        MOV  DL,[BX+SI] ; Zeichen aus dem String laden
        MOV  AH,2       ; DOS-Funktion Zeichenausgabe
        INT  21h
        INC  SI         ; String-Index auf naechstes Zeichen
        LOOP MARKE1A    ; noch nicht alle Zeichen abgearbeitet ?
MARKE1B:
        POP  DS         ; DS restaurieren
        POP  BP
        RET  4
STROUT1 ENDP

STROUT2 PROC
        PUSH BP
        MOV  BP,SP
        PUSH DS         ; DS sichern
        MOV  DS,[BP+6]  ; Anfangsadresse des Strings laden
        MOV  BX,[BP+4]
        MOV  CH,0       ; Laenge des Strings laden
        MOV  CL,[BX]
        CMP  CX,0       ; leerer String ?
        JE   MARKE2B
        MOV  SI,1       ; String-Index auf erstes Zeichen
MARKE2A:
        MOV  DL,[BX+SI] ; Zeichen aus dem String laden
        MOV  AH,2       ; DOS-Funktion Zeichenausgabe
        INT  21h
        INC  SI         ; String-Index auf naechstes Zeichen
        LOOP MARKE2A    ; noch nicht alle Zeichen abgearbeitet ?
MARKE2B:
        POP  DS         ; DS restaurieren
        POP  BP
        RET  4
STROUT2 ENDP

CODE    ENDS
        END