Programm gavrasm AVR Assembler fuer ATMEL AVR-Prozessoren ======================================== Kommandozeilen Assembler fuer ATMEL AVR-Prozessoren der Typenreihen - AT90S, - AT90CAN, - AT90USB, - ATtiny, - ATmega, - ATXmega, und - ATA. Fuer Linux i386-x64 compilierte ausfuehrbare Datei: gavrasm Fuer Win64 compilierte ausfuehrbare Datei: gavrasm.exe Quellcode in fpc-Pascal Aufrufe und Optionen -------------------- Aufruf: gavrasm [-abelmqswxz] quelldatei[.asm] Parameter: a: Ausgabe von ANSI-Zeichen umschalten (An/Aus) Default ist An (Linux) bzw. Aus (Win) b: Erweiterte Syntaxkommentierung fuer Anfaenger (nur bei e!) Default ist Aus (kein zusaetzlicher Kommentar) e: Laengeres, ausfuehrlicheres Format fuer Fehlermeldungen Default ist Aus (kurze Fehlermeldungen) l: Ausgabe der LIST-Datei unterdruecken Default ist LIST-Datei-Ausgabe an m: Expansion von Makros listen Default ist List aus p: Akzeptiere EEPROM-Sequenzen oberhalb EEPROM Limit Default ist EEPROM-Adressen-Pruefung q: Keine Ausgabe von Meldungen auf der Kommandozeile (quiet) Ausnahme: Erzwungene Meldungen (.MESSAGE) Default ist Ausgabe eingeschaltet s: Ausgabe der Liste der Symbole im Listing an Default ist keine Symbolliste w: Ermoegliche Wrap-around Default ist Wrap-Around ausgeschaltet x: Benutze nicht die internen def.inc-Informationen Default ist die Verwendung interner def.inc-Informationen z: Definiert die Konstanten NOW_Y (Jahr), NOW_M (Monat), NOW_D (Tag) als Bytes mit dem zur Assemblierzeit aktuellen Datum des Betriebssystems. In der Konstanten NOW_I befindet sich die Anzahl Tage seit dem 1.1.1990 als Ganzzahlwert. Ausgabedateien: quelldatei.lst ... Assembler-Listing, Textdatei quelldatei.hex ... Code im Format Intel-Hex, Textdatei quelldatei.eep ... EEPROM-Inhalt im Format Intel-Hex, Textdatei (Datei wird wieder gelöscht, wenn kein .ESEG- Inhalt erzeugt wurde) quelldatei.err ... Fehlermeldungen falls zutreffend, Textdatei Aufruf: gavrasm [-?hdt] Parameter: ?: Liste der Optionen auf der Kommandozeile h: Liste der Optionen auf der Kommandozeile d: Liste der unterstuetzten Direktiven t: Liste der unterstuetzten AVR-Typen Erlaeuterung zur A-Option: Unter Linux ist die Ausgabe von ANSI-Codesequenzen per Default eingeschaltet, bei anderen OS abgeschaltet. Mit der A-Option wird diese Voreinstellung bei allen Betriebs- systemen invertiert. Rückkehr-Ergebnisse (%errorlevel%): 0: Assemblierung ohne Fehler ausgeführt 1: Assemblierung mit Fehler(n) 2: Fataler interner Fehler Eigenschaften des Assemblers ---------------------------- Im folgenden sind nur die Besonderheiten dieses Assemblers beschrieben. In der Regel ist dieser Assembler kompatibel mit anderen AVR-Assemblern (z.B. dem ATMEL(R)-Assembler). a) Unterschiede dieses Assemblers, die zu Fehlermeldungen und Warnungen bei Code fuehren, der unter anderen Assemblern fehlerfrei assembliert wird * Die Header-Dateien von ATMEL(R), die die Symbole des ver- wendeten AVR-Typs enthalten, koennen mit der .INCLUDE- Direktive angegeben werden. Die Angaben zu der Datei werden aber in der Default-Einstellung von gavrasm ignoriert, die Datei wird nicht gelesen und muss auch gar nicht vorhanden sein. Stattdessen wird aus dem angegebenen Dateinamen der AVR-Typ extrahiert und die intern im gavrasm gespeicherten Symbole fuer diesen Typ gesetzt. Dies sollte man beachten fuer den Fall, dass die Header- Dateien vom User manuell geaendert oder ergaenzt wurden. gavrasm ignoriert wegen dieses Verhaltens die in der Headerdatei vorgenommenen Aenderungen. Um dies zu signalisieren wird eine Warnung ausgegeben, sie ist nur in dem Fall relevant, in dem die def.inc-Datei manuell geaendert wurde. Diese Automatik kann umgangen werden, indem entweder der Namensbestandteil "def.inc" der Headerdatei veraendert wird, und damit die Erkennung der Headerdatei unterbunden wird, oder indem der Schalter x in der Kommandozeile angegeben wird. Die Angabe von x auf der Kommandozeile führt dazu, dass alle Include-Dateien ausgewertet werden. Die ausgegebene Warnung kann ferner dadurch vermieden werden, indem der AVR-Typ mit der .device-Direktive ange- geben wird. Dies bindet, im Unterschied zum ATMEL Assembler, ebenfalls die intern gespeicherten Symbole ein. Bei Typen, die LD-Instruktionen ausfuehren (nicht: z. B. ATtiny12) werden auch die Register XL, XH, YL, YH, ZL und ZH defi- niert. Werden Symbole, die bereits mit .INCLUDE oder .DEVICE definiert wurden, erneut mit .EQU definiert, dann erfolgt keine Fehlermeldung mehr, solange der Wert uebereinstimmt. * Dateinamen (z.B. in der INCLUDE-Direktive) muessen nicht in Gaensefueszen angegeben werden. Dies gilt nicht fuer die Linux-Version, hier muessen Dateinamen in Gaensefueszen ein- geschlossen werden ("..."). * Fuehrende Nullen in Dezimalzahlen werden von gavrasm, im Unterschied zu anderen Assemblern, nicht akzeptiert und fuehren zu einer Fehlermeldung. In binaeren oder hexadezi- malen Konstanten werden hingegen fuehrende Nullen akzeptiert. * Absolutwerte z.B. bei Sprungdistanzen werden bereits dann erkannt, wenn die Sprungdistanz durch ein Vorzeichen eingeleitet wird, wie z.B. " brcc +10". Die Verwendung der Schreibweise PC+10 ist optional und gleichwertig. * Ein wichtiger Unterschied zu anderen Assemblern ist bei gavrasm die Verarbeitung von Texten. Die Verwendung dieser Features bedingt gegebenenfalls Inkompatibilitaet des Quell- codes zu anderen Assemblern. Die Unterschiede im Einzelnen: - In Textpassagen kann ein doppeltes Anfuehrungszeichen "" verwendet werden, um ein Anfuehrungszeichen in den Text einzufuegen. Andere Assembler quittieren dies mit "garbage at end of line" und ignorieren den Text nach dem doppel- ten Anfuehrungszeichen. - Beim Auftreten des Semikolons ; in einer ASCII-Konstante (';') oder einem Text ("...;...") bemaengeln andere As- sembler dies mit einer Fehlermeldung, da das Semikolon faelschlich als Kommentarzeichen interpretiert wird. In gavrasm ist das Semikolon in Konstanten und Texten zu- laessig und wird korrekt verarbeitet. - Beim Einfuegen von nicht druckbaren ASCII-Steuerzeichen in Texte mittels \ (z.B. "...\m\j\@") interpretieren andere Assembler dieses Steuerzeichen nicht wie gavrasm. Diese uebersetzen \ stattdessen als ASCII-Zeichen. Nur bei einer ungeradzahligen Anzahl macht sich dies mit einer Warnung bemerkbar, die Anzahl Zeichen in der Text- konstante sei ungerade und es werde ein Nullzeichen ein- gefuegt. - In .DB eingeschlossene Texte werden auf Datum-, Zeit- und Sourcecodeschluesselworte untersucht und diese durch die entsprechenden aktuellen Werte ersetzt. Erkannt werden: %YEAR%, %MONTH%, %DAY%, %HOUR%, %MINUTE%, %SOURCE% Bitte beachten, dass diese Schluesselworte nur in Gross- buchstaben-Schreibweise erkannt werden! Im Listing sind die Werte ersetzt. * Die .ERROR-Direktive verlangt bei gavrasm einen Text als Parameter, bei dem ATMEL-Assembler nicht. Der Text macht Sinn, weil man ja wissen moechte, was genau den Error ver- ursacht hat. Beim ATMEL-Assembler in frueheren Versionen war dazu eine zusaetzliche .MESSAGE-Direktive notwendig. * Bei den Instruktionen BRBC und BRBS wurden in gavrasm die Bit-Konstanten C, Z, N, V, S, H, T, I in Version 3.2 standardmaessig definiert. Die Verwendung der Ein-Buchstaben- Formulierung fuehrt ab Version 3.3 zu einer Fehlermeldung (Symbol nicht definiert). Hinweis: Diese Bit-Konstanten sind in den meisten def.inc- Dateien als SREG_X definiert und sollten im Quellcode auch so verwendet werden. Ausnahmen sind die def.inc-Dateien der Typen AT90S2333, ATmega83, ATmega104 und ATmega161C. Mit der Direktive .IFNDEF koennen die Ein-Buchstaben-Konstan- ten bedingt definiert werden, wenn diese benoetigt werden. * Die neuere Syntax bei der Angabe von Registerpaaren, was die Instruktionen MOVW, ADIW und SBIW betrifft, wurde um die Schreibweise R[n+1]:R[n] erweitert. Urspruenglich war es ueblich, bei Registerpaaren nur das untere der beiden Register anzugeben (LSB). Die Schreibweise R[n+1]:R[n] ist eigentlich trivial und ueberfluessig, weil schon die Angabe des LSB vollkommen ausreicht. Diese Schreibweise wurde dennoch implementiert, um Kompatibilitaet zu errei- chen. Darueber hinaus ist nun auch die Schreibweise X, Y und Z korrekt. Bitte beachten: das Doppelregister-Paar R25:R24 hat keine solche Abkuerzung! * Die Funktionen BYTE5 bis BYTE8 fuer den Zugriff auf die hoeheren Bytes von Int64-Integer-Zahlen sind in anderen Assemblern moeglicherweise nicht implementiert. * Wenn die Option -z gesetzt ist, koennen die Datumskonstan- ten NOW_D, NOW_M, NOW_Y und NOW_I verwendet werden. Da dies beim Assemblieren mit einem anderen Assembler zu Fehlermeldungen fuehrt, muessen diese verwendeten Konstan- ten in diesem Fall manuell eingefuegt werden. Das kann mit der Direktive .IFNDEF NOW_I auch bedingt erfolgen, so dass beim Assemblieren mit gavrasm die Systemzeit und nicht die manuell eingefuegten Konstanten verwendet werden. * Die Kombination // wirkt genauso wie ;, waehrend /* und */ eine beliebige Anzahl Zeilen auskommentieren. /* und */ arbeiten mit mehreren Stufen, so eroeffnet /*/*/* eine dreistufige Auskommentierung. * gavrasm erzeugt eine Fehlermeldung, wenn das gleiche Regi- ster mit dem gleichen Namen noch einmal definiert wird. Andere Assembler quittieren dies nur mit einer Warnung. Nicht als Fehler behandelt wird der Fall, dass ein und das gleiche Register mit verschiedenen Namen definiert wird. * In .IF-Bedingungen mit UND (&&) und ODER (||) wertet gavrasm weitere Parameter dann nicht mehr aus, wenn bereits der Erste ein eindeutiges Ergebnis ergibt, wenn also bei einem UND bereits der erste Parameter Null ist oder bei einem ODER schon Eins ist. Andere Assembler werten hingegen die gesamte Zeile aus und fuehren bei nicht unter diesen Bedingungen definierten Konstanten und Variablen im zweiten Parameter zu Fehlermeldungen. Diese Eigenschaft von gavrasm kann dazu verwendet wer- den, Mehrfachbedingungen zu vermeiden, wie sie bei anderen Assemblern erforderlich wuerden. * Makros muessen in gavrasm vor ihrer ersten Verwendung definiert sein (keine Forward-Verwendung moeglich). * Soll ein Quellcode gleichzeitig mit gavrasm und einem anderen Assembler kompatibel gemacht werden, kann dies mit der folgenden Methode erfolgen. Die Methode macht sich zunutze, dass nur in gavrasm der eingesetzte AVR-Typ als Symbol vorhanden ist. Wenn man dieses Symbol mit .ifdef ATmega8A abfragt und TRUE erhaelt, ist gavrasm am Werk, wenn nicht ist es ein anderer Assembler und es kann dessen Formulierung im .else-Zweig geschrieben werden. Das funktioniert natuerlich nur dann, wenn der AVR-Typ durch .include "xxxdef.inc" oder mit .device "AVR-Typ" auch vorher definiert wurde. Den Symbolnamen des AVR-Typs erhaelt man, wenn der Quellcode mit der Option -s assembliert wird, im Listing unter "Liste der Symbole" unter dem Symboltyp "T". - Erweiterte Kommentierung mit // und /* */ ist nun implementiert. b) Verfuegbarer Quellcode: * FPC-Pascal, getestet fuer Linux(i386-x64) und Win64. Zum Kompilieren die neuesten Versionen des Compilers verwenden, aeltere Versionen haben Probleme mit einigen Pascal-Instruktionen (FPC-Compiler sind ueber http://www.freepascal.org erhaeltlich). Die zahlreichen Warnungen beim Kompilieren koennen ignoriert werden. * Dateien: gavrasm.pas: Hauptdatei gavrdev.pas: Unit mit allen Hardware-Eigenschaften und vordefinierten Symbolen der unterstuetzten AVR-Typen (ersetzt alle bekannten *def.inc Dateien) gavrif.pas: Unit zur Implementierung geschachtelter IF/IFDEF/IFNDEF/ELSE/ELIF/ENDIF-Konstruktionen gavrinst.pas: Verarbeitet den Instruktionsumfang und prueft auf zulaessige Instruktionen, wenn der Typ bekannt ist gavrlang.pas: Unit zur Sprachauswahl (deutsch, englisch, franzoesisch und Tuerkisch verfuegbar: gavrlang_de.pas, gavrlang_en.pas, gavrlang_fr.pas, gavrasm_tr.pas), deutsche Version durch Kopieren von gavrlang_de.pas, Einfuegen als gavrlang.pas und mit FPC compilieren. gavrline.pas: Unit zum Splitten der asm-Zeilen in ihre Bestandteile gavrmacr.pas: Unit fuer die Makro-Verwaltung gavrout.pas: Unit fuer die Hexausgabe (Flash, EEPROM) und das Listing gavrsymb.pas: Unit fuer die Symbole-Verwaltung auf dem Stack * Vor dem Kompilieren die gewuenschte Sprachdatei (gavrlang_de.pas) kopieren und als gavrlang.pas umbenennen! * Testdatei zur Ueberpruefung des Assemblers: instr.asm: Testdatei mit allen AVR-Instruktionen (Sollte fehlerfrei assemblieren, ergibt eine Warnung wegen fehlender def.inc-Direktive.) c) Direktiven: * Die .DEVICE-Direktive bindet automatisch alle Symbole des betreffenden AVR-Typs ein, das Include von *def.inc-Dateien ist damit jetzt ueberfluessig. Um mit anderen Assemblern kompatibel zu sein, kann die def.inc mit .INCLUDE "xxxdef.inc" eingebunden werden, was dasselbe bewirkt wie die .DEVICE- Direktive. Die .DEVICE-Direktive bindet nunmehr auch die 16-Bit-Zeigerregister X (XH:XL), Y (YH:YL) und Z (ZH:ZL) ein, sofern diese beim betreffenden AVR-Typ definiert sind. * Die .EXIT-Direktive ohne Bedingung bricht die weitere Verarbeitung der Quelldatei ab und ist kompatibel mit anderen AVR-Assemblern. Zusaetzlich kann aber auch eine Bedingung als Parameter angegeben werden. Ist die Bedin- gung erfuellt (TRUE, 1), dann bricht gavrasm den gesamten Assembliervorgang hier ab. Dies funktioniert auch in INCLUDE-Dateien. Dieses Feature kann verwendet werden, um z.B. Bereichs- pruefungen waehrend der Assemblierung durchzufuehren und bei Ueber- oder Unterschreitung bestimmter Grenzen mit einer entsprechenden Fehlermeldung abzubrechen und vermeidet die massenhafte Ausgabe von Folgefehlern. Diese Direktive kann teilweise durch die .ERROR-Direktive er- setzt werden. Die .ERROR-Direktive bricht aber die weitere Assemblierung nicht ab, sondern assembliert weiter. * Zusaetzliche .IF, .IFDEF, .IFNDEF, .ELSE, ELIF und .ENDIF Direktiven: Code nach .IF (Bedingung), .IFDEF (Symbol) und .IFNDEF (Symbol) wird nur assembliert, wenn die Bedingung wahr (1) bzw. das Symbol definiert bzw. nicht definiert ist, sonst wird zum Code nach der .ELSE-, .ELIF oder .ENDIF- Direktive verzweigt. Mit .ELIF kann im Unterschied zu .ELSE eine zusaetzliche Bedingung abgefragt werden. Bitte die ELIF-Direktive nur alternativ zu .ELSE verwenden, eine ge- mischte Verwendung ist nicht definiert! Die Definition des Symbols bei .IFDEF bzw. .IFNDEF MUSS vor der ersten Abfrage erfolgen, andernfalls resultieren Uebersetzungsfehler! Beliebig tief verschachtelte .IF, .IFDEF, .IFNDEF, .ELSE/ELIF und .ENDIF Direktiven sind zulaessig. * .IFDEVICE ermoeglicht Verzweigungen abhaengig vom AVR-Typ, andernfalls wird nach .ELSE, .ELIF oder .ENDIF weiter assembliert. * .UNDEF setzt das betreffende Symbol als undefiniert. * .MESSAGE gibt eine erzwungene Meldung (in "..." als Parameter) aus und kann zur Benachrichtigung waehrend des Uebersetzens verwendet werden. * .ERROR erzwingt einen Fehler mit einem definierbaren Fehler- text (in "..." als Parameter). * Rekursive .INCLUDE-Direktive mit beliebig tiefer Schachtelung, In der Linux-Version den Dateinamen auf jeden Fall in Gaense- fuesze einschlieszen! * Die Liste der unterstuetzten Direktiven wird durch Aufruf mit gavrasm -d ausgegeben. d) Mathematische Funktionen: * Um die erweiterten Moeglichkeiten von 64-Bit-Integer-Zahlen nutzen zu koennen, wurde die mathematischen Funktionen BYTE1 bis BYTE4 um die Funktionen BYTE5 bis BYTE8 erweitert. e) Makros: * Anders als bei anderen Assemblern muessen Makros schon vor ihrer ersten Verwendung definiert sein! * Erweiterte Makro-Aufrufe: - verschachtelte Aufrufe ohne Begrenzung zulaessig - erweiterte Parameterueberpruefung bereits innerhalb der Definition, nicht erst beim Aufruf - alle Labels in Makros sind lokal definiert und von auszerhalb des Makros zwecks verbesserter Fehlererkennung unzugaenglich - Labels in Makros sind auch vorwaerts und bei verschachtelten Makrodefinitionen gueltig - Optionale Verwendung von .ENDM oder .ENDMACRO zum Abschluss des Makros - Liste aller definierten und verwendeten Makros im Listing, wenn die Ausgabe der Symbolliste eingeschaltet ist (Aufruf mit Option -s und ohne Option -l bzw. mit .LIST im Quellcode f) Fehlererkennung und Syntaxpruefung: * Erweiterte Symbolpruefung auf Zulaessigkeit: - Exakte Unterscheidung nach Symboltypen (Typen: R fuer Register, C fuer Konstanten, V fuer Variablen, T fuer AVR-Typ- Definitionen, M fuer lokale Makro-Sprungmarken, L fuer Sprungmarken, G fuer globalisierte Lokalvariablen in Makros) - Erweitert kompatibel mit den meisten gaengigen ATMEL-def.inc- Dateien (akzeptiert OR und BRTS als Symbolname, weil diese in aelteren *def.inc-Dateien von ATMEL(R) verwendet wurden) - Erweiterte Erkennung undefinierter Symbole, keine Default- Setzung auf Null * Erweiterte Fehlerkommentierung und Warnungen (mehr als 100 Fehlertypen, 8 Warnungstypen) * Ausfuehrliche Syntaxdarstellung im Anfaengermodus (Option -eb) zu fehlerhaften Instruktionen und Direktiven in der Listdatei * Erweiterte Rechenpruefung (Ueber-, Unterlauf von Rechenschritten bei internen 64-Bit-Integerwerten) * Erweiterte zulaessige Zeichen in Literalkonstanten: ';', '''', '\n', '\\', "abc\n\j", "abc;def" * Zulaessiges Trennzeichen (Punkt, '.') in Binaer- und Hexadezimal- zahlen fuer verbesserte Lesbarkeit des Quellcodes (z.B. 0b0001.0010, $124A.035F, 0x82.FABC). Der Underscore '_' kann ebenfalls verwendet werden (Kompatibilitaet mit anderen Assemblern). * BYTE1-Funktion (analog zu BYTE2 etc.) * Ermoeglicht bei relativen Spruengen die Angabe des Displacements, z.B. rjmp +10 oder brcc -3 (Displacement MUSS in diesem Fall mit einem Vorzeichen beginnen) g) Unterstuetzte AVR-Typen: * Liste der unterstuetzten AVR-Typen durch Aufruf mit gavrasm -t * AT90S: 1200, 2313, 2323, 2333, 2343, 4414, 4433, 4434, 8515, 8535 * AT90C85: 34 * AT86RF: 401 * ATtiny: 4, 5, 9, 10, 11, 12, 13, 13A, 15, 20, 22, 24, 24A, 25, 26, 28, 40, 43U, 44, 44A, 45, 48, 80, 84, 84A, 85, 87, 88, 102, 104, 167, 202, 204, 212, 214, 261, 261A, 402, 404, 406, 412, 414, 416, 416auto, 417, 424, 426, 427, 4441, 461, 461A, 804, 806, 807, 814, 816, 817, 824, 826, 827, 828, 840, 841, 861, 861A, 1604, 1606, 1607, 1614, 1616, 1617, 1624, 1626, 1627, 1634, 2313, 2313A, 3214, 3216, 3217, 4313 * ATmega: 8, 8A, 8HVA, 8U2, 16, 16A, 16HVA, 16HVA2, 16HVB, 16HVBrevB, 16M1, 16U2, 16U4, 32, 32A, 32C1, 32HVB, 32HVBrevB, 32M1, 32U2, 32U4, 32U6, 48, 48A, 48P, 48PA, 48PB, 64, 64A, 64C1, 64HVE, 64HVE2, 64M1, 64RFR2, 83, 88, 88A, 88P, 88PA, 88PB, 103, 104, 128, 128A, 128RFA1, 128RFR2, 161, 161C, 162, 163, 164A, 164P, 164PA, 165, 165A, 165P, 165PA, 168, 168A, 168P, 168PA, 168PB, 169, 169A, 169P, 169PA, 256RFR2, 323, 324A, 324P, 324PA, 324PB, 325, 325A, 325P, 325PA, 328, 328P, 328PB, 329, 329A, 329P, 329PA, 406, 640, 644, 644A, 644P, 644PA, 644RFR2, 645, 645A, 645P, 649, 649A, 649P, 808, 809, 1280, 1281, 1284, 1284P, 1284RFR2, 1608, 1609, 2560, 2561, 2564RFR2, 3208, 3209, 3250, 3250A, 3250P, 3250PA, 3290, 3290A, 3290P, 3290PA, 4808, 4809, 6450, 6450A, 6450P, 6490, 6490A, 6490P, 8515, 8535 * ATxmega: 8E5, 16A4, 16A4U, 16C4, 16D4, 16E5, 32A4, 32A4U, 32C3, 32C4, 32D3, 32D4, 32E5, 64A1, 64A1U, 64A3, 64A3U, 64A4U, 64B1, 64B3, 64C3, 64D3, 64D4, 128A1, 128A1U, 128A3, 128A3U, 128A4U, 128B1, 128B3, 128C3, 128D3, 128D4, 192A3, 192A3U, 192C3, 192D3, 256A3, 256A3B, 256A3BU, 256A3U, 256C3, 256D3, 384C3, 384D3 * AT90CAN: 32, 64, 128 * AT90PWM: 1, 2, 2B, 3, 3B, 81, 161, 216, 316 * AT90USB: 82, 162, 646, 647, 1286, 1287 * ATA: 5272, 5505, 5700M322, 5702M322, 5781, 5782, 5783, 5787, 5790, 5790N, 5791, 5795, 5831, 5832, 5833, 5835, 6285, 6286, 6289, 6612C, 6613C, 6614Q, 6616C, 6617C, 8210, 8215, 8510, 8515, 664251 h) Sprachversionen: * Deutsche, englische, franzoesische und tuerkische Sprachversion verfuegbar (Quellcode und ausfuehr- bare Linux- bzw. Windows-Versionen) h) Offene Punkte und bekannte Fehler: * Aus undurchsichtigen Gruenden verwendet ATMEL in seinen def.inc-Dateien mittlerweile auch C-Definitionen. Diese habe ich beim Einlesen und Auswerten dieser Dateien und bei der Generierung der Symboltabellen teilweise igno- riert. Eine exakte Implementierung werde ich nur vorneh- men, wenn ich eine Fehlermeldung von einem User erhalte. * Die Verarbeitung von Zahlen arbeitet konsequent mit 64-Bit-Integer-Zahlen. Ich habe nicht vor, Fliesskomma- Zahlen zu implementieren, weil diese in Assembler voellig ueberfluessig sind. Wer beim Multiplizieren oder Teilen Wert auf korrektes Runden des Ergebnisses legt, muss dies mit den Methoden der Ganzzahlenmathematik selbst formu- lieren. * Das Verwenden von Symbolen in ESEG- oder DSEG-Segmenten, die erst spaeter im Quellcode definiert werden, fuehrt unter Umstaenden zu einem schweren internen Fehler, weil nachfolgende Symbole falsch platziert werden. Bitte daher solche Forward-Verwendungen vermeiden. * Hinweis: Generell mit Vorsicht zu geniessen sind Zahlenwerte, die bis nahe der Grenze des 64-Bit- Integer-Wertebereichs reichen. Hier werden Ueberlaeufe nicht immer korrekt erkannt und behandelt. * Aus gegebenem Anlass: Wer im Datensegment die Laenge von Feldern nicht fest vorgeben will und diese stattdessen im Quellcode berechnen moechte, verlegt das Datensegment bitte HINTER die Berechnung der Feldlaenge(n), denn die Verwendung von Forward-Werten, die erst spaeter berechnet werden, fuehrt zu einem ernsten Crash von gavrasm (wegen des Adressen- Unterschieds zwischen Assemblier-Durchgang 1 und 2). Versionen und Aenderungen ------------------------- Neueste Versionen unter http://www.avr-asm-tutorial.net/gavrasm/index_de.html Hinweis: Der AVR-Assembler-Simulator avr_sim enthaelt gavrasm in der jeweils neuesten Version. Er ist als Lazarus-Quellcode und als fertig kompilierte aus- fuehrbare Datei fuer Linux und Windows (64-Bit) er- haeltlich und kann hier heruntergeladen werden: http://www.avr-asm-tutorial.net/avr_sim/index_de.html. August 2022: Version 5.4 - Korrigiert: Bei tiefer geschachtelten .if mit mehr als zwei Ebenen traten bei der Verwendung von .else Fehler auf, die falschen Code zur Folge hatten. Ebenso wurden andere Direktiven wie z. B. .db oder .dw trotz nicht eingehaltener .if-Bedingung faelschlich trotzdem ausge- fuehrt. - Korrigiert: Bei der Auswertung von .if-Bedingungen wurden bei Berechnungen innerhalb der Bedingung die Prioritaets- regeln nicht beachtet, so dass fehlerhafte Verzweigungen erfolgten. - Korrigiert: Ein Fehler bei der Verarbeitung von Kleinbuch- staben mit 'a', ..., als Parameter wurde korrigiert. Juli 2022: Version 5.3 - Geaendert: Gibt man den Namen der Include-Datei ohne einschlieszende "" oder '' an, dann wurde die angegebene Datei nicht gefunden. Dies betraf nur die Linux-Version. Mai 2022: Version 5.2 - Korrigiert: Beim Teilen von negativen Zahlenwerten trat ein Fehler auf (niedrigere Bytes lieferten nicht die geteilte Zahl sondern Null). Dasselbe Phaenomen trat bei der Rechenmethode % auf (Teilerrest, Modulo-Wert). Beides ist korrigiert. November 2021: Version 5.1 - Geaendert: Das Definieren von internen Symbolen, die bereits mit .INCLUDE "*def.inc" oder .DEVICE "Typ" eingefuegt wurden, mit .EQU Symbol = Wert ergab bisher eine Fehlermeldung. Diese wurde fuer den Fall beseitigt, wenn der intern gesetzte Wert mit dem gesetzten Wert in .EQU exakt uebereinstimmt. Juli 2021: Version 5.0 - Korrigiert: Bei der Verwendung von Inclde-Dateien, die in uebergeordneten Pfaden liegen, ergaben sich Fehler. Diese sind in dieser Version korrigiert. - Korrigiert: Ein Fehler fuehrte dazu, dass %-Operationen (Modulo) nicht akzeptiert wurden. Der Fehler ist beseitigt. - Korrigiert: Bei offenen .IF, .IFEDF oder .IFNDEF am Ende des Assemblierens wurden diese nicht korrekt erkannt und behandelt. - Korrigiert: Wenn bei den AVR-L-Typen Labels erst im spaeteren Quellcode definiert wurden, trat Fehler 24 schon im ersten Assemblier-Durchgang auf. - Korrigiert: Beim Assemblieren von STS/LDS-Instruktionen in AVR8L-Typen wurde deren Typ nicht erkannt und korrekt kodiert, wenn statt der internen Symbole eine externe def.inc verwendet wurde. - Korrigiert: Bei der Funktion EXT2 lieferten negative Zahlen nicht Null. - Korrigiert: Ein Fehler bei der Verwendung von R als Register-Symbol korrigiert. - Korrigiert: .ELIF funktionierte nicht korrekt. Das habe ich geaendert. - Geaendert: Bei der Verarbeitung von Zeilen, deren Laenge 255 Zeichen uebersteigt, wurde eine aussagekraeftige Fehlermeldung hinzugefuegt. - Geaendert: Bei logischen UND-(&&) und ODER-(||)-Verknuep- fungen werden, wenn bereits der erste Parameter zum Ergebnis fuehrt (bei UND: Null, bei ODER: Eins) alle weiteren Parameter nicht mehr ueberprueft. Daher kann bereits mit dem ersten Parameter die weitere Auswertung des gesamten Ausdrucks unterbunden werden. - Geaendert: gavrasm sucht nun nicht mehr nach test.asm, wenn es keine Quellcode-Datei in der Aufrufzeile findet. Januar 2021: Version 4.9 - Korrigiert: Fehler bei den Devices ATmega64RFR2, 128RFR2 und 256RFR2 bei den ausfuehrbaren Instruktionen ADIW und SBIW wurden korrigiert. - Korrigiert: Beim ATmega16M1 waren die Instruktionen JMP und CALL versehentlich als nicht ausfuehrbar ge- kennzeichnet. - Korrigiert: Die Verarbeitung von sehr grossen Integer- Zahlen erlaubte nicht die Ausnutzung des gesamten verfuegbaren Zahlenraums nach oben hin. - Hinzugefuegt: Beim ATtiny84A enthielt die Original def.inc die Symbole PORF, EXTRF, BORF und WDRF nicht. Diese werden nun von gavrasm hinzugefuegt, falls sie nicht bereits vorhanden sind. - Hinzugefuegt: Die Kommentierungen mit // und der Kombination /* mit */ (mit mehreren Ebenen) ist nunmehr hinzugefuegt. - Hinzugefuegt: Unterstuetzung fuer ATtiny1624/1626/1627, ATTiny424/426/427 und ATtiny824/826/827. Juli 2020: Version 4.8 - Korrigiert: Ein schwerwiegender Fehler in Version 4.7 beim Definieren und bei der Benutzung von Registern wurde korrigiert. Juni 2020: Version 4.7 - Korrigiert: Ein fehlender Ausdruck links von einer Rechenfunktion (z.B. in "(<>N arbeitete bei N>8 nicht korrekt, da die entsprechende Pascal-Funktion auf N<=8 limitiert war. - Hinzugefuegt: Support fuer ATmega808/809/1608/1609. November 2019: Version 4.5 - Korrigiert: Ein Fehler bei der Verwendung von Register- symbolen bei den AVR8L-Typen (ATtiny4/6/8/10) wurde beseitigt. Oktober 2019: Version 4.4 - Hinzugefuegt: Z-Option auf der Kommandozeile (Datum als Byte-Zahlenwerte in den Konstanten NOW_D, NOW_M und NOW_Y sowie das Datum als Integer-Zahlenwert NOW_I als Tage seit dem 1.1.1900). - Korrigiert: Die SPM-Instruktion ist bei den ATtiny441/841 nunmehr gueltig. - Korrigiert: Die Adressen von OCR1BH/L und ICR1H/L beim ATtiny1634 waren fehlerhaft (bereits in der Studio-def.inc). Das ist korrigiert. - Korrigiert: Ein Problem mit negativen Zahlen bei den arith- methischen Funktionen (insb. HIGH) wurde behoben. - Geaendert: Die Direktive .DEVICE (Typ) bindet nunmehr auch die Zeigerregister X (XH:XL), Y (YH:YL) und Z (ZH:ZL) in den- jenigen AVR ein, in denen diese definiert sind. Die Di- rektive ist nunmehr gleichwertig zu .INCLUDE "xxxdef.inc", benoetigt aber keine .LIST und .NOLIST Direktiven und gibt auch keine Warnung aus. Juli 2019: Version 4.3 - Korrigiert: Bei fehlendem Eintrag in eine Parameterliste (z.B. mit ,,) erfolgte ein Absturz. Dies ist korrigiert. - Geaendert: Alle internen Berechnungen werden jetzt in 64-Bit-Integer ausgefuehrt. Dies bedingt, dass erheblich groeszere Zahlenwerte moeglich und zulaessig sind. Ent- sprechend wurden die Funktionen um BYTE5 bis BYTE8 er- gaenzt, die entsprechenden Zugriff auf die hoeheren Bytes ermoeglichen. - Geaendert: Bei der Verarbeitung von .IF-Direktiven gab es unter ganz bestimmten Umstaenden fehlerhafte Ergebnisse, deren Ursache sich nicht identifizieren finden liesz. Die gesamte Verarbeitung der .IF-Direktiven wurde daher neu bearbeitet und geaendert. - Geaendert: Die Ueberpruefung von negativen Zahlen, in frueheren Versionen auf den Bereich -1 bis -128 begrenzt, erlaubt nun wieder negative Zahlen bis -255. - Hinzugefuegt: Unterstuetzung fuer zahlreiche neuere ATtiny-Typen, siehe obige Liste Maerz 2019: Version 4.2 - Korrigiert: Bei den relativen Spruengen BRxC/BRxS und RJMP/RCALL traten Fehler auf, wenn das Sprungziel exakt die Ober- und Untergrenze des zulaessigen Bereichs erreich- te. Das ist nunmehr korrigiert. - Korrigiert: Beim Assemblieren der Testdatei instr.asm mit allen Instruktionen der AVRs trat bei den ST/LD-Instruktio- nen Fehlermeldungen auf, da gavrasm bei fehlender def-Include faelschlich fuer den Typ AT90S1200 assemblierte. Das ist korrigiert. - Korrigiert: Die Verwendung von Sprungzielen und Labels in Makros fuehrte zu einem schwerwiegenden Fehler, da das Sprungziel fehlerhaft berechnet wurde. Dies ist korrigiert. - Geaendert: Die gesamte Verarbeitung von Labels in Makros wurde ueberarbeitet. Makro-Labels werden nun im Format Label@Makroname@Aufrufnummer als normale Labels gespeichert und verarbeitet und sind mit ihren Programmzaehler-Adressen so auch in der Symbolliste angegeben. Die Direktive .SETGLOBAL wurde entfernt, da alle Labels unter diesen Namen global zugaenglich sind und die Direktive nun keinen Sinn mehr macht. - Korrigiert: Die Assembler-Option -w (Wrap around) war fehler- haft umgesetzt und hat nicht funktioniert. Das wurde korrigiert. - Hinzugefuegt: Die Syntax R[n+1]:R[n] zur Angabe der Register- paare war bei der MOVW-Instruktion nicht implementiert und fuehrte zu einer Fehlermeldung. Diese Syntax wurde hinzuge- fuegt. Ausserdem wurden bei MOVW, ADIW und SBIW auch die Registerpaarangaben X, Y und Z hinzugefuegt. - Korrigiert: Bedingt durch einen ernsten Fehler im Datenblatt des ATmega328PB waren eine Reihe von Instruktionen, wie z.B. ADIW/SBIW, MUL/FMUL, LPM und SPM als unzulaessig eingeordnet. Dieser Fehler ist korrgiert. - Korrigiert: Bedingt durch eine fehlerhafte Pruefung liesz sich die letzte Speicherzelle im Flash nicht nutzen. Das ist korrigiert. - Korrigiert: Die Verwendung eines undefinierten Parameters b in (a<