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