Möchte man unter Linux Assembler Programme für den AVR schreiben gibt es drei Assembler, den Gnu Assembler von GCC, gavrasm und avra. avra ist kompatibel zu der Syntax des avrasm2 von Atmel. gavrasm ist weitestgehend kompatibel, es gibt jedoch ein paar Eigenheiten.
Seit Anfang 2010 wird avra nach mehrjähriger Pause weiterentwickelt. Dies habe ich zum Anlass genommen, um für den Editor Geany eine Syntax Highlightning Datei zu erstellen. Die Syntax von gavrasm sollte weitestgehend identisch sein.
Diskussionen und zusätzliche Informationen zu AVR Assembler Programmierung mit Geany in diesem Forum Thread
Es reicht aus, wenn man die Datei in das Verzeichnis ~/.config/geany/filedefs kopiert
cp filetypes.asm ~/.config/geany/filedefs
Als zusätzliche Hilfe lassen sich sogenannte Snippets einrichten. Hierzu öffnet man das Menu Werkzeuge → Konfigurationsdateien → snippets.conf und fügt an das Ende folgendes an:
[ASM] macro=.macro %cursor%\n.endmacro if=.if (%cursor%)\n.endif id=.ifdef %cursor%\n\t\n.endif ind=.ifndef %cursor%\n\t\n.endif comment=;***********************************************************************\n;* %cursor%\n;*********************************************************************** else=.if (%cursor%)\n.else\n\n.endif elif=.if (%cursor%)\n\n.elif (%cursor%)\n\n.endif i=.include "%cursor%" nli=.nolist\n\t.include "%cursor%"\n.list
Anschließend speichert man die Datei und ruft den Menupunkt Werkzeuge → Einstellungen erneut laden auf. Nun kann man in der Assembler Datei ein Snippet aufrufen, indem man den Namen eingibt und anschließend die TAB Taste drückt. Zum Beispiel:
macro<TAB>
ergibt
.macro .endmacro
Der Cursor blinkt anschließend hinter .macro, so das man direkt mit dem Makronamen weiter machen kann. Mit dieser Methode lassen sich auch andere, immer wiederkehrende Programmstrukturen als Snippet anlegen und mit einem einfachen Befehl einfügen.
Der Snippet comment ergibt einen Kommentarblock. Dies erleichtert das einheitliche Erstellen von Funktionsbeschreibungen. Natürlich kann man das nach Belieben ausbauen. Der Cursor steht automatisch in der mittleren Zeile.
;*********************************************************************** ;* ;***********************************************************************
Der Snippet nli erzeugt folgendes Konstrukt:
.nolist
.include ""
.list
nli steht für NoList Include und kann verwendet werden, wenn eine Include Datei bei der List Ausgabe nicht erscheinen soll. Der Curser steht zwischen den beiden Anführungszeichen.
Durch diese Snippets kann man sich also einiges an Tipparbeit ersparen. Die genannten Snippets sind nur Beispiele und können nach Belieben erweitert oder geändert werden.
Eigentlich heißt es in diesem Fall assemblieren, da wir es mit einem Assembler zu tun haben. Den Begriff kennt Geany jedoch nicht. Mit einem Klick auf Kompilieren wird avra aufgerufen. Hierzu muss sich das Programm im Pfad befinden. Am einfachsten und ohne Root Rechte geht das, wenn man im eigenen /home Verzeichnis ein Unterverzeichnis namens bin erstellt und avra oder gavrasm hineinkopiert. Unter Umständen muss man sich abmelden und neu anmelden, damit die Änderung erkannt wird.
Möchte man statt avra lieber gavrasm verwenden kann man dies leicht ändern, indem man auf den Pfeil neben Erstellen klickt, den Menupunkt Include-Parameter und Argumente angeben auswählt und dort in der Zeile Kompilieren das Kommando avra durch gavrasm ersetzt. Es empfiehlt sich, bei gavrasm den Parameter -a zu verwenden.
Geany kann Fehler, die beim Compilieren/Assemblieren auftreten, im Sourcecode markieren. Dazu muss man mit Hilfe einer Regular Expression in der Ausgabe des Compilers nach den entsprechenden Mustern suchen. Diese Regular Expression muss in der filtypes.* Datei stehen.
Für avra und gavrasm unterscheiden sich die regulären Ausdrücke. Je nachdem, mit welchem Assembler man arbeiten will, muss man in der filetypes.asm die passende Zeile auskommentieren.
#error_regex=\[(.+),([0-9]+)\] # Uncomment for gavrasm error_regex=(.+)\(([0-9]+)\) : Error # Uncomment for avra
Wie das ganze dann aussieht zeigt dieser Screenshot am Beispiel des avra.