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