Einzelnen Beitrag anzeigen

Benutzerbild von kwhk
kwhk

Registriert seit: 25. Mär 2009
Ort: Dresden
168 Beiträge
 
Delphi 10.3 Rio
 
#1

Funktionen in Assembler unter Delphi 7

  Alt 12. Jul 2013, 15:28
In früheren Zeiten, als die CPUs noch langsamer waren, als heute, wurde ja auf jedes kleine etwas geachtet, um CPU-Zeit einzusparen. Eine Möglichkeit in Turbo-Pascal und Delphi waren die Assembler-Functionen. Die gaben das Ergebnis direkt im AX-Register zurück. (Muss das heute evtl. EAX sein ?) Im folgenden zwei Functionen, mit denen jeweils das Hi- oder Lo-Word eines Longint-32bit-Wertes ausgelesen werden soll. Die Function bestand nur aus einem einzigen Assembler-Befehl.
Delphi-Quellcode:
Function HiWord(Zahl:Longint):Word; Assembler;
  ASM
    MOV AX,Word Ptr [Zahl+2]
  End;

Function LoWord(Zahl:Longint):Word; Assembler;
  ASM
    MOV AX,Word Ptr [Zahl+0]
  End;
Unter Delphi 7 bringt diese Function einen Laufzeitfehler. Ich habe sie folgendermassen abgeändert, damit es funktioniert. Es sind keine Assembler-Functionen mehr. Mit ASM wird nur noch auf local vereinbarte Variable zugegriffen.
Delphi-Quellcode:
Function HiWord(pZahl:Longint):Word;
  Var
    Zahl : Longint;
    hiZahl : Word;
  Begin
    Zahl := pZahl;
    ASM
      MOV AX,Word Ptr [Zahl+2]
      MOV [hiZahl],AX
    End;
    Result := hiZahl;
  End;

Function LoWord(pZahl:Longint):Word;
  Var
    Zahl : Longint;
    loZahl : Word;
  Begin
    Zahl := pZahl;
    ASM
      MOV AX,Word Ptr [Zahl+0]
      MOV [loZahl],AX
    End;
    Result := loZahl;
  End;
Natürlich könnte man es auch anders und ohne ASM machen, meine Frage: kann ich im ASM-Bereich nicht mehr auf die übergebenen Parameter zugreifen ?
Hartmut

Geändert von kwhk (12. Jul 2013 um 15:31 Uhr)
  Mit Zitat antworten Zitat