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