Entwickler-Ecke
Algorithmen, Optimierung und Assembler - Aufruf einer überladenen Function in ASM
BenBE - Mo 24.01.05 21:18
Titel: Aufruf einer überladenen Function in ASM
Ich hab ein kleineres Problem mit dem Inline-Assembler von Delphi (Speziell D5, muss aber auch unter D6 und D7 laufen):
Ich hab versucht die überladene Routine ComplexConv aufzurufen, die so definiert ist:
Delphi-Quelltext
1: 2:
| Function ComplexConv(var A:TComplexAbs):TComplexRad;overload; Function ComplexConv(var A:TComplexRad):TComplexAbs;overload; |
Weiterhin hab ich eine Routine ComplexSin (auch überladen)
Delphi-Quelltext
1: 2:
| Function ComplexSin(var A: TComplexAbs): TComplexAbs;Overload; Function ComplexSin(var A: TComplexRad): TComplexRad;Overload; |
Wovon die Implementation der Routine für 0x8E (die zweite) so hier aussieht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Function ComplexSin(var A: TComplexRad): TComplexRad;Overload; var Tmp: TComplexAbs; AsM PUSH EDX LEA EDX, DWORD PTR [Tmp] CALL ComplexConv(TComplexRad) LEA EAX, DWORD PTR [Tmp] MOV EDX, EAX CALL ComplexSin(TComplexAbs) LEA EAX, DWORD PTR [Tmp] POP EDX CALL ComplexConv(TComplexAbs) end; |
Das führt aber, trotz der Parameter-Typangaben in den CALL-Aufrufen zu folgendem Code (Laut DCUExplorer)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| function ComplexSin (var A: TComplexRad): TComplexRad; overload; var result Result: TComplexRad; local Tmp: TComplexAbs; ASM
PUSH EBP
MOV EBP,ESP
ADD ESP,-20
PUSH EDX
LEA EDX,DWORD PTR [EBP-20]
CALL K2 ComplexConv
LEA EAX,DWORD PTR [EBP-20]
LEA EDX,DWORD PTR [EBP-20]
CALL K2 ComplexSin
LEA EAX,DWORD PTR [EBP-20]
POP EDX
CALL K2 ComplexConv
MOV ESP,EBP
POP EBP
RET NEAR end; |
An der hervorgehobenen Stelle müsste aber 0x17 als Referenz stehen? Wie kann man Delphi sagen, welche der überladenen Versionen aufgerufen wird?
patrick - Mi 26.01.05 13:37
normalerweise sollte er das selbstständig rausfinden, je nachdem ob du ein
TComplexRad oder eine TComplexAbs variable übergibst.
ansonsten:
die routine nicht überladen sondern getrennte routinen schreiben :cry:
uall@ogc - Mi 26.01.05 14:32
das bezieht sich auf die frage die du mir per PN geschickt hast
-> leider kenne ich den befehl nicht wo man delphi sagen kann welche der beiden funktionen es benutzen soll (falls es ihr überhaupt gibt) ABER
da delphi es normaler weise aus dem context raus erkennt und weiß welche parameter übergeben wurden (also reines pascal, nicht ASM)
kann delphi entscheiden welche funktion benutzt werden soll
bei assembler siehts anders aus delphi wird auf KEINEM fall SELSBT erkennen können um welche funktion es sich handelt
da ein push vor einem call theoretisch gar nicht zur funktion gehören muss oder die parameter per register übregeben wird oder noch andere anweisungen dazwischen liegen
das war nicht deine frage, aber da es sich hier um assemler handelt der eigentlich bischen umgeschrieben auch bei anderen programmiersprachen funktioneren sollte denke ich mal nicht das die programmierer von borland da extra für die CALL anweisung etwas delphicompiler spezifisches eingebaut haben sodas man sagen kann welche von den beiden funktionen benutzt werden soll
d.h. aber nicht das es das nicht gibt, ich kenns nicht und halte es für unwahrscheinlich
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!