C-Code in Assembler wandeln für andere Compiler

Gast #1221359
Hi,

also ich würde gerne mal wissen ob es einen Weg gibt ein C-Codestück
(CCS Compiler für PIC16LF877) in Assembler zu wandeln um dieses Kunden 
zur vefügung zu stellen, damit Sie es auch bei anderen C-Compilern 
einbauen könne.
Ich habe für eine Messkarte verschiedene Funktionen geschrieben die ich 
gerne dem Kunden liefern würd. Jedoch besitzen nicht alle unsere Kunden 
den C-Compiler von CCS und ich möchte auch nicht dauernt von Email 
bombadiert werden wie man die Funktionen in einen anderen Compiler 
umsetzen muss.

MFG
Sepentis
Gast #1221390
Du hast einen Konzeptfehler:

sepentis wrote:
> also ich würde gerne mal wissen ob es einen Weg gibt ein C-Codestück
> (CCS Compiler für PIC16LF877) in Assembler zu wandeln um dieses Kunden
> zur vefügung zu stellen, damit Sie es auch bei anderen C-Compilern
> einbauen könne.
Ein Compiler kann mit Assemblercode nichts anfangen. Ein Compiler ist 
dazu gedacht, eine Hochsprache (C) in Maschinensprache (ASM) zu 
übersetzen, welche dann vom Assembler in Maschinencode 
(Programm-'Datei') umgesetzt wird. So war das jedenfalls mal gedacht.

> Ich habe für eine Messkarte verschiedene Funktionen geschrieben die ich
> gerne dem Kunden liefern würd. Jedoch besitzen nicht alle unsere Kunden
> den C-Compiler von CCS und ich möchte auch nicht dauernt von Email
> bombadiert werden wie man die Funktionen in einen anderen Compiler
> umsetzen muss.
Ist eigentlich vollkommen wurscht, welchen C-Compiler die Kunden 
benutzen. Frag dich mal, warum C damals erfunden wurde --.
Wenn du z.B. klares ANSI-C oder ISO-C schreibst, kann jeder konforme 
Compiler damit umgehen. Spezialitäten wie '((attribute))' oder '#pragma' 
oder andere proprietäre Verrenkungen musst du dann eben in Makros 
packen.
Gast #1221489
Erst mal Dank.

Was den Beitrag über ANSI-C uns ISO-C angeht das ist mir sehr wohl klar.
Ich habe auch weniger das Problem das mein Code nicht der Norm gerecht 
wird.
Es geht um die Hardware-Funktionen die mein Compiler in entsprechenden
Code umsetzt (sprich ansteuerung des ADCs, PWM usw des PICs). Diese 
Befehle sind leider bei jedem Compiler etwas anders. Deshalb wollte ich 
diese Programmteile direkt in ASM übersetzen damit diese Funktionen so 
übernommen werden können. Der Compiler den ich benutzte kann übrigens 
ohne weiteres
ASM Code einbinden. Das hat man vor Jahren auch gemacht, wo die Compiler 
noch nicht so perfekt auf Geschwindigkeit optimiert waren. Diese 
Codeteile hat man dan in Maschinensprache geschrieben und eingebunden.

MFG
Sepentis
#1221497
Sepentis wrote:

> ASM Code einbinden. Das hat man vor Jahren auch gemacht, wo die Compiler
> noch nicht so perfekt auf Geschwindigkeit optimiert waren. Diese
> Codeteile hat man dan in Maschinensprache geschrieben und eingebunden.

... und jeder Compiler hat sein eigenes Süppchen gekocht, wie seine 
Assemblersyntax aussieht bzw. welche Aufrufkonventionen er benutzt.
Wenn du dich darauf einlässt, dann sind graue Haare vorprogrammiert.

Das Beste was du machen kannst:
Die tatsächlich hardwarerelevanten Teile an einer Stelle sammeln und 
dort mit #ifdef den jeweils für einen Compiler passenden auswählen, bzw. 
mittels entsprechender Makro-Magic die Syntax entsprechend anpassen.

