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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.