Autor Beitrag
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: Mo 24.01.05 21:18 
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:

ausblenden Delphi-Quelltext
1:
2:
Function ComplexConv(var A:TComplexAbs):TComplexRad;overload//0x17
Function ComplexConv(var A:TComplexRad):TComplexAbs;overload//0x19


Weiterhin hab ich eine Routine ComplexSin (auch überladen)
ausblenden Delphi-Quelltext
1:
2:
Function ComplexSin(var A: TComplexAbs): TComplexAbs;Overload//0x89
Function ComplexSin(var A: TComplexRad): TComplexRad;Overload//0x8E


Wovon die Implementation der Routine für 0x8E (die zweite) so hier aussieht:

ausblenden 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
    //Tmp := ComplexConv(A);
    LEA     EDX, DWORD PTR [Tmp]
    CALL    ComplexConv(TComplexRad)
    //Tmp := ComplexSin(Tmp);
    LEA     EAX, DWORD PTR [Tmp]
    MOV     EDX, EAX
    CALL    ComplexSin(TComplexAbs)
    //Result := ComplexConv(Tmp);
    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)

ausblenden volle Höhe 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{BProc:80,D1_D:F8EDE043,VProc:9002,B0:0,Sz:27}
  (var A: {T#3}TComplexRad{F:B Ofs:0}): {T#3}TComplexRad; overload;
var
  result Result: {T#3}TComplexRad{F:B Ofs:1};
  local Tmp: {T#2}TComplexAbs{F:33 Ofs:-20};
ASM
//raw[0x27]at 0x302
{ 00: U      [55                  | }
         PUSH  EBP { OpCode : 3F }
{ 01: ‹ì     |8B EC               | }
         MOV   EBP,ESP { OpCode : 87 }
{ 03: ƒÄì    |83 C4 EC            | }
         ADD   ESP,-20 { OpCode : 31 }
{ 06: R      |52                  | }
         PUSH  EDX { OpCode : 3F }
{ 07: Uì    |8D 55 EC            | }
         LEA   EDX,DWORD PTR [EBP-20{ OpCode : F1 }
{ 0A: è....  |E8(00 00 00 00      | }
         CALL  K2 ComplexConv {0x19} { OpCode : 08 }
{ 0F: Eì    |8D 45 EC            | }
         LEA   EAX,DWORD PTR [EBP-20{ OpCode : F1 }
{ 12: Uì    |8D 55 EC            | }
         LEA   EDX,DWORD PTR [EBP-20{ OpCode : F1 }
{ 15: è....  |E8(00 00 00 00      | }
         CALL  K2 ComplexSin {0x89} { OpCode : 08 }
{ 1A: Eì    |8D 45 EC            | }
         LEA   EAX,DWORD PTR [EBP-20{ OpCode : F1 }
{ 1D: Z      |5A                  | }
         POP   EDX { OpCode : 40 }
{ 1E: è....  |E8(00 00 00 00      | }
         CALL  K2 ComplexConv {0x19} { OpCode : 08 }
{ 23: ‹å     |8B E5               | }
         MOV   ESP,EBP { OpCode : 87 }
{ 25: ]      |5D                  | }
         POP   EBP { OpCode : 40 }
{ 26: Ã      |C3                  | }
         RET   NEAR { OpCode : 01 }
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.
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 1481

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: 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:

_________________
Patrick
im zweifelsfall immer das richtige tun!!!
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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