Ein bischen was, wenn auch nur wenig, muss man schon von jemandem 
voraussetzen, der ein Programm aus Einzelteilen zusammenbauen möchte.
Gast #1221499
Sepentis wrote:
> Erst mal Dank.
>
> Was den Beitrag über ANSI-C uns ISO-C angeht das ist mir sehr wohl klar.
> Ich habe auch weniger das Problem das mein Code nicht der Norm gerecht
> wird.
Gut, Prinzip verstanden :-)

> Es geht um die Hardware-Funktionen die mein Compiler in entsprechenden
> Code umsetzt (sprich ansteuerung des ADCs, PWM usw des PICs). Diese
> Befehle sind leider bei jedem Compiler etwas anders. Deshalb wollte ich
> diese Programmteile direkt in ASM übersetzen damit diese Funktionen so
> übernommen werden können.
Ich bin mir recht sicher, dass das keine Befehle sind. Du meinst doch 
bestimmt nur Register, die du beschreibst und ausliest, oder?
Würde mich andernfalls recht wundern, aber naja.

> Der Compiler den ich benutzte kann übrigens
> ohne weiteres
> ASM Code einbinden. Das hat man vor Jahren auch gemacht, wo die Compiler
> noch nicht so perfekt auf Geschwindigkeit optimiert waren. Diese
> Codeteile hat man dan in Maschinensprache geschrieben und eingebunden.
Ja, und der Compiler kopiert sie und reicht sie 1:1 an den Assembler 
weiter.
Und übrigens: Die Syntax, um Assemblerquelltext in C einzubetten, ist 
erst Recht verflucht-noch-eins compilerspezifisch. Noch katastrophaler 
sind die Aufrufkonventionen...
Gast #1221517
am einfachsten finde ich alle HW/Compilerspezifischen dinge werden in 
makros gepackt.

statt dem ifdef würde ich aber für jede zielplattform ein header zb
"port.h" shreiben der die defines setzt und von jedem file included 
wird.
Gast #1259536
Hi sepentis,

natürlich würde Dein Weg funktionieren, sofern Du darauf achtest, 
genormte Aufrufe Deiner übersetzten Assembler(Sub-)Routinen zu 
verwenden, d.h. alle C-Compiler die gleichen Funktionen nutzen.

Dann mußt Du lediglich Deinen Assembler-Code entsprechend schreiben, in 
den Obj-Code übersetzen und dann an Dein aufrufendes C-Programm linken.

Du mußt bei der Programmierung von Pics etc. allerdings darauf achten, 
daß Du hier möglicherweise homogene Hardware-Vorrausetzungen benötigst. 
Das hat aber nichts mit Deiner ursprünglichen Frage zu tun.

Gruß
Gast #1259584
wahrscheinlich hast du die ganzen CCS spezifischen Befehle wie 
PINHIGH(),PINLOW() etc. verwendet. Das ist dann leider nicht portierbar. 
Ich nehme auch manchmal den CCS Compiler, benutze aber nur den ANSI-C 
kompatiblen Teil damit ich auch mit dem Hi-Tech Compiler compilieren 
kann.
BTW Die ganzen "Hardwarebefehle" des CCS machen etrem viel unnötigen 
Overhead und haben teilweise auch bugs. Ist eigentlich genau so ne 
schlechte Idee wie bascom. Nicht portierbar und du weisst nie genau was 
der compiler da eigentlich macht.
#1259875
Sepentis schrieb:
> Es geht um die Hardware-Funktionen die mein Compiler in entsprechenden
> Code umsetzt (sprich ansteuerung des ADCs, PWM usw des PICs). Diese
> Befehle sind leider bei jedem Compiler etwas anders.

Du meinst eine Art Wizzard, dem Du in einer speziellen Zwischensprache 
sagst, was er konfigurieren soll.

Da würde ich raten, einfach nicht den Wizzard zu nehmen, sondern die 
nötigen IO-Register selber zu setzen.
Dann ist der Code auch für andere Compiler portabel.
Allerdings muß man dazu das Datenblatt des Chips lesen, d.h. die 
Funktionesbeschreibung der entsprechenden Peripheriekomponente.


Peter

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.