Beschreibung: | Definiert ein Makro mit dem Namen <Name> und der Parameterzahl <Parameterzahl>. Ein Makro ist eine Abkürzung für häufig verwendete Codeabschnitte. Das Makro wird im Quelltext behandelt wie jeder andere Pseudobefehl. Jedesmal beim Aufruf des Makros wird der in der Makrodefinition gegebene Quellcode eingesetzt unter Berücksichtigung der übergebenen Parameter.
|
| Innerhalb des Makrocodes kann auf die Parameter in der Form @<Parameternummer> zugegriffen werden.
|
| Wird als dritter Parameter OVERRIDE angegeben, so können reservierte Bezeichner (Assembler- und Pseudobefehle) als Makroname verwendet werden. Diese werden dann durch das Makro "überschrieben", so daß ein Zugriff auf den ursprünglichen Assemblerbefehl nicht mehr möglich ist, sondern stattdessen immer das Makro eingesetzt wird.
|
| Innerhalb des Makrocodes können Parameter auch als Befehl eingesetzt werden. Dies ermöglicht es, einem Makro einen Pseudo- oder Assemblerbefehl als Parameter mitzugeben, der dann im Makrocode verwendet wird (siehe Beispiel 4).
|
|
Format: | <Name> sollte nur die Zeichen 'A'...'Z', 'a'...'z', '0'...'9' und '_' enthalten, das erste Zeichen darf keine Zahl sein; zwischen Groß- und Kleinschreibung wird nicht unterschieden. Anderweitig definierte Symbole (z.B. Assemblerbefehle, Labels, Prozessorregister etc.) dürfen nicht als Makroname verwendet werden.
|
| <Parameterzahl> muß ein in Pass 0 auswertbarer nichtnegativer mathematischer Ausdruck sein.
|
|
Lokale Labels: | Innerhalb eines Makros können sowohl lokale als auch globale Labeldefinitionen erfolgen. Lokale Labelnamen beginnen stets mit einer Tilde ('~'). Die lokalen Labels sind jeweils nur innerhalb einer Makroinstanz gültig, der nächste Makroaufruf erhält einen neuen Satz der lokalen Labels. Lokale Labels können nur innerhalb des Makrocodes verwendet werden.
|
| Intern erzeugt der Assembler aus den lokalen Labels Labels der Form '_<Nr. des Makroaufrufs>_<Labelname>' (die auch außerhalb der jeweiligen Makroinstanz zugänglich sind, jedoch sollte ein Zugriff wegen der daraus folgenden Unübersichtlichkeit und aus Gründen der Kompatibilität mit künftigen Versionen des Assemblers vermieden werden).
|
|
Bemerkung: | Da die Makrodefinitionen in Pass 0 ausgewertet werden, kann ein Makro überall im Quelltext definiert werden, und auch schon vor seiner Definition verwendet werden.
|
| Innerhalb eines IF, IFDEF oder IFSTREQ-Statements ist eine Makrodefinition unzulässig.
|
| Normale Label- und Symboldefinitionen sind innerhalb von Makros zulässig, jedoch darf ein solches Makro nur einmal aufgerufen werden (es sei denn, alle Symboldefinitionen erfolgen mit DEFL).
|
| Achtung:
|
| Wird eine (nicht lokale, s.o.) Symboldefinition mit DEFL innerhalb eines Makros verwendet und das Makro später mehrfach aufgerufen, so behält das Symbol auch im zweiten Makroaufruf seinen im ersten Aufruf erhaltenen Wert bis zu der Makrozeile mit der neuen Definition.
|
| Innerhalb des Makros können andere Makros aufgerufen werden, auch ein rekursiver Aufruf des gerade definierten Makros ist möglich. Die Verschachtelungstiefe ist hierbei auf 250 Aufrufe beschränkt.
|
|
Siehe auch: | Die Befehle ENDMACRO, DEFINE, IF, IFDEF, IFSTREQ
|
| Pseudokommandos
|
|
Beispiel: | MACRO memcopy,3
|
| LD HL,@1
|
| LD DE,@2
|
| LD BC,@3
|
| LDIR
|
| ENDMACRO
|
|
| ; kopiert 20 Bytes von 1000 nach 2000:
|
| MEMCOPY 1000,2000,20
|
|
Beispiel 2: | MACRO WriteString,1
|
| LD HL,~mytext
|
| LD B,~mytextend-~mytext
|
| ; B enthält Textlänge
|
| ~myloop:
|
| LD A,(HL)
|
| ; Zeichen in A ausgeben
|
| CALL WriteChar
|
| DJNZ ~myloop
|
| JR ~mytextend
|
| ~mytext:
|
| DEFM @1
|
| ~mytextend:
|
| ENDMACRO
|
|
| ; Gibt Meldungen aus:
|
| WriteString "Hallo Welt!"
|
| WriteString "Kurz."
|
|
Beispiel 3:
|
Beschreibung: | Definiert Platzhalter für Zeichenketten, d.h. in Pass 0 werden alle Vorkommen von <Zeichenkette1> im Quelltext durch <Zeichenkette2> ersetzt. Dies ist z.B. nützlich, um Prozessorregister durch "lesbare" Namen zu ersetzen.
|
|
Format: | <Zeichenkette1> und <Zeichenkette2> dürfen nur die Zeichen 'A'...'Z', 'a'...'z', '0'...'9', '_' und '.' enthalten. Die reservierten Bezeichner MACRO, ENDMACRO und DEFINE können nicht umdefiniert werden, d.h. sind weder als <Zeichenkette1> noch als <Zeichenkette2> zulässig.
|
| Eine Zeichenkette, die bereits als Ersatz für eine andere Zeichenkette definiert ist (d.h. bereits als <Zeichenkette2> in einem DEFINE-Statement vorkam), kann nicht mehr umdefiniert werden, d.h. folgender Quellcode kann nicht übersetzt werden:
|
| DEFINE ABC=DEF
|
| DEFINE DEF=GHI
|
| Weiterhin kann einer Zeichenkette nur einmal ein Ersatz zugewiesen werden, d.h. jede Zeichenkette darf nur einmal als <Zeichenkette1> auftreten.
|
|
Bemerkung: | Innerhalb eines IF, IFDEF oder IFSTREQ-Statements ist ein DEFINE-Statement unzulässig.
|
|
Siehe auch: | Der Befehl MACRO
|
| Pseudokommandos
|
|
Beispiel: | DEFINE TEMP=R20
|
| ;R20 für temporäre Berechnungen verwenden
|
| SWAP: ;R0 und R1 vertauschen
|
| MOV TEMP,R0
|
| MOV R0,R1
|
| MOV R1,TEMP |
Beschreibung: | Die Assemblierung wird in der angegebenen Datei/den angegebenen Dateien (in der angegebenen Reihenfolge) fortgesetzt. Enthält <Dateiname> keine voll qualifizierte Pfadangabe, so wird die Datei im Verzeichnis der Assemblerdatei, die den INCLUDE-Befehl enthält, gesucht. Ist diese Suche erfolglos, so wird in den im Suchpfad angegebenen Verzeichnissen gesucht (Menü Projekt-Dateiverwaltung). Sind mehrere INCLUDE-Befehle verschachtelt, so wird noch in den Verzeichnissen der übergeordneten Assemblerdateien gesucht. Hat der angegebene Dateiname keine Erweiterung, so wird auch nach <Dateiname>.ASM gesucht.
|
| Nach dem Erreichen des Dateiendes der angegebenen Datei(en) wird die Assemblierung in der dem INCLUDE-Befehl folgenden Zeile fortgesetzt.
|
|
Bemerkung: | Innerhalb eines IF, IFDEF oder IFSTREQ-Statements ist INCLUDE unzulässig.
|
|
Siehe auch: | Die Befehle INCLUDEBINARY, CAT, END
|
| Pseudokommandos
|
|
Beispiel:
|
Beschreibung: | Die Assemblierung wird in der angegebenen Datei fortgesetzt. Enthält <Dateiname> keine voll qualifizierte Pfadangabe, so wird die Datei im Verzeichnis der Assemblerdatei, die den CAT-Befehl enthält, gesucht. Ist diese Suche erfolglos, so wird in den im Suchpfad angegebenen Verzeichnissen gesucht (Menü Projekt-Dateiverwaltung). Wurde die aktuelle Assemblerdatei durch einen INCLUDE-Befehle erreicht, so wird noch in den Verzeichnissen der übergeordneten Assemblerdateien gesucht.
|
| Nach dem Erreichen des Dateiendes der angegebenen Datei wird die Assemblierung der Datei, die den CAT-Befehl enthält, nicht fortgesetzt.
|
|
Bemerkung: | Innerhalb eines IF, IFDEF oder IFSTREQ-Statements ist CAT unzulässig.
|
|
Siehe auch: | Die Befehle INCLUDE, INCLUDEBINARY, END
|
| Pseudokommandos
|
|
Beispiel:
|
Beschreibung: | Öffnet die angegebene Datei als Parameterdatei. Bei der angegebenen Datei muß es sich um eine Textdatei handeln. Diese kann mit Hilfe des vordefinierten Symbols _READPAR Zeile für Zeile gelesen und ausgewertet werden.
|
| Enthält <Dateiname> keine voll qualifizierte Pfadangabe, so wird die Datei im Verzeichnis der Assemblerdatei, die den Befehl enthält, gesucht. Ist diese Suche erfolglos, so wird in den im Suchpfad angegebenen Verzeichnissen gesucht (Menü Projekt-Dateiverwaltung). Ist bereits eine Parameterdatei geöffnet, so wird diese geschlossen und danach die neue Datei geöffnet.
|
| Nach dem Erreichen des Dateiendes der angegebenen Datei löst die Verwendung des vordefinierten Symbols _READPAR einen Fehler aus.
|
|
Siehe auch: | Die Befehle INCLUDE, _READPAR
|
| Pseudokommandos
|
|
Beispiel: | PARAMETERFILE "mynumbers.txt"
|
| mydata: EQU _READPAR*2 |
Beschreibung: | Die dem IFDEF-Befehl folgenden Zeilen werden nur ausgewertet, wenn das übergebene Symbol definiert ist bzw. sämtliche im übergebenen Ausdruck vorkommenden Symbole definiert sind. Die bedingte Übersetzung wird beendet mit dem ENDIF-Befehl, der zwingend zu jedem IFDEF-Befehl gehört. IF, IFDEF und IFSTREQ Blöcke können auch geschachtelt werden.
|
|
Format: | <Symbol> muß in Pass 1 auswertbar sein, d.h. die Bedingung ist nur erfüllt, wenn es vor dem IFDEF-Befehl definiert worden ist.
|
| <Ausdruck> muß in Pass 1 auswertbar sein, d.h. die Bedingung ist nur erfüllt, wenn alle in <Ausdruck> vorkommenden Symbole vor dem IFDEF-Befehl definiert worden sind.
|
|
Siehe auch: | Die Befehle IF, IFSTREQ, ELSE, ENDIF
|
| Pseudobefehle
|
|
Beispiel:
|
Beschreibung: | Der Befehl ORG legt die Startadresse des erzeugten Codes fest. Hierbei gibt es zwei Varianten:
|
| Tritt ORG erstmals und vor dem ersten Binärcode erzeugenden Befehl auf, so wird lediglich der Programmzähler auf den durch den <Ausdruck> gegebenen Wert gesetzt.
|
| Wurde jedoch vor dem ORG-Befehl bereits Binärcode erzeugt oder ORG bereits angewandt, so wird der Programmzähler nicht einfach auf den neuen Wert gesetzt, sondern die entstehende Adressdifferenz (der entstehende Leerraum) mit Nullbytes gefüllt. Daher kann der Programmzähler durch ORG nicht "rückwärts" verstellt werden.
|
|
Format: | <Ausdruck> muß ein in Pass 1 auswertbarer mathematischer Ausdruck sein.
|
|
Bemerkung: | Wird kein ORG-Befehl verwendet, wird als Startadresse 0000h angenommen.
|
| Der Programmzähler zählt in Einheiten der Wortgröße desaktuellen Segments, z.B. ist die Codesegment-Wortgröße 1 Byte bei Z80 und 8051, 2 Bytes beim Atmel AVR. "ORG 10" meint also nicht unbedingt das 10. Byte des Speichers, sondern das 10. Wort, beim AVR z.B. damit das 20. Byte.
|
|
Siehe auch: | Der Befehl SETBASE
|
| Segmente, Pseudokommandos
|
|
Beschreibung: | Der Befehl DEFSEGMENT definiert ein neues Code- oder Datensegment. Nähere Informationen über Segmente finden Sie hier.
|
| <Name> gibt den Namen des Segments an. Dieser kann beliebig gewählt werden, darf aber natürlich nur einmal verwendet werden. Groß- und Kleinschreibung wird nicht unterschieden.
|
| <Wortbreite> gibt die Wortbreite in Bytes, die für das Segment gelten soll, an. Sofern Alignment eingeschaltet ist, wird jeder codeerzeugende (Pseudo-)Befehl mit Nullbytes auf die Wortbreite aufgefüllt. Die Wortbreite beträgt z.B. bei der Z80-Serie ein Byte, beim Atmel AVR zwei Bytes (für das Programmcode-Segment). Der Wert 0 kann eingesetzt werden, um die Default-Wortbreite für das Codesegment des gewählten Prozessors einzustellen.
|
| <Endadresse> gibt die letzte verfügbare Adresse des definierten Segments an. Wenn während der Codeerzeugung im Segment diese Adresse überschritten wird, so erzeugt der Assembler eine Warnung. Eine 0 für diesen Parameter schaltet die Adreßprüfung ab.
|
| <Dateiname> gibt den Ausgabe(binär-)dateinamen für den erzeugten Code des Segments an. Dieser Parameter ist optional. Wird kein Dateiname angegeben, so erzeugt der Assembler automatisch einen geeigneten: Das erste definierte Segment erhält den Namen "<Hauptdatei>.BIN"; die weiteren Segmente erhalten Namen der Form "<Hauptdatei>.<Segmentname>.BIN". Wenn der Segmentname keine Zeichen enthält, die in Dateinamen zulässig sind, wird er durch "SEGMENT<Nr. des Segments>" ersetzt. Soll keine Datei für dieses Segment erzeugt werden, kann ein leerer Name ("") angegeben werden.
|
| Die erste Segmentdefinition muß vor dem ersten Codeerzeugenden Befehl im Quellcode stehen. Die weiteren Segmente können an beliebiger Stelle, jedoch vor ihrem ersten Aufruf, definiert werden. Erfolgt keine Segmentdefinition, so erzeugt der Assembler ein Default-Segment, das der Definition DEFSEGMENT "_DEFAULT",0,0 entspricht.
|
|
Format: | <Name> kann eine beliebige Zeichenkette, die noch nicht als Segmentname verwendet wurde, sein.
|
| <Wortbreite> muß ein in Pass 1 auswertbarer mathematischer Ausdruck im Bereich 0 bis 16 sein.
|
| <Endadresse> muß ein in Pass 1 auswertbarer, positiver mathematischer Ausdruck sein.
|
| <Dateiname> muß entweder leer sein, oder ein gültiger Dateiname mit oder ohne Pfadangabe, aber mit Erweiterung sein, der noch nicht für ein anderes Segment vergeben wurde.
|
|
Bemerkung: | Der Programmzähler zählt in Einheiten der Wortgröße des aktuellen Segments.
|
|
Siehe auch: | Die Befehle SEGMENT, ORG, ALIGN
|
| Segmente, Pseudokommandos
|
|
Beschreibung: | Der Befehl SEGMENT ruft das durch <Name> festgelegte Segment auf. Der dem Befehl folgende Programmcode wird für das angegebene Segment übersetzt. Nähere Informationen über Segmente finden Sie hier. <Name> gibt den Namen des Segments an. Dieser kann beliebig gewählt werden, darf aber natürlich nur einmal verwendet werden. Groß- und Kleinschreibung wird nicht unterschieden.
|
| Wird der Befehl nicht aufgerufen, wird sämtlicher Code für das erste definierte Segment übersetzt.
|
|
Format: | <Name> muß ein gültiger, bereits definierte Segmentname sein.
|
|
Bemerkung: | Jedes Segment hat seine eigene Ausgabedatei sowie seinen eigenen Programmzähler.
|
|
Siehe auch: | Die Befehle DEFSEGMENT, ORG, ALIGN
|
| Segmente, Pseudokommandos
|
|
Beschreibung: | Der Befehl ALIGN gibt an, ob der von einem Befehl erzeugte Binärcode jeweils mit Nullbytes auf die Wortbreite des aktiven Segments aufgefüllt wird (ALIGN ON) oder nicht (ALIGN OFF).
|
| Ist das Alignment eingeschaltet, wird nach jedem Befehl geprüft, ob eine durch die Wortbreite teilbare Anzahl von Bytes erzeugt wurde und ggf. mit Nullbytes aufgefüllt.
|
| Bei ausgeschaltetem Alignment werden keine Nullbytes eingefügt, so daß z.B. durch DEFB-Befehle auch im Codesegment eines Atmel-AVR-Prozessors (16Bit-Wortbreite) einzelne Bytes erzeugt werden. Beachten Sie, daß der Programmzähler (PC) in Einheiten der Wortbreite und nicht in Bytes zählt, daher sind Labeldefinitionen nicht möglich, wenn der PC auf diese Weise einen nicht ganzzahligen Wert hat.
|
|
Bemerkung: | Der über das Symbol $ zugängliche Wert des Programmzählers gibt immer nur den ganzzahligen Anteil zurück.
|
| Bereiche ohne Alignment sind nützlich, um mit DEFB, DEFM etc. ohne Verschwendung einzelner Bytes den Speicher von Prozessoren mit einer Wortbreite größer als ein Byte zu füllen.
|
| Beim Wiedereinschalten des Alignments werden ggf. Nullbytes eingefügt, um das nächste ganze Wort zu erreichen.
|
|
Siehe auch: | Der Befehl DEFSEGMENT
|
| Segmente, Pseudokommandos
|
|
Beschreibung: | Labels sind eine symbolische Repräsentation von Adressen. Die Definition erfolgt in der Form:
|
| <Labelname>:
|
| oder (je nach eingestellten Optionen) auch als
|
| <Labelname>
|
| wobei <Labelname> am Zeilenanfang stehen und ein Leerzeichen folgen muß.
|
| Das Label kann in die Export-Symboltabelle exportiert werden, wenn in der Zeile der Labeldefinition der Pseudobefehl EXPORT angegeben wird:
|
| <Labelname>: EXPORT
|
|
Format: | Ein Label kann sich aus den Zeichen 'A'...'Z','a'..'z','0'...'9' und '_' zusammensetzen, wobei als erstes Zeichen keine Zahl zulässig ist. Je nach eingestellten Optionen sind auch die Sonderzeichen ab #128 zulässig, also z.B. Umlaute. Zwischen Groß- und Kleinschreibung wird nicht unterschieden; die Länge ist unbegrenzt und alle Zeichen sind signifikant. Reservierte Wörter (i.a. die hier beschriebenen Pseudobefehle, Assemblerbefehle, Prozessorregister etc.) sind nicht als Labels zulässig.
|
| Innerhalb eines Makros sind lokale Labels möglich. Diese beginnen mit dem Zeichen '~'.
|
|
Bemerkung: | Die beiden Definitionen
|
| Marke: CALL irgendwas
|
| und
|
| Marke: EQU $
|
| CALL irgendwas
|
| sind formal gleichwertig, sofern das Alignment eingeschaltet ist. Bei ausgeschaltetem Alignment ist die erste Definition der Sprungmarke nur zulässig, wenn die aktuelle Adresse (PC) ganzzahlig ist. Die zweite Definition mit EQU führt zu keinem Fehler, da $ nur den ganzzahligen Anteil des Programmzählers referenziert.
|
|
Siehe auch: | Die Befehle EQU, DEFL, EXPORT
|
| Pseudokommandos
|
Beschreibung: | Fügt die durch <Ausdruck1> angegebene Zahl von Bytes in den Binärcode ein. Ist <Ausdruck2> angegeben, so werden Bytes mit dem Wert von <Ausdruck2> eingefügt, andernfalls werden Nullbytes eingefügt.
|
|
Format: | <Ausdruck1> ist ein in Pass 1 auswertbarer mathematischer Ausdruck im Bereich von 0...+1048576.
|
| <Ausdruck2> ist ein in Pass 2 auswertbarer mathematischer Ausdruck im Bereich von -128...+255.
|
|
Bemerkung: | Bei Segmenten mit einer Wortbreite von mehr als einem Byte (z.B. Codesegment Atmel AVR, Wortbreite 16bit=2 Bytes) werden ggf. bei eingeschaltetem Alignment zusätzliche Nullbytes eingefügt, bis die durch das DEFS-Statement erzeugte Anzahl von Bytes durch die Wortbreite teilbar ist, d.h. "angebrochene" Wörter werden mit Nullbytes gefüllt.
|
|
Siehe auch: | Die Befehle DEFB, DEFW, DEFINT, DEFM
|
| Pseudokommandos |
Beschreibung: | Fügt den angegeben Text in den Binärcode ein. Die Codierung erfolgt gemäß dem eingestellten WindowsÔ Zeichensatz. Folgende Zeichen haben hierbei eine Sonderfunktion:
|
| ^: Das folgende Zeichen wird als Steuercode ausgewertet (d.h. AND 31).
|
| |: Das folgende Zeichen wird mit 128 "ODER"-Verknüpft (d.h. OR 128).
|
| \: Das folgende Zeichen wird nicht als Steuerzeichen ausgewertet.
|
| Wird innerhalb des Textes das begrenzende Anführungszeichen " (bzw. ', s.u.) zweimal hintereinander eingegeben, so wird ein Anführungszeichen in den Binärcode übernommen.
|
| Statt eines Textes in Anführungszeichen kann auch ein mathematischer Ausdruck im Bereich -128 bis +255 angegeben werden, der dann (als ein Byte) in den Binärcode eingefügt wird.
|
|
Bemerkung: | Als Zeichenketten-Markierung kann statt des Zeichens " auch das Zeichen ' verwendet werden. Dies wird jedoch aus Gründen der Lesbarkeit nicht empfohlen, da das Zeichen ' in einigen Assemblerdialekten bereits anderweitig verwendet wird (z.B. Z80: EX AF,AF').
|
| Bei Segementen mit einer Wortbreite von mehr als einem Byte (z.B. Atmel AVR, Wortbreite 16bit=2 Bytes) werden bei eingeschaltetem Alignment ggf. zusätzliche Nullbytes eingefügt, bis die durch das DEFM-Statement erzeugte Anzahl von Bytes durch die Wortbreite teilbar ist, d.h. "angebrochene" Wörter werden mit Nullbytes gefüllt.
|
|
Siehe auch: | Die Befehle DEFFMTSTR, DEFB, DEFW, DEFINT, DEFS
|
| Der Befehl DEFDATETIME
|
| Pseudokommandos
|
|
Beispiel: | DEFM "Hallo Welt^M"
|
| DEFM "Hallo Welt",13
|
| DEFM "In ""Anführungszeichen""" |
Beschreibung: | Formatiert die angegebenen Werte entsprechend dem Format-String und fügt die entstehende Zeichenkette ähnlich dem Befehl DEFM in den Binärcode ein.
|
| Der Format-String setzt sich aus Formatanweisungen und normalen Zeichen zusammen. Jedes Zeichen, das keine Formatanweisung ist, wird 1:1 in die Ausgabe übernommen. Hierbei haben die Zeichen "^", "|" und "\" die beim Befehl DEFM beschriebenen Sonderfunktionen zum Erzeugen von Steuerzeichen.
|
| Die Formatanweisungen haben folgendes Format:
|
| "%" [<index> ":"] ["-"] [<width>] ["." <prec>] type
|
|
| Eine Formatanweisung beginnt immer mit dem Zeichen %. Danach kommt (in dieser Reihenfolge):
|
| <index>":" (optional) die Angabe der Nummer des <Wert>-Parameters, auf den zugegriffen wird. Die Zählung beginnt bei 0. Wird index nicht angegeben, greifen die Formatanweisungen der Reihe nach auf die <Wert>-Parameter zu.
|
| "-" (optional) erzwingt linksbündige Ausrichtung der formatierten Zahl.
|
| <width> (optional) gibt die Breite des formatierten Ausdrucks an. Hat das Ergebnis der Formatierung weniger Stellen als <width>, so wird die Zeichenkette mit Leerzeichen aufgefüllt.
|
| "."<prec> (optional) gibt die Anzahl der auszugebenden Stellen für die formatierte Zahl an. Hat die umgewandelte Zahl weniger Stellen als hier angegeben, werden Nullen eingefügt.
|
| type gibt die gewünschte Formatumwandlung an. Gültige Werte sind:
|
| d Dezimal. Der <Wert>-Parameter ist positiv oder negativ ganzzahlig. Ggf. wird das Vorzeichen mit ausgegeben.
|
| u Dezimal ohne Vorzeichen. Ähnlich d, aber es wird kein Vorzeichen ausgegeben.
|
| x Hexadezimal. Der <Wert>-Parameter ist positiv oder negativ ganzzahlig und wird als hexadezimale Zeichenkette ausgegeben.
|
|
| Für die Parameter <index>, <width> und <prec> kann ein Sternchen * eingesetzt werden. Es wird dann der jeweils nächste Wert in der Werteliste für den jeweiligen Parameter eingesetzt.
|
|
Format: | <Format-String> ist eine Zeichenkette, die den obigen Regeln entspricht. Innerhalb der Formatierungsanweisungen wird zwischen Groß- und Kleinschreibung nicht unterschieden.
|
| <Wert1>[,...] ist eine beliebig lange Liste von in Pass 1 auswertbaren mathematischen Ausdrücken.
|
|
Siehe auch: | Die Befehle DEFM, DEFDATETIME
|
| Pseudokommandos
|
|
Beispiel:
|
Beschreibung: | Fügt ein Prüfsummen-Wort (zwei Bytes) in den Binärcode ein. Die berechnete Prüfsumme ist die (nicht vorzeichenbehaftete) Summe der im aktuellen Segment ausgegebenen Bytes seit dem letzten CHKSUMSTART-Befehl (inklusive des dort gegebenen Startwertes), ausgewertet modulo 65536.
|
|
Bemerkung: | Wurde kein CHKSUMSTART-Befehl verwendet, gibt CHKSUM die Summe aller bisher ausgegebenen Bytes aus. Der Standard-Startwert für die Summe ist 0.
|
| Bei Segmenten mit einer Wortbreite von mehr als zwei Bytes werden ggf. zusätzliche Nullbytes eingefügt, bis die durch das CHKSUM-Statement erzeugte Anzahl von Bytes durch die Wortbreite teilbar ist, d.h. "angebrochene" Wörter werden mit Nullbytes gefüllt.
|
|
Siehe auch: | Die Befehle DEFW, CHKSUMSTART
|
| Pseudokommandos
|
|
Beispiel: | CHKSUMSTART 7
|
| DEFB 13,5
|
| CHKSUM ; wirkt hier wie DEFW 7+13+5
|
Wertebereich: | Der Assembler unterstützt Berechnungen in einem Wertebereich von -2^31...+2^31-1 (-2147483648...+2147483647).
|
|
Zahlenformate: | Mathematische Ausdrücke können Zahlenkonstanten im dezimalen (123, 123d, 0d123), hexadezimalen (123h, 0ABFh, #F3, 0xABF), oktalen (567o, 0o567) und binären (10011010b, %10011010, 0b10011010) Format enthalten, weiterhin Zeichenketten ('1', "1", '1234', "XYZ&") mit ein bis vier Zeichen, wobei das letzte Zeichen ins LSB gelangt. Die Verwendung der Symbole # und % für hexadezimale bzw. binäre Angabe wird jedoch aus Gründen der Lesbarkeit nicht empfohlen, da diese Zeichen in einigen Assemblerdialekten Sonderfunktionen haben (z.B. bedeutet bei der 8051-Familie # direkte Daten, um in den Akku 0FFh zu laden, wäre eine Angabe wie MOV A,##FF erforderlich, eine Quelle für Flüchtigkeitsfehler, die durch die Schreibweise MOV A,#0FFh vermieden wird).
|
|
Der PC: | Auf den Programmzähler (PC) kann mit dem Zeichen $ zugegriffen werden. So codiert z.B. JP $ eine Endlosschleife.
|
| Der PC zählt in Einheiten der Wortbreite n des verwendeten Prozessors (beim Z80 z.B. ein Byte, beim Atmel AVR zwei Bytes), d.h. nur alle n ausgegebenen Bytes wird der PC um eins erhöht. Dies ist konsistent z.B. mit den Sprungbefehlen des jeweiligen Assemblerdialekts, jedoch ist evtl. bei Adress- und Pointerberechnungen die Wortgröße n zu berücksichtigen.
|
|
Klammerung: | Ausdrücke können mit ( und ) geklammert werden. Eine Beschränkung der Zahl der Klammerebenen existiert nicht.
|
|
Operatoren: | Die Operatoren haben folgendes Prioritätsschema:
|
|
| höchste | - (Vorzeichen), NOT, HI, LO | ... | * / MOD | ... | + - | ... | OR AND XOR | ... | SHL SHR | niedrigste | < > = <= >= <> |
|
|
Symbole: | Definierte Symbole können jederzeit innerhalb eines Ausdruck anstelle von Zahlenwerten verwendet werden.
|
|
Auswertung: | In Pass 0 auswertbar sind nur Ausdrücke, die weder Symbole noch das $-Zeichen enthalten, also ausschließlich Zahlen verknüpfen.
|
| In Pass 1 auswertbar sind Ausdrücke, die (außer Zahlen und $) nur Symbole enthalten, die vorher im Quellcode definiert wurden.
|
| In Pass 2 auswertbar sind alle Ausdrücke, auch solche, die sich auf später im Quellcode definierte Symbole beziehen.
|
|
Siehe auch: | Pseudokommandos
|
| Mathematische Operatoren |
Feld Prozessorfamilie: | Wählen Sie hier die gewünschte Prozessorfamilie aus.
|
| Die Schaltfläche Optionen bietet weitere prozessorspezifische Einstellungen.
|
|
Feld Labelerkennung: | Wählen Sie hier aus, wie Sprungmarken (Labels) deklariert werden können:
|
| Standard (:)
|
| Ein Label ist das erste Wort in einer Zeile (abgesehen von einer optionalen Zeilennummer), ohne Leerzeichen gefolgt von einem Doppelpunkt (diese Einstellung wird empfohlen).
|
| Erstes Zeichen in Zeile
|
| Jedes Wort, das ohne vorangehende Leerstellen oder Zeilennummer unmittelbar am Zeilenanfang beginnt, ist ein Label. Vor Befehlen muß mindestens ein Leerzeichen stehen. Diese Option existiert nur aus Kompatibilitätsgründen und wird nicht empfohlen.
|
|
Feld Labels/Symbole: | Sonderzeichen zulassen
|
| Wenn ausgewählt, sind in Symbolen/Labels auch die Sonderzeichen ab #128 zulässig, also z.B. Umlaute.
|
|
Feld Optionen: | Listing erzeugen
|
| Wenn ausgewählt, wird eine Listing-Datei erzeugt (.LST). Verlangsamt den Übersetzungsvorgang, daher nur einschalten, wenn das Listing benötigt wird.
|
| Makros in Listing ausgeben
|
| Gibt an, ob bei jedem Makroaufruf der gesamte Makrocode im Listing erscheinen soll oder nicht.
|
| Labeltabelle erzeugen
|
| Wenn ausgewählt, wird eine Symboltabellen-Datei (.TAB) erzeugt. Wird für einige Komfortfunktionen der Entwicklungsumgebung benötigt, daher i.a. einschalten.
|
| Warnungen ausgeben
|
| Schaltet die Optionalen Warnungen des Assemblers ein und aus. Eine Warnung bedeutet nicht zwangsläufig einen Fehler im Quellcode, weist aber auf mögliche Fehlerquellen hin. Empfehlung: einschalten.
|
| Intel®-Hex Datei erzeugen
|
| Wenn ausgewählt, wird zusätzlich zu den (stets erzeugten) Binärdateien der übersetzte Code auch noch im «Intel® Hexadecimal Object File Format» gespeichert (Dateiendung .HEX).
|
|
Siehe auch: | Ausgabedateien
|
| Prozessorspezifische Themen |