home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / das_buch / asemblr / pas / params.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-06-05  |  1.9 KB  |  62 lines

  1. { **************************************************************
  2.   Datei: PARAMS.PAS
  3.   --------------------------------------------------------------
  4.   Autor: Sven Letzel
  5.   Datum: 12.04.1993
  6.   Funktion: Demonstriert Zugriff auf Parameter in ASM-Prozeduren
  7.   **************************************************************}
  8.  
  9. {$IFDEF Windows} USES WinCrt; {$ENDIF}
  10.  
  11. TYPE
  12.   ParaRec = RECORD          { ** Ein beliebiger Typ, länger ** }
  13.     a,b,c,d: WORD;          { ** als 4 Bytes ** }
  14.   END;
  15.  
  16. VAR
  17.   aRec: ParaRec;            { ** Instanz des Types ** }
  18.  
  19. PROCEDURE TestPara01(a: ParaRec);
  20. { ** Prozedur nicht als ASSEMBLER deklariert,
  21.   Parameter nicht als VAR ** }
  22. BEGIN
  23.   ASM
  24.     Inc a.a              { ** Zugriff auf A, hat aber keine ** }
  25.     {                     Wirkung, da A nicht als VAR deklariert
  26.     les di, A
  27.     mov word ptr es:[di], 0
  28.     Diese Anweisungen sind unzulässig, da der Compiler erkennt,
  29.     daß es sich um keinen VAR-Parameter handelt.
  30.     }
  31.   END;
  32. END;
  33.  
  34. PROCEDURE TestPara02(a: ParaRec); ASSEMBLER;
  35. { ** Prozedur als ASSEMBLER deklariert
  36.   A nicht als VAR, gilt aber trotzdem als VAR-Parameter ** }
  37. ASM
  38.   LES DI, a                 { ** Lade ES:DI mit Zeiger auf A **}
  39.   Inc WORD Ptr ES:[DI]
  40. END;
  41.  
  42. PROCEDURE TestPara03(VAR a: ParaRec);
  43. { ** Prozedur nicht als ASSEMBLER deklariert,
  44.      A als VAR-Parameter ** }
  45. BEGIN
  46.   ASM
  47.     LES DI, a               { ** Lade ES:DI mit Zeiger auf A ** }
  48.     Inc WORD Ptr ES:[DI]
  49.   END;
  50. END;
  51.  
  52. BEGIN
  53.   aRec.a := 0;
  54.   WriteLn('Wert von ARec.A zu Beginn:       ', aRec.a);
  55.   TestPara01(aRec);          { ** ARec.A ist noch Null ** }
  56.   WriteLn('Wert von ARec.A nach TESTPARA01: ', aRec.a);
  57.   TestPara02(aRec);          { ** ARec.A ist jetzt 1 !! ** }
  58.   WriteLn('Wert von ARec.A nach TESTPARA02: ', aRec.a);
  59.   TestPara03(aRec);          { ** ARec.A ist jetzt 2 ** }
  60.   WriteLn('Wert von ARec.A nach TESTPARA03: ', aRec.a);
  61. END.
  62.