Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Inline-ASM: Virtuelle Funktion aufrufen (https://www.delphipraxis.net/92573-inline-asm-virtuelle-funktion-aufrufen.html)

DGL-luke 22. Mai 2007 15:32


Inline-ASM: Virtuelle Funktion aufrufen
 
Hallo,

ich bin hier gerade komplett ohen Assembler-Vorkenntnisse dabei, in einer in Assembler geschriebenen Funktion rumzuschnüffeln.

In der wird folgendermaßen eine virtuelle Funktion gecallt:

Code:
call dword ptr [ecx].vmtCompare
In [ecx] steht die Instanz eines Nachfahren der Klasse, in der die virtuelle Funktion definiert ist. vmtCompare ist dabei eine Konstante, über die die Funktion komplett gecallt wird.
1. ist das sauber? kann sich das nicht verschieben, so dass die Konstante dann auf einen falschen Bereich zeigt?
2. Wie macht mans sauber?

JasonDX 22. Mai 2007 19:38

Re: Inline-ASM: Virtuelle Funktion aufrufen
 
Zitat:

Zitat von DGL-luke
1. ist das sauber? kann sich das nicht verschieben, so dass die Konstante dann auf einen falschen Bereich zeigt?

Die Konstante vmtCompare ist eine Konstante, die zur Compiletime festgelegt wird. in der Virtual Method Table hinterlegt der Linker die Adressen für die virtuellen Methoden. VmtCompare zeigt auf die Adresse (relativ zum Instanzzeiger), in der die Adresse für die überschriebene Compare(?)-Funktion steht. Der Punkt in der VMT, wo die Adresse von Compare steht, bleibt immer der selbe. Der wird zur Compiletime festgelegt und bleibt dort. Deswegen kann sich das nicht verschieben. (Etwas anders ist es bei Interfaces).

Zitat:

Zitat von DGL-luke
2. Wie macht mans sauber?

IMO so wie gemacht ;)

greetz
Mike

DGL-luke 22. Mai 2007 20:29

Re: Inline-ASM: Virtuelle Funktion aufrufen
 
:gruebel:

Aber die Konstante ist doch definiert...

Delphi-Quellcode:
const
  offsetLLink = 4;
  offsetRLink = 8;
  vmtCompare = 12;     // TBalancedTree.Compare, TAVLtreeNode.Compare
  vmtCompareKeys = 16; // TAVLtree.CompareKeys

JasonDX 22. Mai 2007 20:46

Re: Inline-ASM: Virtuelle Funktion aufrufen
 
Hm, dann hab ich Delphi etwas zu viel CompilerMagic zugetraut *g*
Nein, also die Position in der VMT sollte sich trotzdem ned verschieben, solang nicht in der selbigen Klasse weitere virtuelle Methoden hinzugefügt werden. Dass die Konstante hardcodiert dazugeschmissen wird ist vllt nicht die perfekte Methode, aber da ansonsten nur der Compiler weiß, wo die Adresse in der VMT stehen wird wüsste ich jetzt keine bessere Lösung. Es sei denn Delphi bietet tatsächlich ein entsprechendes Feature.

greetz
Mike

DGL-luke 22. Mai 2007 20:51

Re: Inline-ASM: Virtuelle Funktion aufrufen
 
Vielleicht weiß es ja jemand da draußen...

Dax 22. Mai 2007 21:04

Re: Inline-ASM: Virtuelle Funktion aufrufen
 
Funktioniert es denn damit? Sowas hatte ich noch in Erinnerung...

Delphi-Quellcode:
asm
  call dword ptr TClass[ecx].Compare
end;

DGL-luke 22. Mai 2007 21:06

Re: Inline-ASM: Virtuelle Funktion aufrufen
 
So hab ichs selber schon probiert. Dat wirft aber. AV.

Dax 22. Mai 2007 21:31

Re: Inline-ASM: Virtuelle Funktion aufrufen
 
Stimmt, das war für statische Funktionen. Für virtuelle gilt dies:
Delphi-Quellcode:
asm
  mov edx, [edx]
  call dword ptr [edx + vmtoffset tcall.function]
end;

DGL-luke 23. Mai 2007 16:47

Re: Inline-ASM: Virtuelle Funktion aufrufen
 
danke, werd ich ausprobieren.

EDIT: tut wunderbar. :love:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:05 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz