s2ext
Technisches => Programmiererforum => Thema gestartet 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
-
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 :/ )
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.
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.
-
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