PUBLIC INSERTITEM
     PUBLIC SHOWLIST
CODE SEGMENT
     ASSUME CS:CODE
GREATERSTRING PROC FAR
     PUSH BP           ; BP retten
     MOV  BP,SP        ; Anker im Stack werfen
     PUSH DS           ; benoetigte Register retten
     PUSH ES
     PUSH BX
     PUSH CX
     PUSH DX
     PUSH SI
     PUSH DI
     MOV  AX,0         ; Funktionsergebnis False (Default)
     MOV  DS,[BP+12]   ; Pointer auf erste Zeichenkette
     MOV  SI,[BP+10]
     MOV  ES,[BP+8]    ; Pointer auf zweite Zeichenkette
     MOV  DI,[BP+6]
     MOV  DL,[SI]      ; Laenge erste Zeichenkette
     MOV  DH,ES:[DI]   ; Laenge zweite Zeichenkette
     MOV  CL,1         ; Position der zu vergleichenden Zeichen
     MOV  CH,DL        ; maximal durchzufuehrende Vergleiche
     CMP  CH,DH        ; Laenge 1. ZK groesser gleich Laenge 2. ZK ?
     JAE  GS1
     MOV  CH,DH
GS1: CMP  CH,0         ; Laenge beider Zeichenketten = 0 ?
     JE   GS6
GS2: INC  SI           ; Pointer in beiden Zeichenketten weiterschalten
     INC  DI
     MOV  BL,0         ; Zeichen aus erster Zeichenkette sofern vorhanden
     CMP  DL,CL
     JB   GS3
     MOV  BL,[SI]
GS3: MOV  BH,0         ; Zeichen aus zweiter Zeichenkette sofern vorhanden
     CMP  DH,CL
     JB   GS4
     MOV  BH,ES:[DI]
GS4: CMP  BL,BH
     JE   GS5          ; beide Zeichen identisch
     JB   GS6          ; kleineres Zeichen aus erster Zeichenkette
     MOV  AX,1         ; groesseres Zeichen aus erster Zeichenkette
     JMP  GS6          ; Funktionsergebnis True
GS5: INC  CL         
     CMP  CL,CH        ; noch Zeichen zu vergleichen ?
     JBE  GS2          ; naechstes Zeichen vergleichen
GS6: POP  DI           ; benoetigte Register restaurieren
     POP  SI
     POP  DX
     POP  CX
     POP  BX
     POP  ES
     POP  DS
     POP  BP           ; BP restaurieren
     RET  8            ; zwei Referenz-Parameter vom Stack
GREATERSTRING ENDP
INSERTITEM PROC FAR
     PUSH BP           ; BP retten
     MOV  BP,SP        ; Anker im Stack werfen
     PUSH DS           ; DS retten
     MOV  DS,[BP+12]   ; Pointer auf List
     MOV  SI,[BP+10]
     MOV  ES,[BP+8]    ; NewItem
     MOV  DI,[BP+6]
     MOV  DX,[SI+2]    ; List = Nil ?
     CMP  DX,0
     JE   II1
     PUSH ES           ; Call by Reference NewItem^.Content
     MOV  DX,DI
     ADD  DX,4
     PUSH DX
     PUSH [SI+2]       ; Call by Reference List^.Content
     MOV  DX,[SI]
     ADD  DX,4
     PUSH DX
     CALL GREATERSTRING
     CMP  AX,0         ; NewItem^.Content <= List^.Content
     JE   II1
     PUSH [SI+2]       ; Call by Reference List^.Next
     PUSH [SI]
     PUSH ES           ; Call by Value NewItem
     PUSH DI
     CALL INSERTITEM   ; Einfuegen beim naechsten Listenelement probieren
     JMP  II2
II1: MOV  DX,[SI]      ; NewItem^.Next := List
     MOV  ES:[DI],DX
     MOV  DX,[SI+2]
     MOV  ES:[DI+2],DX
     MOV  [SI],DI      ; List := NewItem
     MOV  [SI+2],ES
II2: POP  DS           ; DS restaurieren
     POP  BP           ; BP restaurieren
     RET  8            ; ein Referenz- und ein Pointer-Wertparameter vom Stack
INSERTITEM ENDP
SHOWLIST PROC FAR
     PUSH BP           ; BP retten
     MOV  BP,SP        ; Anker im Stack werfen
     PUSH DS           ; DS retten
     MOV  DS,[BP+8]
     MOV  DX,DS        ; List = Nil ?
     CMP  DX,0
     JE   SL3
     MOV  BX,[BP+6]    ; Pointer auf List^.Content (DS siehe oben)
     ADD  BX,4
     MOV  CH,0         ; Zeichenkettenlaenge
     MOV  CL,[BX]
     CMP  CX,0         ; Laenge Zeichenkette = 0 ?
     JE   SL2
SL1: INC  BX           ; Pointer in Zeichenkette weiterschalten
     MOV  AH,2         ; DOS-Funktion Write Character
     MOV  DL,[BX]      ; Zeichen aus Zeichenkette
     INT  21h
     LOOP SL1          ; naechstes Zeichen ausgeben
SL2: MOV  AH,2         ; DOS-Funktion Write Character
     MOV  DL,13        ; Carriage-Return
     INT  21h
     MOV  DL,10        ; Line-Feed
     INT  21h
     MOV  BX,[BP+6]    ; Pointer auf List^.Next (DS siehe oben)
     PUSH [BX+2]       ; Call by Value List^.Next
     PUSH [BX]
     CALL SHOWLIST     ; naechste Zeichenkette ausgeben
SL3: POP  DS           ; DS restaurieren
     POP  BP           ; BP restaurieren
     RET  4            ; ein Pointer-Wertparameter vom Stack
SHOWLIST ENDP
CODE ENDS
     END