Entwickler-Ecke

Algorithmen, Optimierung und Assembler - [Delphi] Return Adresse ändern


NewMori - Do 13.05.10 14:43
Titel: [Delphi] Return Adresse ändern
Hallo,
das ist mein erster Beitrag hier, deshalb hoffe ich, dass ich das richtige Forum gewählt habe. Es geht darum, dass ich in Delphi über Assembler eine Methode mittels jmp aufrufe. Jetzt weis ich allerdings nicht wo die Methode hinspringt, wenn sie beendet wird, ich habe vorher auf den Stack die Rücksprung-Adresse geschrieben (da es eine andere Adresse als die aufrufende Stelle ist). Meine Frage ist jetzt: Nutzt Delphi die Adresse auf dem Stack, oder muss ich es in die Adresse eines Registers, etc. schreiben?


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 13.05.2010 um 14:53
Moderiert von user profile iconNarses: Titel geändert.


jaenicke - Do 13.05.10 15:07

Hallo und :welcome:

Am Ende einer Methode in Delphi steht ein ret, mit dem an die auf dem Stack hinterlegte Rücksprungadresse zurückgesprungen wird. Wenn diese dort also korrekt hinterlegt ist, dann springt das Programm auch dorthin.


NewMori - Do 13.05.10 15:11

Vielen Dank jaenicke,
das was was ich gesucht habe, da ich nicht mehr wusste wo die Rücksprungadresse gespeichert wird, wusste ich nicht ob Delphi nicht doch ihrgendwo anders einen anderen Eintrag mit der Sprungadresse anlegt.


BenBE - Do 13.05.10 17:44

Je nach Aufruf-Konvention kann das Layout der Daten auf dem Stack etwas variieren. Insbesondere was die Stelle der Parameter und der Rücksprungadresse angeht. Für die register-Direktive (Standard bei Delphi) hat man zumindest erst die Argumente, dann die Rücksprungadresse, dann den Pointer für's Stackframe und dann lokale Variablen. Wenn Du also innerhalb einer anderen Methode bist, musst du deren Stack-Layout auch mit beachten.


NewMori - Do 13.05.10 20:03

@BenBE: Das wusste ich, aber Danke trotzdem. Du sagtest Parameter auf dem Stack, ich habe gelesen, das die ersten drei Parameter mit EAX,EBX und ECX übergeben werden und dann erst auf den Stack geladen wird.


BenBE - Do 13.05.10 20:07

Wo Parameter übergeben werden hängt wie gesagt von der Aufrufkonvention ab.

Die ersten 3 wären aber trotzdem eher in EAX, EDX, ECX zu finden. Zumindest für register.
Bei stdcall und cdecl wird z.B. alles über den Stack abgewickelt, wobei man dann noch die Reihenfolge der Übergabe beachten muss.

EBX hat, genauso wie ESI und EDI, eine andere Aufgabe.


NewMori - Do 13.05.10 20:12

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
Die ersten 3 wären aber trotzdem eher in EAX, EDX, ECX zu finden.

Ich wusste das ihrgendwas falsch war :oops:. Jetzt hab ichs endlich richtig hinbekommen.