Delphi-Forum.de Delphi-Library.de
C-Sharp-Forum.de C-Sharp-Library.de
Registrieren Login Suche Hilfe Sitemap
Aufruf einer überladenen Function in ASM
spacer
Autor Nachricht
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Nussknacker 2009 - 1. Rang

Beiträge: 8070
Erhaltene Danke: 20
Dabei seit: 16.07.2004
Wohnort: Jahnsdorf

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, L0.9\FPC2.0
BeitragVerfasst: Mo 24.01.05 21:18  Antworten mit Zitat Beitrag melden
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 markieren
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 markieren
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 markieren
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 markieren
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.
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
patrick
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star

Beiträge: 1481
Dabei seit: 11.06.2002
Wohnort: Känche

WIN2k, WIN XP
D6 Personal, D2005 PE
BeitragVerfasst: Mi 26.01.05 13:37  Antworten mit Zitat Beitrag melden
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!!!
Private Nachricht sendenPosting in privater Nachricht zitieren Webseite dieses Mitglieds besuchen
uall@ogc
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star

Beiträge: 1785
Dabei seit: 13.08.2004


Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: Mi 26.01.05 14:32  Antworten mit Zitat Beitrag melden
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
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Beiträge vom vorherigen Thema anzeigen:   
home home