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)
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?
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.