Self sollte in EAX stehen, muß aber nicht unbedingt. Wenn zB. die aufgerufene Methode statisch ist und keinerlei Zugriffe auf Self macht und keine weiteren Methoden aufruft, dann wird Self nicht benötigt. Dies ist aber extrem selten der Fall.
In EAX in einer Methode steht also entweder das Object selber, oder aber bei Klassenmethoden der Klassentyp der Klasse.
Nun, je nachdem was für eine Methode aufgerufen wird unterscheidet sich der Assembler:
Delphi-Quellcode:
type
TMyObject =
class
procedure StaticMethod;
procedure VirtualMethod;
virtual;
procedure DynamicMethod;
dynamic;
class procedure ClassDynamicMethod;
dynamic;
end;
asm
CALL TMyObject.StaticMethod
MOV EDX,[EAX]
CALL DWord Ptr [EDX + VMTOffset TMyObject.VirtualMethod]
PUSH ESI
MOV ESI,DMTIndex TMyObject.DynamicMethod
CALL System.@CallDynaInst
MOV ESI,DMTIndex TMyObject.ClassDynamicMethod
CALL System.@CallDynaClass
POP ESI
end;
Es ist also sinnvoll in Assembler sich auf statische Methoden zu beschränken, da auch DMTIndex und VMTOffset nicht in jeder Delphi Version definiert sind.
Man sieht auch sehr schön das überschriebene Methoden "override" ein Problem darstellen können. Haben wir eine Objectdeklaration in der überschriebene Methoden vorkommen, so wissen wir nicht, ohne die Basisklassen zu kennen, ob es eine virtuelle oder dynamische Methode ist. Somit wissen wir dann auch nicht nach welcher Art & Weise wir im Assembler vorzugehen haben.
Gruß Hagen
PS: übrigens kann man das in der Hilfe zur Inline Assemblersyntax nachlesen