Hi,
wie kann ich unter C eine variable Anzahl an Werten auf den Stack legen?
Ich habe ein Programms und binaris (Quellcode nur teilweise), dass
bisher Hex-Werte als Steuerzeichen erhält. Dieser Quellcode soll orginal
bleiben.
Ich muss eine Art Kommandointerpreter hinzufügen, der Befehle von einem
Terminal erhält, diese auf den Stack schiebt und dann die Funktionen so
aufruft, wie die Hex-Routine tut. Die Hex-routine selbst muss dabei
erhalten bleiben. Je nach Schnittstelle (CAN oder RS232) wird entweder
die Hex-Funktion verwendet, oder der Interpreter.
Ich habe mir verschiede Parser und Interpreter aus der Codesammlung
angeschaut. Da sind die Funktionen so vorbereitet, dass die ihre Werte
aus einen array aus unions lesen. Das kann ich nicht machen. Ich muss
zur Laufzeit ermitteln, was ich wie auf den Stack schiebe und dann eine
Funktion aufrufen.
Dazu muss ich je nach Befehl immer andere Daten auf den Stack schreiben,
nur wie mach ich das in C? Ich kenne stdarg um eine variale Anzahl an
Parametern vom Stack zu holen, wie heißen die Umkehrfunktionen dafür?
Emax
Das kommt darauf an, welcher ABI die jeweilige Compilerimplementierung
folgt.
Der einzig sinnvolle Weg, eine nicht-ABI-konforme (Assembler)-Funktion
mit den Parametern zu versorgen, die sie braucht, ist einen
Assembler-Wrapper zu schreiben, die die Funktion so einpackt, daß sie
ABI-konfirm ist und von Compiler-Ebene aus verwendbar wird.
Was ich mir hier als Schweinerei vorstellen könnte:
Man könnte sich die zu übergebenden Bereiche in einem
anderen Puffer zusammenbauen und den als eine Folge von z.B int
interpretieren.
Dann ruft man eine passende aus einem Satz von Funktionen auf,
die dann die nötige Anzahl Werte aus dem Puffer nimmt und als
Parameter an deine Endfunktion liefert.
Also etwa so:
Voraussetzungen in diesem Beispiel:
- int werden auf dem aktuellen System direkt hintereinander übergeben
- die aufgerufene Funktion bekommt als erstes eine int, in der
drin steht, wie viel Werte kommen (irgendwie muß sie ja
erkennen, was da kommt)
- maximal 4 int in dieser Form
- man muß zusehen, daß die Felder reichen
Was auch eventuell geht:
Dazu muss aber der Argumentpassing Mechanismus vom C Compiler und das
was die Assemblerfunktion auf dem Stack haben möchte, absolut kompatibel
sein. Ist das nicht der Fall, kannst du das gleich alles wieder
vergessen.
Schweinereien mit einem Funktionspointer.
Du definierst dir einen Haufen typedefs, die alle möglichen
Aufrufargumentlisten abdecken.
Dann holst du dir die Adresse der Assemblerfunktion, castest den Pointer
mit dem richtigen typedef zurecht und rufst die Funktion auf.
Im Prinzip ähnlich zu dem, was Klaus weiter oben gezeigt hat.
Aber ich fürchte das Problem wird einfach sein, dass die Assembler
Funktion einen völlig anderen Argument Passing Mechanismus benutzt, als
dein C Compiler. Ich schätze ohne eine Assembler Zwischenschicht wird
das nichts werden.
holger schrieb:>>Wenn es überhaupt geht, dann nur mit Assembler und/oder Schweinereien.>> Z.B. malloc(). Igitt;)
6, setzen! Wir reden hier über den Stack!
Hallo, ich danke euch sehr für die Antworten, Anregungen und Beispiele!
Ich werde es nach dem Vorschlag von Klaus Wachtler realisieren,
reserviere also eine Anzahl an char auf dem Stack und caste die dann
irgendwie da drauf.
Gruß Emax