home *** CD-ROM | disk | FTP | other *** search
- { **************************************************************
- Datei: PARAMS.PAS
- --------------------------------------------------------------
- Autor: Sven Letzel
- Datum: 12.04.1993
- Funktion: Demonstriert Zugriff auf Parameter in ASM-Prozeduren
- **************************************************************}
-
- {$IFDEF Windows} USES WinCrt; {$ENDIF}
-
- TYPE
- ParaRec = RECORD { ** Ein beliebiger Typ, länger ** }
- a,b,c,d: WORD; { ** als 4 Bytes ** }
- END;
-
- VAR
- aRec: ParaRec; { ** Instanz des Types ** }
-
- PROCEDURE TestPara01(a: ParaRec);
- { ** Prozedur nicht als ASSEMBLER deklariert,
- Parameter nicht als VAR ** }
- BEGIN
- ASM
- Inc a.a { ** Zugriff auf A, hat aber keine ** }
- { Wirkung, da A nicht als VAR deklariert
- les di, A
- mov word ptr es:[di], 0
- Diese Anweisungen sind unzulässig, da der Compiler erkennt,
- daß es sich um keinen VAR-Parameter handelt.
- }
- END;
- END;
-
- PROCEDURE TestPara02(a: ParaRec); ASSEMBLER;
- { ** Prozedur als ASSEMBLER deklariert
- A nicht als VAR, gilt aber trotzdem als VAR-Parameter ** }
- ASM
- LES DI, a { ** Lade ES:DI mit Zeiger auf A **}
- Inc WORD Ptr ES:[DI]
- END;
-
- PROCEDURE TestPara03(VAR a: ParaRec);
- { ** Prozedur nicht als ASSEMBLER deklariert,
- A als VAR-Parameter ** }
- BEGIN
- ASM
- LES DI, a { ** Lade ES:DI mit Zeiger auf A ** }
- Inc WORD Ptr ES:[DI]
- END;
- END;
-
- BEGIN
- aRec.a := 0;
- WriteLn('Wert von ARec.A zu Beginn: ', aRec.a);
- TestPara01(aRec); { ** ARec.A ist noch Null ** }
- WriteLn('Wert von ARec.A nach TESTPARA01: ', aRec.a);
- TestPara02(aRec); { ** ARec.A ist jetzt 1 !! ** }
- WriteLn('Wert von ARec.A nach TESTPARA02: ', aRec.a);
- TestPara03(aRec); { ** ARec.A ist jetzt 2 ** }
- WriteLn('Wert von ARec.A nach TESTPARA03: ', aRec.a);
- END.
-