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


von Mirko (Gast)


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

von Micha s. (Gast)


Lesenswert?

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

von Micha s. (Gast)


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 ;)

von Karl H. (kbuchegg)


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.

von Mirko (Gast)


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 :-)

von Peter (Gast)


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!

von Mirko (Gast)


Lesenswert?

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

von Micha S. (e-tec)


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 :))

von Olaf (Gast)


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

von Micha S. (e-tec)


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 :))

von Karl H. (kbuchegg)


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.

von Micha S. (e-tec)


Lesenswert?

und du lernst dabei noch einiges was ja nie verkehrt sein kann :))

von Burkhart H. (burkhart_h)


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.

von Peter (Gast)


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.

von Mirko (Gast)


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.

von Mark B. (markbrandis)


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.

von greg (Gast)


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.

von Burkhart H. (burkhart_h)


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.

von Oliver (Gast)


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

von U.R. Schmitt (Gast)


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.

von Karl H. (kbuchegg)


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.

von Peter D. (peda)


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

von G. O. (aminox86)


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

von Peter D. (peda)


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

von Mark B. (markbrandis)


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 :)

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
Noch kein Account? Hier anmelden.