s2ext

Technisches => Programmiererforum => Thema gestartet von: SJK am März 24, 2008, 20:48:48 Nachmittag

Titel: Aufrufkoventionen
Beitrag von: SJK am März 24, 2008, 20:48:48 Nachmittag
Hi Leute!

Habe zuletzt ein DLL-basiertes Plug-In-System in Delphi geschrieben. Dazu hab ich eine Methode gebastelt, die das Aufrufen externer Routinen mit dynamischer Parameterliste ermöglicht, d. h. ich kann alle möglichen Procs aufrufen, egal wie viele Parameter sie hat und welchen Datentyp Parameter und Rückgabewert haben.

Dabei bin ich über Aufrufkonventionen gestolpert.

Das war auch kein Problem, aber ich würde gerne mal wissen, wofür man so viele verschiedene Konventionen braucht? Die meisten unterscheiden sich ja nur in der Weise, in welcher Reihenfolge die Parameter in die Register geschrieben werden. Heutige Prozessoren können werden doch mit allen fertig... warum gibt es trotzdem so viele?

Und ist es möglich herauszufinden, mit welcher Aufrufkonvention eine bestimmte Routine aufgerufen werden muss? Denn wenn man die falsche nimmt, dann gibts nen Fehler...

LG
Titel: Re: Aufrufkoventionen
Beitrag von: bizzl am März 24, 2008, 21:23:51 Nachmittag
Zitat von: "SJK"
Hi Leute!

Habe zuletzt ein DLL-basiertes Plug-In-System in Delphi geschrieben. Dazu hab ich eine Methode gebastelt, die das Aufrufen externer Routinen mit dynamischer Parameterliste ermöglicht, d. h. ich kann alle möglichen Procs aufrufen, egal wie viele Parameter sie hat und welchen Datentyp Parameter und Rückgabewert haben.

Dabei bin ich über Aufrufkonventionen gestolpert.

Das war auch kein Problem, aber ich würde gerne mal wissen, wofür man so viele verschiedene Konventionen braucht? Die meisten unterscheiden sich ja nur in der Weise, in welcher Reihenfolge die Parameter in die Register geschrieben werden.
Programmiersprachen sind natürlich gewachsene Dinge. Verschiedene Compilerentwickler haben halt verschiedene Regelungen lieber gemacht (sehen wir heute noch beim Namewrangling in C++APIs :/ )

Zitat von: "SJK"
Heutige Prozessoren können werden doch mit allen fertig... warum gibt es trotzdem so viele?
Calling Conventions haben nix mit dem Prozessor zutun, der kennt weder lange Parameterlisten noch andere Komplexe Codegebilde (kein übliches if, keine Schleifen, keine Operationen mit mehr als 2 Werten, und gesprungen wird mit einem GOTO-Äquivalent)
Die Conventionen sind für die Codegeneriung da, sie definieren in welcher reihenfolge die Parameter auf dem Stack kommen, wer sie dort wieder raus holt und wo der Rückgabewert landet.

Zitat von: "SJK"
Und ist es möglich herauszufinden, mit welcher Aufrufkonvention eine bestimmte Routine aufgerufen werden muss? Denn wenn man die falsche nimmt, dann gibts nen Fehler...
Im allgemeinen wird unter Windows immer stdcall und auf allen anderen OS cdecl benutzt. Andere Conventionen sind ungebräuchlich.
Titel: Re: Aufrufkoventionen
Beitrag von: SJK am März 25, 2008, 11:10:51 Vormittag
Hey Bizzl!

Danke für die Antwort.

Das mit stdcall stimmt, ist meistens so...

Aber wenn ich tatsächlich mal eine Routine habe, von der ich nicht weiß, mit welcher Convention sie aufgerufen werden muss, bleibt mir eig nur die brutale Möglichkeit, alle durchzuprobieren und die zu Konvention zu nehmen, bei der das Programm nicht abstürzt?!

Na wunderbar^^

Aber mit dem integrierten Assembler von Delphi werd ich das wohl hinkriegen...

Gruß, Sascha