PUBLIC SWAPSM

DATA   SEGMENT PUBLIC ; hier ueberfluessig
; Der Bezeichner DATA darf nicht veraendert werden
DATA   ENDS

CODE   SEGMENT PUBLIC
       ASSUME CS:CODE,DS:DATA ; DS:DATA hier ueberfluessig
; Der Bezeichner CODE darf nicht veraendert werden

SWAPSM PROC
       PUSH BP
       MOV  BP,SP
       PUSH DS         ; DS sichern
       MOV  DI,[BP+4]  ; Obergrenze laden
       SHL  DI,1       ; Index := DI*2 (Worttabelle)
       MOV  SI,[BP+6]  ; Untergrenze laden
       SHL  SI,1       ; Index := SI*2 (Worttabelle)
       MOV  DS,[BP+14] ; Anfangsadresse Tabelle laden
       MOV  BX,[BP+12]
       MOV  AX,[BX+SI] ; Wort an Untergrenze mit
       XCHG AX,[BX+DI] ; Wort an Obergrenze vertauschen
       MOV  [BX+SI],AX
       MOV  DX,[BX+SI] ; DX : Maximum , hier Initialisierung
       MOV  AX,0       ; AX : Summe (Funktionswert) , hier Initialisierung
       MOV  CX,[BP+4]  ; CX : Differenz (Von,Bis) plus eins
       SUB  CX,[BP+6]
       INC  CX
LOOP1: CMP  DX,[BX+SI] ; Tabellenelement groesser gleich Maximum ?
       JGE  MAXOK
       MOV  DX,[BX+SI] ; Nein : Maximum korrigieren
MAXOK: ADD  AX,[BX+SI] ; Tabellenelement aufaddieren
       INC  SI         ; naechstes Tabellenelement bearbeiten (Worttabelle)
       INC  SI
       LOOP LOOP1
       MOV  DS,[BP+10] ; Adresse fuer Maximum laden
       MOV  BX,[BP+8]
       MOV  [BX],DX    ; Maximum setzen
       POP  DS         ; DS restaurieren
       MOV  SP,BP      ; nur bei lokalen Variablen sinnvoll
       POP  BP
       RET  12
SWAPSM ENDP

CODE   ENDS
       END