Hallo! Ich habe ein Projekt auf einem ATMega644 übernommen, welches komplett in Assembler geschrieben wurde. Da viele Erweiterungen zu programmieren sind, möchte ich dies gern in C erledigen. Gibt es Beispiele, wie C-Code in einem Assemblerprojekt eingesetzt wird? Danke für eure Hilfe Gruß Mirko
Guten Morgen, du kannst assembler code zum beispiel so in C einbinden:
1 | asm("NOP"); |
in der klammer kommt immer direkt dein befehl rein. Grüße e-tec
ups ja monatag morgen... kleiner dreher...kommt davon :) also du solltest (meiner meinung nach) dass projekt in c schreiben und alle stellen wo du nicht richtig mit dem compiler einverstanden bist selbst ersetzen. so mache ich es momentan, vielleicht gibt es ja noch eine bessere lösung bin schon gespannt ;)
Micha s. hat recht. Du willst nicht C Code in einem Assembler Projekt einsetzen sondern maximal umgekehrt Assembler in einem C-Projekt benutzen, falls das überhaupt notwendig ist und nicht alles sowieso in C geschrieben wird.
Das Programm besteht aus ca. 400kb Assemblercode - natürlich mit Kommentaren. Ich wollte mir die Arbeit ersparen, alles in C neu zu schreiben. Da ich den Assemblercode nicht selbst verfasst habe und dementsprechend beim "Übersetzen" viele Bugs entstehen werden. Aber scheinbar gibt es nur die beiden Lösungen: bei Assembler bleiben, oder alles in C übersetzen. Mist :-)
>Da viele Erweiterungen zu programmieren sind, möchte ich dies gern in C >erledigen. Ich empfehle Dir ebenfalls, alles in C neu zu schreiben. >Das Programm besteht aus ca. 400kb Assemblercode - natürlich mit >Kommentaren. Der C-Code wird wesentlich kürzer ausfallen!
Ich mache mir keine Sorgen um die länge des C-Codes. Eher habe ich Bauchschmerzen wegen der korrekten Übersetzung.
es gibt auch für diverse prozessoren ein re-c - also programme die dir aus asm code wieder c code machen. *SOLL JETZT ABER KEINE EMPFEHLUNG SEIN!!!* ich halte von den teilen nichts, wenn du was lernen willst (und sowas ist eine sehr gute Übung) dann mach es selbst! und wenn du probleme hast dann poste dein programm hier, hier wird dir sicher geholfen :))
> Aber scheinbar gibt es nur die beiden Lösungen: bei Assembler bleiben, > oder alles in C übersetzen. Noe, du kannst auch aus Assembler C-Funktionen aufrufen. Es mag nicht besonders elegant sein, aber moeglich ist es. Eine andere Moeglichkeit, wenn du ja 400kb Assemblercode hast, dann wird das ja nicht ein fetter Block sein. Sowas ist doch sicherlich in Libaries geordnet die beim uebersetzen vom Linker zusammengepappt werden. Du kannst dann vielleicht einen Teil in C schreiben und dort die Assemblerlibaries einbinden. Olaf
> Noe, du kannst auch aus Assembler C-Funktionen aufrufen. Es mag nicht > besonders elegant sein, aber moeglich ist es. aslo ich persönlich fände es da schöner wenn du deinen c code übersetzen lässt und dir dann das asm listing anschaust und ggf rauskopierst. um was für funktionen handelt es sich denn??? du kannst ja schliesslich auch nicht deinen arzt anrufen und sagen herr doktor mir fehlt was und erwarten das er dir richtig hilft :))
Mirko schrieb: > Ich wollte mir die Arbeit ersparen, alles in C neu zu schreiben. > Da ich den Assemblercode nicht selbst verfasst habe und dementsprechend > beim "Übersetzen" viele Bugs entstehen werden. Degegen gibts nur eines: sauber analysieren, was in welchem Bereich des Codes gemacht wird und das dann in C nachbauen. Das musst du aber sowieso machen, wenn du den Code (egal ob in C oder in Assembler) erweitern willst.
und du lernst dabei noch einiges was ja nie verkehrt sein kann :))
es gibt einige möglichkeiten C-code in assemblercode einzubinden und umgekehrt. ich gehe mal davon aus, daß du assemblerquellcode vorliegen hast und du ihn assemblieren und linken kannst. eine möglichkeit ist, C Funktionen compilieren und dazulinken. die C Funktionen können assemblerfunktionen aufrufen, assembler code kann C Funktionen aufrufen. dabei ist auf die compilerabhängige form der parameterübergabe und der übergabe des rückgabewerts zu achten.
>Ich mache mir keine Sorgen um die länge des C-Codes. >Eher habe ich Bauchschmerzen wegen der korrekten Übersetzung. Ist vermutlich auch der falsche Ansatz, den ASM-Code 1:1 übersetzten zu wollen. Nimm lieber das (hoffentlich vorhandene) Pflichtenheft zur Hand und schreibe alles neu in C. Falls kein Pflichtenheft vorhanden ist, dann ist es höchste Zeit eines zu erstellen, zusammen mit den umfangreichen Änderungen die Du beifügen möchtest.
@Burkhart h. >es gibt einige möglichkeiten C-code in assemblercode einzubinden und >umgekehrt. Genau dazu suche ich beispiele. >ich gehe mal davon aus, daß du assemblerquellcode vorliegen hast und du >ihn assemblieren und linken kannst. Ja >eine möglichkeit ist, C Funktionen compilieren und dazulinken. die C >Funktionen können assemblerfunktionen aufrufen, assembler code kann C >Funktionen aufrufen. dabei ist auf die compilerabhängige form der >parameterübergabe und der übergabe des rückgabewerts zu achten. Wo finde ich entsprechenden Beispielquellcode? Das würde mir wirklich weiter helfen. @Peter >Ist vermutlich auch der falsche Ansatz, den ASM-Code 1:1 übersetzten zu >wollen. Nimm lieber das (hoffentlich vorhandene) Pflichtenheft zur Hand >und schreibe alles neu in C. Nix Pflichtenheft --> Bedarfsprogrammierung :-) >Falls kein Pflichtenheft vorhanden ist, dann ist es höchste Zeit eines >zu erstellen, zusammen mit den umfangreichen Änderungen die Du beifügen >möchtest. Das Projekt läuft nicht mehr lang und wird auch nicht fortgesetzt. Trotzdem müssen alle Messungen und Auswertungen ordentlich erledigt werden. Daher auch der Wunsch statt Assembler C schreiben zu können.
Mirko schrieb: > Das Projekt läuft nicht mehr lang und wird auch nicht fortgesetzt. Ist das absolut sicher? Wenn ja, dann ist die Frage ob es sich lohnt die Programmiersprache zu wechseln. "Das Projekt läuft nicht mehr lang" klingt eher nicht so danach, als ob man alles schön strukturiert in C neu codieren könnte.
Guck dir an, wie die Calling Convention (Parameterübergabe usw.) von avr-gcc ist. In der FAQ sollte die beschrieben sein. Mit diesem Wissen kannst du dann problemlos C-Funktionen aufrufen. Du musst dich nur noch drum kümmern, dass der Assembler dir passende ELF-Objekte ausgibt, statt direkt irgendwelche HEX-Dateien oder so. Dann am Ende alles zusammenlinken.
der C teil deines projekts muß kenntnis haben zu den asm-funktionen und variablen (speicherplätzen) in asm, umgekehrt, muß der asm code wissen, wo sind die C Funktionen und wo stehen die variablen von C. ------------------------------------------------------------------------ wenn du den C teil und den asm Teil deines projekts einzeln compilierst und linkst, kannst du die beiden teile einzeln in deinen controller laden. dem C projekt kannst du die adressen von asm funktionen und variablen über einen linkerscript übergeben oder hart einprogrammieren als (funktions)poiner auf adressen. die asm-adressen bekommst du aus dem map file. ----------------------------------------------------------------------- einfacher ist es wie gesagt, C teil und asm teil gemeinsam zu kompilieren. wie die adressen von C asm bekanntgemacht werden und umgekehrt hängt ein wenig von deiner entwicklungsumgebung ab.
Mark Brandis schrieb: > "Das Projekt läuft nicht mehr lang" gehört mit zu den grössten Irrtümern der Menschheit ;) Mirko schrieb: > Wo finde ich entsprechenden Beispielquellcode? > Das würde mir wirklich weiter helfen. In der Doku zu deinem C-Compiler. Oliver
400KB Assembler Code laufendes Projekt keine Weiterentwicklung geplant Ich glaube bei den Randbedingungen sollte jetzt zumindest klar sein daß es keinen Sinn macht alles neu machen zu wollen. Das damit einzig Sinnvolle ist wohl: logisch abgetrennte Bereiche können in C statt in Assembler entwickelt werden und werden dann aus dem Assembler Programm korrekt aufgerufen. Einzige Alternative dazu: Du bleibst in Assembler. Oliver schrieb: > Mirko schrieb: >> Wo finde ich entsprechenden Beispielquellcode? >> Das würde mir wirklich weiter helfen. > In der Doku zu deinem C-Compiler. Oder einfacher: Deine C Funktion schreiben. Kleines Hauptptogramm dazu in C schreiben Compilieren, das entstandene Assemblerlisting ist das perfekte Beispiel wie Du deine C Funktion korrekt aufrufst. Zudem hast du gleich ein Testprogramm um die eigentliche Funktion testen zu können.
U.R. Schmitt schrieb: > Oder einfacher: > Deine C Funktion schreiben. > Kleines Hauptptogramm dazu in C schreiben > Compilieren, das entstandene Assemblerlisting ist das perfekte Beispiel > wie Du deine C Funktion korrekt aufrufst. Ganz so einfach ist das nicht. Im C-Code existieren Konventionen, die vom Compiler eingehalten werden, und die man erst mal unter Umständen sicherstellen muss, ehe man eine vom Compiler generierte Funktion aufrufen kann. Nur ein Beispiel von vielen: im GCC existiert die Konvention, dass im Register R0 (oder war es R1?) immer eine 0 enthalten ist. Jetzt kann man aber kaum davon ausgehen, dass sich das bisherige Assembler Programm an derartige Konventionen hält, d.h. man muss die erst mal mühsam vor einem Funktionsaufruf herstellen. Umgekehrt ist es oft einfacher: Geht man von der Prämisse aus, dass man es mit einem C Programm zu tun hat, welches durch Assembler gepimpt wurde, dann erhält man automatisch: * den C Initialisierungsteil, der vor dem main() erst mal alles so einrichtet, wie es der Compiler voraussetzt und wovon er als Basisannahmen ausgeht * wenn die Assemblerfunktionen ihre Arbeitsregister nach Funktions- eintritt pushen und vor dem Ausstig wieder popen zerstören sie auch in dieser Umgebung nichts.
Mirko schrieb: > Das Programm besteht aus ca. 400kb Assemblercode - natürlich mit > Kommentaren. Das klingt nach riesen Spaghetticode. Dann kann man versuchen, eine Hauptfunktion zu schreiben, die dann nur mit unterschiedlichen Parametern aufgerufen wird, die man in einem Array im Flash definiert. Peter
Karl heinz Buchegger schrieb: > ....existieren Konventionen, die vom Compiler eingehalten werden, > und die man erst mal unter Umständen sicherstellen muss, ehe man eine > vom Compiler generierte Funktion aufrufen kann. So ist es. Im Prinzip ist es keine grosse Geschichte, aus Assembler heraus C-Funktionen aufzurufen. Der springende Punkt ist, dass die aufgerufene C-Funktion - die C-Laufzeitumgebung vorfindet - der Prolog und Epilog des (C-)Funktionsaufrufs (aus dem AssemblerCode heraus)den Konventionen des verwendeten C-Compilers entspricht (Stackframe, Registerpreservation, was auch immer..) Ich würden folgendermassen vorgehen: Kurzes C-Programm erstellen, in das das fragliche Assemblerprogramm als externes Modul oder Teilestücke davon eingebunden und aufgerufen werden. So würde ich mich an die C-Laufzeitumgebung herantasten. Der Funktionsprolog bzw -Epilog sollte in der Compilerdokumentation beschrieben sein. Hilfsweise könnte man den vom Compiler generierten AssemblerCode untersuchen, der entsteht, wenn aus C eine selbstgeschriebene C-Funktion aufgerufen wird. mfg
Assembler mit C zu mixen kann sehr schwer sein. C-Funktionen vertrauen auf ner Menge Konventionen, die ein Assemblerprogrammierer nicht kennt und daher nicht eingehalten hat. Assemblerprogrammierer benutzen meistens nicht den Linker, sondern plazieren Variablen absolut. Auch muß die Byteorder nicht mit der des Compilers übereinstimmen. Wenn dann der Linker C-Variablen plazieren soll, kriegt er die Krise. Assembler nach C Zeile für Zeile umzuschreiben, ist nicht praktikabel. Am besten Du kennst Die Funktion des Assemblerprogramms und schreibst es in C komplett neu. Peter
Oliver schrieb: >> "Das Projekt läuft nicht mehr lang" > gehört mit zu den grössten Irrtümern der Menschheit ;) Es gab nie ein Jahr-2000-Problem :)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.