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 ?