mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik C-Code in Assemblerprojekt verwenden


Autor: Mirko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Micha s. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen, du kannst assembler code zum beispiel so in C einbinden:
asm("NOP");
in der klammer kommt immer direkt dein befehl rein.

Grüße e-tec

Autor: Micha s. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 ;)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Mirko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :-)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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!

Autor: Mirko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich mache mir keine Sorgen um die länge des C-Codes.
Eher habe ich Bauchschmerzen wegen der korrekten Übersetzung.

Autor: Micha S. (e-tec)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :))

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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

Autor: Micha S. (e-tec)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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 :))

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Micha S. (e-tec)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und du lernst dabei noch einiges was ja nie verkehrt sein kann :))

Autor: Burkhart H. (burkhart_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>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.

Autor: Mirko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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.

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: greg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Burkhart H. (burkhart_h)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: U.R. Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: G. O. (aminox86)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.