Assembler in AVR-GCC

Gast #75618
Hallo!

habe ein problem mit dem einbinden von assemblerdateien.
z.b. beim yampp7 (www.yampp.com für diejenigen dies nicht
kennen) sind einige dateien mit der endung .asm. jedoch
müssten in avr-gcc eingebundene dateien die extension
.s besitzen und die zugehörigen header datein die funktionen
mit extern am anfang deklarieren. wieso ist das nicht so?
hat jemand von euch mit dieser sache erfahrung?

entschuldigung dass ich nicht gleich im yampp forum frage
aber eine antwort in deutsch bzw. eine frage in deutsch
zu stellen fällt mir 1000mal leichter!

merci beaucoup!

fabian
Gast
Nein, die Dateien müssen nicht auf .S enden (großes S bitte!),
aber wenn sie das nicht tun, dann muß man dem Compiler das mit
-x assembler-with-cpp halt sagen.  Meiner Erinnerung nach ist
yampp (aus was auch immer für Gründen) diesen Weg gegangen.
Gast
hallo

aha! schon mal ein problem gelöst, danke!
aber jetzt stellt sich die frage immer noch,
wieso sind in den header dateien die funktionen
nicht mit extern an anfang also zum beispiel
extern void funktion1(void) definiert?!??!??
hatt hier jemand ne idee? oder wird das mit
dem "-x assembler-with-cpp" schon "gesagt"?!?

merci!

gruss fabian
Gast
Eine Funktionsdeklaration ohne `static' ist implizit `extern'.

Bei Variablendeklarationen war dies ganz früher auch so, allerdings
kann man dort die Deklaration nicht wirklich von der Definition
unterscheiden, so daß aus heutiger Sicht

int foo;

eine Definition darstellt (für eine globale Variable).  Damit ist dies
so in einer Headerdatei (die in mehreren C-Dateien verarbeitet werden
soll) formal nicht mehr zulässig (es gäbe dann ja am Ende mehrere
Variablen `foo'), so daß dort das `extern' stehen muß.

GCC ist in seiner Voreinstellung jedoch mit der historischen
Schlampigkeit kompatibel, d. h. dort würde selbst das funktionieren.
Wenn man das vermeiden will, muß man mit -fno-common übersetzen.

Bei Funktionen ist der Fall jedoch nach wie vor eindeutig:

int foo(void); /* eine Deklaration */
int foo(void)
{
  /* Eine Definition, die ggf. auch Deklarations-
   * charakter haben kann, wenn es das erste Auftreten
   * des Bezeichners foo im aktuellen Scope ist. */
}
Gast
hallo zusammen,

hmm...tönt grad noch ein bisschen schwierig aber
langsam dämmerts :-) sorry bin erst im dritten
lehrjahr (elektroniker) und hab mir C-programmieren
mit AVRs eigentlich selbst beigebracht drum bin ich
hoffentlich entschuldigt dass ich dies jetzt nicht
aufs erste mal ganz verstehen!
also im grunde genommen könte ich jetzt so ein programm machen:

main.c
======

void asmfunktion(void);

void main(void)
{
   asmfunktion();
}

assemblercode.asm
=================

asmfunktion:
   nop
   nop
   ret

müsste noch das oben genannte textchen im makefile
zu den compiler parameter hinzufügen und die
sache sollte laufen?!? ist dies korrekt?

merci für eure hilfe!

gruss fabian

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 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.