Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Compiler ändert asm Code ? (https://www.delphipraxis.net/140239-compiler-aendert-asm-code.html)

Apollonius 14. Sep 2009 15:43

Re: Compiler ändert asm Code ?
 
Wenn du aus der Funktion herausjumpst, kann das die Zielfunktion übernehmen. Im Prinzip ist das ein Tailcall, auch wenn das manuelle Aufsetzen eines Stackframes etwas merkwürdig ist.

sirius 14. Sep 2009 16:06

Re: Compiler ändert asm Code ?
 
ach, ich dachte der jump war nur so ein test

TKC 27. Apr 2010 19:56

Re: Compiler ändert asm Code ?
 
Zitat:

Zitat von Apollonius
Ich finde das auch extrem lästig. In C++ würde man das mit __declspec(naked) lösen; in Delphi gibt es das nicht. Als hässlichen Workaround kannst du die Parameter sowie das stdcall weglassen. Wenn du die Funktion dann aus Delphi-Code aufrufen willst, nimmst du @xPostMessage und castest in einen entsprechenden Funktionszeigertypen, sodass du die Funktion mit Parametern aufrufen kannst.

Hallo,
ich muss das jetzt doch noch einmal ausgraben .. kann mir jemand an einem Beispiel zeigen wie ich so einen Typecast machen muss ?

Danke

TKC 9. Mai 2010 10:08

Re: Compiler ändert asm Code ?
 
Hi,
muss das leider nochmal hochholen. Wär klasse wenn mir jemand nen beispiel hat.
Danke.

jaenicke 9. Mai 2010 11:00

Re: Compiler ändert asm Code ?
 
Delphi-Quellcode:
procedure TestMe();
begin

end;

type
  TTestFunc = function(hWnd: hWnd; Msg: UINT; wParam: wParam; lParam: lParam): BOOL; stdcall;
var
  TestFunc: TTestFunc;
begin
  TestFunc := @TestMe;
  TestFunc(0, 0, 0, 0);
end;
So sollte es gehen.

himitsu 9. Mai 2010 11:18

Re: Compiler ändert asm Code ?
 
Der automatisch erzeugte Eintritts- und Austrittscode (genannt Stack-Frame):
Delphi-Quellcode:
PUSH   EBP            // Vorhanden wenn Locals <> 0 oder Params <> 0
MOV    EBP, ESP       // Vorhanden wenn Locals <> 0 oder Params <> 0
SUB    ESP, Locals    // Vorhanden wenn Locals <> 0
PUSH   ECX            // -
...
MOV    EAX, [EBP-4]   // Vorhanden wenn nachdem Result etwas zugewiesen wurde auch noch EAX
                        // etwas zugewiesen wird, in diesem Fall wird für Result [EBP-4] statt
                        // EAX verwendet - wenn Result <= Integer
POP    ECX            // -
MOV    ESP, EBP       // Vorhanden wenn Locals <> 0
POP    EBP            // Vorhanden wenn Locals <> 0 oder Params <> 0
RET    Params         // Immer vorhanden
Dazu kommt dann noch die Behandlung von
{$W+} oder {$STACKFRAMES ON}
[equote="OH satgt zu ''Stack-Frames (Delphi)''"]Die Direktive $W steuert die Erzeugung von Stack-Frames für Prozeduren und Funktionen. Im Status {$W+} werden Stack-Frames für Prozeduren und Funktionen auch dann erzeugt, wenn sie nicht benötigt werden. Im Status {$W-} werden Stack-Frames nur generiert, wenn die Verwendung lokaler Variablen durch die Routine dies erforderlich macht. [/equote]

TKC 9. Mai 2010 11:59

Re: Compiler ändert asm Code ?
 
Zitat:

Zitat von jaenicke
Delphi-Quellcode:
procedure TestMe();
begin

end;

type
  TTestFunc = function(hWnd: hWnd; Msg: UINT; wParam: wParam; lParam: lParam): BOOL; stdcall;
var
  TestFunc: TTestFunc;
begin
  TestFunc := @TestMe;
  TestFunc(0, 0, 0, 0);
end;
So sollte es gehen.

Vielen Dank ich werde es gleich mal probieren und Bericht erstatten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 Uhr.
Seite 3 von 3     123   

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