C-Code in Assemblerprojekt verwenden

Gast #2041026
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
Gast #2041028
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 ;)
Gast #2041056
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 :-)
Gast #2041057
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!
#2041069
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 :))
Gast #2041072
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
#2041097
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 :))
#2041100
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.
#2041140
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.
Gast #2041157
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.
Gast #2041196
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.
Gast #2041214
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.
#2041224
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.
Gast #2041237
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.
#2041252
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.
#2041327
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
#2041454
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren