Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Assembler: Oberste 2 Elemente des Stacks auslesen (https://www.delphipraxis.net/77852-assembler-oberste-2-elemente-des-stacks-auslesen.html)

Shaman 25. Sep 2006 19:56


Assembler: Oberste 2 Elemente des Stacks auslesen
 
Hey there

Ich mache meine ersten Gehversuche mit dem Inline-Assembler, komme nun aber nicht weiter.

Delphi-Quellcode:
procedure Test(var L, R: Integer);
asm
  mov R, [esp];
  mov L, [esp+4];
end;
Wie lese ich die obersten zwei Elemente (die ich vorhin gepusht habe) auf dem Stack aus? Irgendwie so sollte es doch gehen, oder?

Greets
Shaman

Dax 25. Sep 2006 20:03

Re: Assembler: Oberste 2 Elemente des Stacks auslesen
 
Nun, erstmal der Code:
Delphi-Quellcode:
procedure Test(var L, R: Integer);
asm
  mov ecx, [esp]
  mov [eax], ecx

  mov ecx, [esp+4]
  mov [edx], ecx
end;
Erklärung: durch das var wird der Compiler angewiesen, Pointer auf die Variablen zu übergeben. Parameterübergabereihenfolge ist EAX, EDX, ECX, Stack; von links nach rechts. Hier sind nur zwei Parameter, also sind die in EAX und EDX.

Da du immer nur einen Pointer dereferenzieren (die []) kannst, musst du einen Umweg über ein Hilfregister gehen, hier eben ECX.

PS: kann auch sein, das es [esp-4] sein muss, hab schon so ewig nix mehr mit Assembler gemacht :duck:

Shaman 25. Sep 2006 20:09

Re: Assembler: Oberste 2 Elemente des Stacks auslesen
 
Danke, genau das hatte ich mir versucht zu ergoogeln :thumb:

Zitat:

Zitat von Dax
Da du immer nur einen Pointer dereferenzieren (die []) kannst, musst du einen Umweg über ein Hilfregister gehen, hier eben ECX

Darauf bin ich beim Ausprobieren noch nicht gekommen :wink:

Zitat:

Zitat von Dax
PS: kann auch sein, das es [esp-4] sein muss, hab schon so ewig nix mehr mit Assembler gemacht

Es stimmt so, auch wenn mir nicht klar ist, warum...

Dax 25. Sep 2006 20:10

Re: Assembler: Oberste 2 Elemente des Stacks auslesen
 
Der Stack wächst nach unten: das aktuelleste Element (Stacktop) hat die niedrigste Speicheradresse ;)

Flocke 25. Sep 2006 20:44

Re: Assembler: Oberste 2 Elemente des Stacks auslesen
 
Zitat:

Zitat von Dax
Der Stack wächst nach unten: das aktuelleste Element (Stacktop) hat die niedrigste Speicheradresse ;)

Richtig. Und in dem Beispiel oben sollte [esp] die Rücksprungadresse sein und [esp+4] undefiniert (d.h. gehört der aufrufenden Funktion). [esp-4] wäre, wie alles unter esp, nicht belegter Stackspeicher. Dort landet der nächste Wert, der mit push auf den Stack gelegt wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 Uhr.

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