![]() |
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:
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.
call dword ptr [ecx].vmtCompare
1. ist das sauber? kann sich das nicht verschieben, so dass die Konstante dann auf einen falschen Bereich zeigt? 2. Wie macht mans sauber? |
Re: Inline-ASM: Virtuelle Funktion aufrufen
Zitat:
Zitat:
greetz Mike |
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 |
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 |
Re: Inline-ASM: Virtuelle Funktion aufrufen
Vielleicht weiß es ja jemand da draußen...
|
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; |
Re: Inline-ASM: Virtuelle Funktion aufrufen
So hab ichs selber schon probiert. Dat wirft aber. AV.
|
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; |
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