CSEG SEGMENT 'CODE' ASSUME CS:CSEG,DS:DSEG1,ES:DSEG2 BENNO PROC ; program benno; ; var a,b,cc,ddd : integer; ; begin ; a := 10; ; b := 20; ; addi(a,b,cc); ; ddd := cc ; end. MOV AX,DSEG1 ; DS initialisieren MOV DS,AX MOV AX,DSEG2 ; ES initialisieren MOV ES,AX MOV A,10 ; A := 10 MOV B,20 ; B := 20 MOV AX,SEG A ; Referenzparameter A auf den Stack PUSH AX MOV AX,OFFSET A PUSH AX MOV AX,SEG B ; Referenzparameter B auf den Stack PUSH AX MOV AX,OFFSET B PUSH AX MOV AX,SEG CC ; Referenzparameter CC auf den Stack PUSH AX MOV AX,OFFSET CC PUSH AX CALL ADDI ; ADDI(A,B,CC) MOV AX,CC ; DDD := CC MOV DDD,AX MOV AX,4C00h ; Programmende mit Exitcode 0 INT 21h BENNO ENDP ADDI PROC ; procedure addi(x,y,z:integer); ; begin ; z := x+y ; end; PUSH BP ; BP sichern MOV BP,SP ; Anker werfen PUSH DS ; DS, AX und BX sichern PUSH AX PUSH BX MOV DS,[BP+14] ; AX := X MOV BX,[BP+12] MOV AX,[BX] MOV DS,[BP+10] ; AX := AX+Y MOV BX,[BP+8] ADD AX,[BX] MOV DS,[BP+6] ; Z := AX MOV BX,[BP+4] MOV [BX],AX POP BX ; BX, AX und DS ruecksichern POP AX POP DS POP BP ; BP ruecksichern RET 12 ; Ruecksprung und drei Referenzparameter vom Stack ADDI ENDP CSEG ENDS ; getrennte Datensegmente zur Demonstration von ASSUME DSEG1 SEGMENT 'DATA' ; enthaelt ddd adressiert via DS DDD DW ? DSEG1 ENDS DSEG2 SEGMENT 'DATA' ; enthaelt a, b und cc adressiert via ES A DW ? B DW ? CC DW ? DSEG2 ENDS SSEG SEGMENT STACK DW 256 DUP (?) SSEG ENDS END BENNO