gcc-as unter Linux

Gast #2768207
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
Gast #2768252
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!
Moderator #2768281
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.

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