AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Inline-ASM: Virtuelle Funktion aufrufen

Ein Thema von DGL-luke · begonnen am 22. Mai 2007 · letzter Beitrag vom 23. Mai 2007
Antwort Antwort
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

Inline-ASM: Virtuelle Funktion aufrufen

  Alt 22. Mai 2007, 14:32
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?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#2

Re: Inline-ASM: Virtuelle Funktion aufrufen

  Alt 22. Mai 2007, 18:38
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 von DGL-luke:
2. Wie macht mans sauber?
IMO so wie gemacht

greetz
Mike
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Inline-ASM: Virtuelle Funktion aufrufen

  Alt 22. Mai 2007, 19:29


Aber die Konstante ist doch definiert...

Delphi-Quellcode:
const
  offsetLLink = 4;
  offsetRLink = 8;
  vmtCompare = 12; // TBalancedTree.Compare, TAVLtreeNode.Compare
  vmtCompareKeys = 16; // TAVLtree.CompareKeys
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von JasonDX
JasonDX
(CodeLib-Manager)

Registriert seit: 5. Aug 2004
Ort: München
1.062 Beiträge
 
#4

Re: Inline-ASM: Virtuelle Funktion aufrufen

  Alt 22. Mai 2007, 19:46
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
Mike
Passion is no replacement for reason
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Inline-ASM: Virtuelle Funktion aufrufen

  Alt 22. Mai 2007, 19:51
Vielleicht weiß es ja jemand da draußen...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#6

Re: Inline-ASM: Virtuelle Funktion aufrufen

  Alt 22. Mai 2007, 20:04
Funktioniert es denn damit? Sowas hatte ich noch in Erinnerung...

Delphi-Quellcode:
asm
  call dword ptr TClass[ecx].Compare
end;
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Inline-ASM: Virtuelle Funktion aufrufen

  Alt 22. Mai 2007, 20:06
So hab ichs selber schon probiert. Dat wirft aber. AV.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#8

Re: Inline-ASM: Virtuelle Funktion aufrufen

  Alt 22. Mai 2007, 20:31
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;
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Inline-ASM: Virtuelle Funktion aufrufen

  Alt 23. Mai 2007, 15:47
danke, werd ich ausprobieren.

EDIT: tut wunderbar.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz