Forum: Compiler & IDEs Assembler in AVR-GCC


von Fabian Braun (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

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.

von Fabian Braun (Gast)


Lesenswert?

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

von Joerg Wunsch (Gast)


Lesenswert?

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. */
}

von Fabian Braun (Gast)


Lesenswert?

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

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.