Forum: Compiler & IDEs gcc-as unter Linux


von Fred (Gast)


Lesenswert?

Hallo,

ich würde mich gern in Assembler einarbeiten, was aber garnicht so 
einfach scheint (unter Linux).

Ich hab mich mittlerweile auf den gcc-as festgelegt. Meine Erste Hürde 
sind jetzt die Include Files.
Allerdings hab ich gelesen der gcc-as kann die selben Includes wie der 
avr-gcc verarbeiten.

Folgenden Code versuche ich zu Kompilieren. Er stammt aus dem AVR 
Tutorial. Nur der Name der Device Datei wurde ausgetauscht. Diese hab 
ich auch ins aktuelle Verzeichnis kopiert.
1
 #include "iom1284p.h"
2
3
  ldi r16, 0xFF
4
  out DDRB, r16
5
6
  ldi r16, 0xFC
7
  out PORTB, r16
8
9
ende:  rjmp ende

Hier im Forum wurde vor Jahren mal geraten, den avr-gcc als Frontend zu 
benutzen und diesen einfach mit einer .S Datei zu füttern.
Deswegen schaut mein Aufruf so aus:
1
avr-gcc test.S

Momentan meckert er mir noch an ich solle die "io.h" direkt includieren. 
Das könnte ich natürlich machen, aber wie übergebe ich dem Assemblierer 
dann meinen gewünschten MC?

Suche ich überhaupt bei den richtigen Includes? Assembler Includes 
sollten doch mit .inc enden?

Hoffe ihr könnt mir mal wieder weiterhelfen :-)

Grüße und schönen Abend,
Fred

von Avr (Gast)


Lesenswert?

Versuch's doch mal mit:
avr-gcc -mmcu=atmega1284p -Wa,-gstabs -I/usr/local/AVR/avr/include -o 
test.elf Test.S
damit füttert der gcc den as mit allem notwendigen

von hp-freund (Gast)


Lesenswert?

Da hilft nur ein Tutorial wie z.B. das hier:

http://electrons.psychogenic.com/modules/arms/art/3/AVRGCCProgrammingGuide.php#asmwithavr-as

In dem Beispiel fehlt allerdings hinter den #include das <avr/io.h>

von Fred (Gast)


Lesenswert?

Danke euch!

Vor allem das Tutorial scheint Gold wert zu sein.

Die Kommandozeile alleine reicht leider noch nicht. Der gcc (oder as) 
vermisst die main Routine. Mit dem Codeschnippsel aus dem Tut klappt 
immerhin das assemblieren!

von Yalu X. (yalu) (Moderator)


Lesenswert?

Du solltest auch deine Assembler-Programme immer mit
1
#include <avr/io.h>

beginnen.


Alternative 1:

Du kannst das Assembler-Programm ähnlich wie ein C-Programm gestalten
und mit
1
avr-gcc -mmcu=atmega1284p -o test.elf test.S

bauen.

Hier kannst du nachlesen, wie das Assemblerprogramm aussehen muss, damit
diese Methode funktioniert:

  http://www.nongnu.org/avr-libc/user-manual/assembler.html

Der Vorteil besteht darin, dass die Interruptvektortabelle automatisch
generiert wird. Die C-Startup-Dateien werden zum Programm hinzugelinkt,
was erwünscht sein kann oder auch nicht.


Alternative 2:

Wenn du die volle Kontrolle über den generierten Code haben möchtest,
baust du es mit
1
avr-gcc -mmcu=atmega1284p -nostdlib -o test.elf test.S

Dann musst du die Interruptvektortabelle selber schreiben, kannst sie
aber auch weglassen, wenn du keine Interrupts benutzt. Es werden auch
keine Startup-Dateien gelinkt, so dass das fertige Programm wirklich nur
den Code enthält, der in deiner Quelldatei steht. Der Einstiegspunkt
muss in diesem Fall auch nicht main heißen. Dein Beispielprogramm von
oben würde mit dieser Methode direkt funktionieren, wenn du die Include-
Datei in avr/io.h änderst.

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.