Hi, ich möchte unter Linux Assembler auf dem AVR programmieren. Leider
gibt es nur einen Assembler, der auch aktuelle AVR unterstützt, und das
ist der gcc-as.
Zwischen dem gcc-as und dem AVR Studio bzw den Assembler von Atmel gibt
es aber wohl einige Unterschiede in der Syntax. Gibt es irgendwo einen
Vergleich? Hier auf der Seite hab ich nur einen Forenbeitrag gefunden.
Darin ging es lediglich um die Doppelregister
Eignet sich der gcc-as überhaupt dazu, reines Assembler zu programmieren
oder sollte man einfach den AVR Assembler mit Wine verwenden?
PS: Ich hab eine ähnliche Frage schon in meinem Forum gestellt.
http://www.elektronik-projekt.de/thread.php?threadid=6404
Du kannst mit avr-as gut arbeiten. Beachte aber, dass avrasm2 (der
originale Atmel-Assembler) auch unter Linux (mit wine) läuft.
Die ganzen Assembler-Direktiven sind bei avr-as anders. Es hätte wenig
Sinn, die denen des avrasm2 gegenüber zu stellen, Du musst sie einfach
neu lernen. Auch ist das ganze Handling anders, da avr-as Code erzeugt,
der noch gelinkt werden muss. Um das in einem Rutsch zu machen, nimmst
Du am Besten avr-gcc als Frontend. Bekommt der als Source ein .S, weiß
der schon, was zu machen ist.
Es ist ein Ein-Pass-Assembler, und seine Fehlermeldungen sind nicht
immer erhellend. Seine Stärken spielt er vor allem in der Kombination
mit gcc-C-Code aus. Für eine von C aufrufbare Function müssen z.B. nur
die Übergabekonventionen beachtet werden und das Einsprunglabel als
global definiert werden, Du kannst dieselben globalen Variablen
verwenden, egal wo sie definiert sind, usw.
Der Unterschied, über den man am schnellsten stolpert, ist, dass avr-as
in seinen Symbolen keinen I/O-Bereich kennt, die Register dort sind mit
Ramadressen (also unterste Adresse 0x20) einheitlich angegeben. Um
beispielsweise nach Port B mit einem I/O-Befehl (in, out, sbis, sbic,
...) zu schreiben, muss es
1
out _SFR_IO_ADDR(PORTB),r24
heißen. Oder Du setzt am Beginn des Assembler-Source
1
#define __SFR_OFFSET 0 /* we handle different I/O addresses without macros */
rein. Dann darfst Du für Register im I/O-Bereich kein lds/sts verwenden
(vermutlich eine leichte Übung), aber in/out/... ohne Macro.
Ich verwende avr-as gerne und häufig wegen seiner zusätzlichen Features,
aber zum Einlernen in Assembler ist er sicher nicht besonders geeignet.
Da avrasm2 unter Linux läuft, wird sich vermutlich keiner so schnell die
Mühe machen, ein natives Duplikat davon zu bauen. Es gibt ja keinen
Leidensdruck, es tut ja. Und wer mehr braucht, nimmt avr-as.
Auf Linux einfach „info gas“ tippen und sich überlegen, was davon der
avrasm2 bieten würde. Vorlesen tue ich es jetzt aus hoffentlich
nachvollziehbaren Gründen nicht. Ob Du es brauchst, musst Du
entscheiden.
Da steht irgendwie alles mögliche. Das meiste davon kann ich irgendwie
nicht mit dem avr-as in Verbindung bringen, außer dass ich natürlich
auch mit Nano die Files editieren kann und mit screen dies auch
unterbrechungsfrei via SSH usw.
Meintest du das mit den zusätzlichen Features? Allerdings frage ich mich
dann, was ich mit GRUB oder vcd-info soll. Oder bekommst du da eine
andere Ausgabe?
1
File: dir, Node: Top Dies ist der Beginn des INFO-Baums
2
3
Dieser Verzeichnis-Knoten zeigt ein Menü aller Hauptpunkte an.
4
„q“ beendet Info, „?“ listet alle Info-Befehle auf, „d“ kehrt hierher
5
zurück, „h“ gibt eine Einsteiger-Hilfe, „mEmacs<Return>“ besucht das
6
Emacs-Manual, etc.
7
8
Im Emacs kann man mit dem zweiten Mausknopf auf einen Menüeintrag oder
9
einen Querverweis klicken, um einen solchen auswählen.
10
11
* Menu:
12
13
Archiving
14
* Cpio: (cpio). Copy-in-copy-out archiver to tape or disk.
15
16
AVR Programming & development tools.
17
* Simulavr: (simulavr). A simulator for Atmel AVR microcontrollers.
Markus Burrer schrieb:> Hi, ich möchte unter Linux Assembler auf dem AVR programmieren. Leider> gibt es nur einen Assembler, der auch aktuelle AVR unterstützt, und das> ist der gcc-as.
Es gibt keinen gcc-as. Der gebräuchlichste Assembler unter Linux ist
GAS. Er gehört NICHT zum GCC-Paket, sondern zum Paket Binutils.
Da jedoch bei der Erzeugung einer Toolchain tunlichst GCC und Binutils
gemeinsam kompiliert werden sollten, ist der doch fundamentale
Unterschied nicht offensichtlich.
Ebenso kann man das GCC-Frontend gcc auch zum Aufruf von gas verwenden.
„info gas” funktioniert natürlich nur, wenn Du die Info-files
installiert hast. Du hast sie offensichtlich noch nicht benötigt. Bei
den meisten Distributionen werden die in einem Paket enthalten sein, das
„binutils” und „doc“ oder „info“ im Namen hat. Die Installation lohnt
sich eigentlich immer schon dann, wenn man kompliziertere Aufgaben für
avr-gcc hat, die mit der Standardeinstellung der Toolchain nicht zu
erledigen sind.
Ich habe aber nicht vor, in eine Diskussion „mein Assembler ist besser“
einzusteigen. Er ist es nicht -- jedenfalls nicht für jedermann. Ich
will Dir den avrasm2 also keinesfalls ausreden. Für meine Arbeit
(Modularisierung, Libraries, sections, symbolisches Debuggen in den
Modulen mit avr-gdb) brauche ich den avr-as und möchte ihn nicht missen.
YMMV.
Hc Zimmerer schrieb:> Ich habe aber nicht vor, in eine Diskussion „mein Assembler ist besser“> einzusteigen. Er ist es nicht -- jedenfalls nicht für jedermann. Ich> will Dir den avrasm2 also keinesfalls ausreden.
Ich will auch gar keine Diskussion "meiner ist größer als deiner".
Ehrlich gesagt musst du mir den avrasm auch gar nicht ausreden. Ich bin
eher etwas frustriert, dass man auf Wine zurückgreifen muss, weil es
kein natives Equivalent gibt bzw das einzige Projekt in der Richtung
eingeschlafen ist
Markus Burrer schrieb:> Ich bin> eher etwas frustriert, dass man auf Wine zurückgreifen muss, weil es> kein natives Equivalent gibt bzw das einzige Projekt in der Richtung> eingeschlafen ist
stimmt so ganz nicht, avra wird auf Sourceforge gerade wiederbelebt.