ASide im Detail: Der Assembler

Zur Erläuterung der umfangreichen Möglichkeiten des integrierten Assemblers hier einige Auszüge aus der mitgelieferten Syntaxhilfe:

Einführung

Der eingebaute Assembler basiert auf einem modularen Konzept. Das Hauptmodul des Assemblers kümmert sich um alle nicht vom Zielprozessor abhängigen Dinge, wie z.B. Symbolverwaltung, Ausdrucksauswertung etc. Hinzu kommt ein Modul für die prozessorspezifischen Dinge, welches die Übersetzung der eigentlichen Prozessorbefehle übernimmt. Hieraus ergibt sich, daß grundlegende Dinge wie Symboldefinitionen/Labeldefinitionen und Ausdrucksauswertung immer gleich funktionieren, egal welche Prozessorfamilie gewählt ist.

Das Mehrpass-Konzept

Ein Übersetzungslauf setzt sich aus drei Phasen zusammen. In Pass 0 sucht der Parser alle Makrodefinitionen und DEFINE-Statements, in Pass 1 wird die Codegröße bestimmt und die Symbol- und Labeldefinitionen ausgewertet. In Pass 2 werden schließlich die Sprungadressen und mathematische Ausdrücke eingesetzt.

Aufbau einer Assemblerzeile

Eine Zeile Assembler-Quellcode ist wie folgt aufgebaut:

[<Zeilennr.>] [<Labelname>:] [<Befehl>] [<Parameter>[,<Parameter>[,...]]] [;<Kommentar>]

Jedes dieser Elemente ist optional. Beispiel:

100 MyLoop: INC  A      ;sinnlose Zeile mit Nummer
            JR   MyLoop ;Zeile ohne Nummer



Segmente

Der Assembler unterstützt eine beliebige Anzahl von Segmenten. Segmente repräsentieren jeweils eigene Speicherbereiche (z.B. Programmcode-ROM und Daten-RAM) und haben eigene Eigenschaften wie z.B. Programmzähler und Wortbreite.
Jedes Segment hat seine eigene Ausgabedatei, so daß sich Segmente im Prinzip verhalten wie eigenständige Assemblerprojekte, lediglich die definierten Symbole sind über Segmentgrenzen hinweg verfügbar.

Die Verwendung von Segmenten ist optional, wird kein Segment definiert, erzeugt der Assembler automatisch (und für den Anwender transparent) ein Default-Segment. Wenn jedoch Segmente verwendet werden, muß das erste Segment vor dem ersten Codeerzeugenden Befehl definiert werden, da durch die Definition des ersten Segments das Default-Segment überschrieben wird.
Solange durch den Befehl SEGMENT kein anderes Segment gewählt ist, ist automatisch das erste definierte Segment aktiv.

Segmentdefinitionen werden in Pass 1 ausgewertet, so daß sie auch durch IF-Statements eingeschlossen werden dürfen.

Siehe auch: Die Befehle DEFSEGMENT, SEGMENT, ALIGN

Beispiel für die Atmel-AVR-Familie

; Codesegment, Default-Wortbreite
DEFSEGMENT "CSEG",0,FLASHEND
; Datensegment, 1-Byte Wortbreite, keine Datei erzeugen
DEFSEGMENT "DSEG",1,RAMEND,""
; EEPROM-Segment, dto., Datei erzeugen
DEFSEGMENT "EESEG",1,E2END,"TEST.EE"
 
SEGMENT "CSEG"
ORG 00h
LDS R0,DummyVarA
LDS R1,DummyVarB
 
; erstmal die DummyVars im SRAM definieren
SEGMENT "DSEG"
ORG 60h ; Das SRAM fängt an dieser Adresse an
DummyVarA: DEFB 0
DummyVarB: DEFB 0
 
; weiter im Programmcode
SEGMENT "CSEG"
MUL R1,R0
RJMP $ ; nix sinnvolles mehr
 
; ein Bereich mit Daten im Codesegment
; wir wollen nicht, daß Füllbytes erzeugt werden
; denn die Wortbreite ist hier 2 Bytes
ALIGN OFF
Text1: DEFM "012345",0 ; 7 Bytes
Text2: DEFM "67890",0  ; 6 Bytes
ALIGN ON  ; erzeugt ein Füllbyte
 
; Jetzt noch die EEPROM-Daten
; diese werden in Datei ausgegeben
; z.B. zur Initalisierung des EEPROMS
; im Programmiergerät
 
SEGMENT "EESEG"
EEByteVar1: DEFB 123h
EEWordVar1: DEFW 0FFFEh



Die erzeugten Ausgabedateien

Je nach eingestellten Optionen erzeugt der Assembler folgende Ausgabedateien:

Die Binärdatei(en)

Für jedes Segment, bei dem die Ausgabe nicht abgeschaltet ist, erzeugt der Assembler eine Binärdatei mit dem in diesem Segment erzeugten Binärcode. Sofern nicht anders angegeben, endet der Dateiname auf ".BIN".

Die Intel®-HEX Datei(en) (Endung .HEX)

Diese Dateien enthalten den erzeugten Binärcode der einzelnen Segmente im «Intel® Hexadecimal Object File Format». Die Ausgabe erfolgt nur, wenn die entsprechende Option gewählt ist.
Endet der Name der zugehörigen Binärdatei auf .BIN, so wird für die Intel-HEX Datei die Endung durch .HEX ersetzt. Lautet die Erweiterung der Binärdatei anders, wird .HEX angehangen.

Die Symbol- bzw. Labeltabelle (Endung .TAB)

Diese Datei enthält Informationen über die im Quellcode definierten Symbole und Sprungmarken. Sie wird nur erzeugt, wenn die entsprechende Option gewählt ist. Die Entwicklungsumgebung benötigt die enthaltenen Informationen für diverse Komfortfunktionen.
Zum Dateiformat:
Für jedes definierte Symbol enthält die Symboltabelle eine Zeile der Form:
<Symbolname>=<Wert>:<Zeile der Def.>:<Zeile innerhalb eines Makros>:<Quelldateiname>

Die Symboltabelle der exportierten Symbole (Endung .SYM)

Diese Datei einthält alle Label-/Symboldefinitionen der mit dem EXPORT-Statement exportierten Symbole. Die erzeugte Datei kann in einem anderen Assemblerprojekt direkt mittels INCLUDE verwendet werden, um Zugriff auf die exportierten Symbole zu haben.
Für jedes exportierte Symbol wird in die erzeugten Datei eine Zeile der mit dem Format
<Symbolname>: EQU <Wert>
geschrieben. Die Export-Symboltabelle wird nur erzeugt, wenn mindestens ein EXPORT-Statement im Quelltext verwendet wird.

Die Meldungsdatei (Endung .ERR)

Diese Datei wird stets erzeugt und enthält die während der Assemblierung aufgetretenen Fehler und Warnungen (wenn eingeschaltet). Für jede Meldung enthält die Datei eine Zeile mit dem folgenden Format:
<Pass Nr.> <Typ> <Fehlercode> <Zeile> <Zeile innerhalb Makro> <Dateiname>
<Typ> kann sein: E (Fehler), W (Warnung), O (Hinweis), C (ECHO)

Das Listing (Endung .LST)

Diese Datei enthält ein Listing des übersetzten Programmes mit Angaben zu den Adressen und dem erzeugten Code. Die Datei wird nur auf Wunsch erzeugt.


Referenz der Pseudokommandos

Makros:

MACRO (Makro definieren)
ENDMACRO (Makrodefinition abschließen)

Dateioperationen:

INCLUDE (Quelldatei einbeziehen)
INCLUDEBINARY (Binärdatei einbeziehen)
CAT (In anderer Datei fortfahren)
END (Diese Datei beenden)
PARAMETERFILE (Parameterdatei öffnen)

Bedingte Assemblierung:

IF (nur wenn Bedingung erfüllt)
IFDEF (nur wenn Symbol definiert)
IFSTREQ (nur wenn Zeichenketten gleich)
ELSE
ENDIF

Adressierung:

ORG (Zieladresse festlegen)
SETBASE (Zieladresse festlegen)
DEFSEGMENT (Segment definieren)
SEGMENT (Segment aufrufen)
ALIGN (Ausrichtung an Wortgrenzen)

Symboldefinition:

Spungmarken/Labels
DEFL (weiche Symboldefinition)
EQU (harte Symboldefinition)
EXPORT (Symbol exportieren)

Datendefinition:

DEFB (Byte-Daten definieren)
DEFW (Word-Daten definieren)
DEFINT (LongInt-Daten definieren)
DEFS (Leerraum definieren)
DEFM (Text-Daten definieren)
DEFFMTSTR (Text mit formatierten Zahlen definieren)
DEFDATETIME (Datum+Uhrzeit als Text definieren)

Sonstige:

CHKSUM (Prüfsumme definieren)
CHKSUMSTART (Prüfsummen-Startwert setzen)
ECHO (Meldung ausgeben)
ERROR (Fehler auslösen)
OUTPUT (Binärcodeerzeugung ein/aus)
LIST (Listing-Ausgabe ein/aus)
STOREDATA (Datenwert zwischenspeichern)
RECALLDATA (Datenwert wieder lesen)

Vordefinierte Symbole:

_RECALLEDDATA (mit RECALLDATA gelesener Wert)
_BUILD (Build-Nr. des Projekts)
_VERSION (Versions-Nr. des Projekts)
_DATEDAY (Datum beim Assemblieren)
_DATEMONTH (Datum beim Assemblieren)
_DATEYEAR (Datum beim Assemblieren)
_TIMEHOUR (Uhrzeit beim Assemblieren)
_TIMEMIN (Uhrzeit beim Assemblieren)
_TIMESEC (Uhrzeit beim Assemblieren)
_READPAR (nächster Wert aus Parameterdatei)

Mathematische Operatoren



MACRO <Name>,<Parameterzahl>[,OVERRIDE]

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:
; Simulation eines allgemeinen Sprungbefehls
; auf dem 8051-Prozessor
MACRO JMP,1,OVERRIDE
  IFSTREQ @1,"@A+DPTR"
    DEFB 073h ; = JMP @A+DPTR
  ELSE
    IFDEF @1
      ; Label definiert => SJMP, AJMP oder LJMP
      IF ((@1-($+2))<=127) AND ((@1-($+2))>=-128)
        SJMP @1
      ELSE
        IF (($+2)/2048)=(@1/2048)
          ; im gleichen 2k-Block
          AJMP @1
        ELSE
          LJMP @1
        ENDIF
      ENDIF
    ELSE
      ; Label unbekannt => LJMP
      LJMP @1
    ENDIF
  ENDIF
ENDMACRO


Beispiel 4:
; Makroparameter als Befehl
MACRO prepareandrun,3
  LD A,@2 ; lädt Parameter 2 in den Akku
  @1 @3   ; verwendet Parameter 1 als Befehl
ENDMACRO
 
prepareandrun CALL,"X",Writechar
; ergibt
; LD A,"X"
; CALL Writechar



ENDMACRO

Beschreibung: Die aktuelle Makrodefinition wird abgeschlossen.

Siehe auch:Der Befehl MACRO
Pseudokommandos



DEFINE <Zeichenkette1>=<Zeichenkette2>[,...]

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



INCLUDE "<Dateiname>"[,"<Dateiname>"[,...]]

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:

include "c:\asm\test.asm"
include "const.asm"




INCLUDEBINARY "<Dateiname>"

Beschreibung: Fügt die angegebene Binärdatei in die assemblierten Daten ein, ähnlich wie der Befehl DEFB dies mit einzelnen Bytes tut. Der Programmzähler wird entsprechend angepaßt und die Assemblierung in der dem Befehl folgenden Zeile fortgesetzt. Enthält <Dateiname> keine voll qualifizierte Pfadangabe, so wird die Datei im Verzeichnis der Assemblerdatei, die den INCLUDEBINARY-Befehl enthält, gesucht. Ist diese Suche erfolglos, so wird in den im Suchpfad angegebenen Verzeichnissen gesucht (Menü Projekt-Dateiverwaltung). Wird die aktuelle Assemblerdatei aufgrund eines INCLUDE-Befehles übersetzt, so wird noch in den Verzeichnissen der übergeordneten Assemblerdateien gesucht.

Siehe auch:Die Befehle INCLUDE, CAT, END
Pseudokommandos

Beispiel:

includebinary "nettesbild.bmp"



CAT "<Dateiname>"

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:
cat  "neuedatei.asm"
call test ; Dieser Befehl wird nie übersetzt 



PARAMETERFILE "<Dateiname>"

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



END

Beschreibung: Die Assemblierung der aktuellen Datei wird beendet, so als ob das Dateieinde erreicht wurde.

Siehe auch:Die Befehle INCLUDE, INCLUDEBINARY, CAT
Pseudokommandos



IF <Bedingung>

Beschreibung: Die dem IF-Befehl folgenden Zeilen werden nur ausgewertet, wenn die Bedingung wahr, d.h. ungleich 0 ist. Die bedingte Übersetzung wird beendet mit dem ENDIF-Befehl, der zwingend zu jedem IF-Befehl gehört. IF, IFDEF und IFSTREQ Blöcke können auch geschachtelt werden.

Format:<Bedingung> muß ein in Pass 1 auswertbarer mathematischer Ausdruck sein.

Siehe auch:Die Befehle IFDEF, IFSTREQ, ELSE, ENDIF
Pseudokommandos

Beispiel:

version:  EQU  1
          IF   version=1
            ECHO "Erste Version"
          ELSE
            ECHO "Andere Version"
          ENDIF




IFDEF <Symbol>
IFDEF <Ausdruck>


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:

version:  EQU   1
          IFDEF version
            ECHO "Version definiert"
          ELSE
            ECHO "Version nicht definiert"
          ENDIF




IFSTREQ <Zeichenkette1>,<Zeichenkette2>

Beschreibung: Die dem IFSTREQ-Befehl folgenden Zeilen werden nur ausgewertet, wenn die beiden übergebenen Zeichenketten gleich sind. Hierbei werden führende und abschließende Leerzeichen sowie Groß- und Kleinschreibung vernachlässigt.
Die bedingte Übersetzung wird beendet mit dem ENDIF-Befehl, der zwingend zu jedem IFSTREQ-Befehl gehört. IFSTREQ, IF und IFDEF Blöcke können auch geschachtelt werden.

Format:Die Zeichenketten können, müssen aber nicht, in Anführungszeichen " bzw ' eingeschlossen werden.

Siehe auch:Die Befehle IF, IFDEF, ELSE, ENDIF
Pseudobefehle

Beispiel:

MACRO JMP,1,OVERRIDE
  IFSTREQ @1,"@A+DPTR"
    DEFB 073h ; Code für JMP @A+...
  ELSE
    LJMP @1
  ENDIF
ENDMACRO



ELSE

Beschreibung: Die dem ELSE-Befehl folgenden Zeilen werden nur ausgewertet, wenn die Bedingung des vorangegangenen IF, IFDEF oder IFSTREQ-Befehls falsch, d.h. gleich 0 war. Die bedingte Übersetzung wird beendet mit dem ENDIF-Befehl.

Siehe auch:Die Befehle IF, IFDEF, IFSTREQ, ENDIF
Pseudokommandos

Beispiel:

version:  EQU  1
          IF   version=1
            ECHO "Erste Version"
          ELSE
            ECHO "Andere Version"
          ENDIF




ENDIF

Beschreibung: Die bedingte Assemblierung wird beendet, d.h. der aktuelle IF, IFDEF bzw. IFSTREQ Block abgeschlossen. Die dem Befehl folgenden Programmzeilen werden wieder bedingungslos assembliert, es sei denn, es gibt noch einen umschließenden IF-ENDIF Block.

Siehe auch:Die Befehle IF, IFDEF, IFSTREQ, ELSE
Pseudokommandos

Beispiel:

version:  EQU  1
          IF   version=1
            ECHO "Erste Version"
          ELSE
            ECHO "Andere Version"
          ENDIF
          ECHO "Immer übersetzt"




ORG <Ausdruck>

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



SETBASE <Ausdruck>

Beschreibung: Der Befehl SETBASE legt die Startadresse des erzeugten Codes fest, indem der Programmzähler auf den durch den <Ausdruck> gegebenen Wert gesetzt wird. Es werden keine Füllbytes erzeugt, der Programmzähler kann auch rückwärts verstellt werden.

Format:<Ausdruck> muß ein in Pass 1 auswertbarer mathematischer Ausdruck sein.

Bemerkung:Der Programmzähler zählt in Einheiten der Wortgröße des aktuellen Segments, z.B. ist die Codesegment-Wortgröße 1 Byte bei Z80 und 8051, 2 Bytes beim Atmel AVR.

Siehe auch:Der Befehl ORG
Segmente, Pseudokommandos



DEFSEGMENT "<Name>",<Wortbreite>,<Endadresse>[,"<Dateiname>"]

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



SEGMENT "<Name>"

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



ALIGN ON|OFF

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



Sprungmarken (Labels)

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



DEFL <Ausdruck>

Beschreibung: Definiert ein Symbol (Label) mit dem durch den <Ausdruck> gegebenen Wert. Im Gegensatz zum Befehl EQU ist die Definition weich, d.h. das definierte Symbol kann im weiteren Quelltext auch umdefiniert werden.

Format:Labelname: DEFL <Ausdruck>
Für den Symbolnamen (hier: "Labelname") gilt das im Kapitel Sprungmarken/Labels Gesagte. <Ausdruck> ist ein in Pass 2 auswertbarer mathematischer Ausdruck.

Bemerkung:Alternativ kann der Befehl DEFL auch als = geschrieben werden.

Siehe auch:Der Befehl EQU
Sprungmarken/Labels
Pseudokommandos



EQU <Ausdruck>[,EXPORT]

Beschreibung: Definiert ein Symbol (Label) mit dem durch den <Ausdruck> gegebenen Wert. Im Gegensatz zum Befehl DEFL ist die Definition hart, d.h. das definierte Symbol kann im weiteren Quelltext nicht umdefiniert werden.
Wird das EXPORT-Statement angegeben, so wird das definierte Symbol in die Export-Symboltabelle geschrieben.

Format:Labelname: EQU <Ausdruck>[,EXPORT]
Für den Symbolnamen (hier: "Labelname") gilt das im Kapitel Sprungmarken/Labels Gesagte. <Ausdruck> ist ein in Pass 2 auswertbarer mathematischer Ausdruck.

Siehe auch:Der Befehl DEFL
Sprungmarken/Labels
Pseudokommandos



DEFB <Ausdruck>[,<Ausdruck>,...]

Beschreibung: Fügt das/die durch den <Ausdruck> beschriebenen Datenbytes in den Binärcode ein.

Format:<Ausdruck> ist ein in Pass 2 auswertbarer mathematischer Ausdruck im Bereich von -128...+255.

Bemerkung:BeiSegmenten 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 DEFB-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, DEFINT, DEFS, DEFM
Pseudokommandos



EXPORT

Beschreibung: Exportiert ein Symbol (Label) in die Export-Symboltabelle. Das EXPORT-Statement kann entweder (bei der Definition einer Sprungmarke) als eigenständiger Befehl verwendet werden oder als Parameter im EQU-Statement.

Beispiel:Labelname: EXPORT
Labelname: EQU 123,EXPORT

Siehe auch:Der Befehl EQU
Sprungmarken/Labels
Pseudokommandos
Ausgabedateien



DEFW <Ausdruck>[,<Ausdruck>,...]

Beschreibung: Fügt das/die durch den <Ausdruck> beschriebenen Datenwörter (je zwei Bytes) in den Binärcode ein.

Format:<Ausdruck> ist ein in Pass 2 auswertbarer mathematischer Ausdruck im Bereich von -32768...+65535.

Bemerkung:Bei Segmenten mit einer Wortbreite von mehr als zwei Bytes werden ggf. bei eingeschaltetem Alignment zusätzliche Nullbytes eingefügt, bis die durch das DEFW-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, DEFINT, DEFS, DEFM
Pseudokommandos



DEFINT <Ausdruck>[,<Ausdruck>,...]

Beschreibung: Fügt den/die durch den <Ausdruck> beschriebenen Long Integer-Werte (je vier Bytes) in den Binärcode ein.

Format:<Ausdruck> ist ein in Pass 2 auswertbarer mathematischer Ausdruck im Bereich von -2147483648...+2147483647.

Bemerkung:Bei Segmenten mit einer Wortbreite von mehr als vier Bytes werden ggf. bei eingeschaltetem Alignment zusätzliche Nullbytes eingefügt, bis die durch das DEFINT-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, DEFS, DEFM
Pseudokommandos



DEFS <Ausdruck1>[,<Ausdruck2>]

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



DEFM "<Text>"/Ausdruck[,"<Text>/Ausdruck"...]

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"""



DEFFMTSTR "<Format-String>",<Wert1>[,Wert2[,...]]

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:
; Datum ausgeben, Format xx.xx.xxxx
DEFFMTSTR "Es ist der %2.2u.%2.2u.%4.4u^M^J",_DATEDAY,_DATEMONTH,_DATEYEAR
; Version x.xx, Build 5 Zeichen breit, 4 Dezimalstellen
DEFFMTSTR "Version %3:u.%4:2.2u Build%0:*.*u^M^J",5,4,_BUILD,_VERSION/256,_VERSION MOD 256



DEFDATETIME

Beschreibung: Fügt die aktuelle Systemzeit und das Systemdatum als Text in den Binärcode ein (ähnlich wie der Befehl DEFM). Das verwendete Format ist gegeben durch "yyyy-mm-dd hh:mm".

Siehe auch:Der Befehl DEFM
_DATExxx, _TIMExxx
Pseudokommandos



CHKSUM

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



CHKSUMSTART <Ausdruck>

Beschreibung: Setzt den Startwert für die Prüfsummen-Berechnung im aktuellen Segment. Die aktuell aufsummierte Prüfsumme wird verworfen und auf den neuen Startwert <Ausdruck> gesetzt.

Format:<Ausdruck> ist ein in Pass 2 auswertbarer mathematischer Ausdruck im Bereich von 0...65535.

Bemerkung:Wird kein CHKSUMSTART-Befehl verwendet, ist der Standard-Startwert für die Summe 0.

Siehe auch:Der Befehl CHKSUM
Pseudokommandos

Beispiel:CHKSUMSTART 7
DEFB 13,5
CHKSUM ; wirkt hier wie DEFW 7+13+5



ECHO [<Ausdruck>/"<Zeichenkette>"][,...]

Beschreibung: Gibt in Pass 2 Text oder Zahlenwerte in die Meldungsdatei aus.

Format:<Ausdruck> ist ein in Pass 2 auswertbarer mathematischer Ausdruck.
<Zeichenkette> ist eine beliebige Zeichenkette, die in die Meldungsdatei übernommen wird.

Bemerkung:Statt " kann auch ' als Zeichenketten-Kennzeichen verwendet werden.

Siehe auch:Der Befehl ERROR
Pseudokommandos

Beispiel:ECHO "2 mal 17 ist ",2*17



ERROR [<Ausdruck>/"<Zeichenkette>"][,...]

Beschreibung: Löst in Pass 2 einen Fehler aus und gibt Text oder Zahlenwerte in die Meldungsdatei aus.

Format:<Ausdruck> ist ein in Pass 2 auswertbarer mathematischer Ausdruck.
<Zeichenkette> ist eine beliebige Zeichenkette, die in die Meldungsdatei übernommen wird.

Bemerkung:Statt " kann auch ' als Zeichenketten-Kennzeichen verwendet werden.
Werden Parameter angegeben, entspricht dies einem ERROR-Befehl ohne Parameter mit nachfolgendem ECHO-Statement.

Siehe auch:Der Befehl ECHO
Pseudokommandos

Beispiel:ERROR "Das ist falsch!"



LIST ON|OFF

Beschreibung: Schaltet die Ausgabe in das eventuell erzeugte Programmlisting (siehe Optionen) ein (LIST ON) oder aus (LIST OFF).
Mit diesem Befehl kann verhindert werden, daß der nachfolgende Code im Listing erscheint, z.B. um die immer wiederkehrende Ausgabe häufig verwendeter Bibliotheken zu unterdrücken.

Siehe auch:Pseudokommandos



OUTPUT ON|OFF

Beschreibung: OUTPUT OFF schaltet in Pass 2 die Binärcodeerzeugung aus, d.h. die Adressen (Programmzähler) werden fortgeschrieben, der Quellcode wird tatsächlich assembliert, nur werden die Binärdaten nicht ausgegeben.
OUTPUT ON schaltet in Pass 2 die Binärcodeerzeugung wieder ein.

Siehe auch:Pseudokommandos



STOREDATA <index>,<wert>

Beschreibung: Speichert den angegebenen <wert> unter dem Zugriffsindex <index> zur späteren Verwendung mittels RECALLDATA. Dies kann z.B. Anwendung finden beim Aufbau einer automatischen Speicherverwaltung durch Makros etc. Es kann mehrfach unter demselben <index> gespeichert werden, der ältere Wert wird dabei jeweils überschrieben.

Format:<index> ist ein in Pass 1 auswertbarer mathematischer Ausdruck.
<wert> ist ein in Pass 1 auswertbarer mathematischer Ausdruck.

Siehe auch:Der Befehl RECALLDATA
Das vordefinierte Symbol _RECALLEDDATA
Pseudokommandos

Beispiel:
Label1: CALL something
Label2: RET
        STOREDATA Label1,4711
        STOREDATA Label2,1234
        RECALLDATA Label1
        ECHO _RECALLEDDATA ; gibt 4711 aus



RECALLDATA <index>

Beschreibung: Greift auf den unter dem Zugriffsindex <index> mittels STOREDATA gespeicherten Wert zu. Anschließend hat das vordefinierte Symbol _RECALLEDDATA den gelesenen Wert. Wurde unter dem angegebenen <index> nocht nichts gespeichert, wird ein Fehler ausgelöst.

Format:<index> ist ein in Pass 1 auswertbarer mathematischer Ausdruck.

Siehe auch:Der Befehl STOREDATA
Das vordefinierte Symbol _RECALLEDDATA
Pseudokommandos

Beispiel:
Label1: CALL something
Label2: RET
        STOREDATA Label1,4711
        STOREDATA Label2,1234
        RECALLDATA Label1
        ECHO _RECALLEDDATA ; gibt 4711 aus



_RECALLEDDATA

Beschreibung: Dieses Symbol wird vom Befehl RECALLDATA definiert. Es hat jeweils den zuletzt mittels RECALLDATA geladenen Wert.

Siehe auch:Die Befehle STOREDATA, RECALLDATA
Pseudokommandos



_BUILD

Beschreibung: Dieses Symbol ist innerhalb des Quellcodes von Assemblerprojekten (siehe hierzu die Hilfe zur Entwicklungsumgebung) vordefiniert. Es kann Werte zwischen 0 und 2^31-1 annehmen. Der Wert entspricht i.a. der laufenden Nummer des aktuellen Übersetzungs-/Assembliervorgangs.

Siehe auch:Das Symbol _VERSION
Pseudokommandos

Beispiel:ECHO "Version: ",_VERSION/256,".",_VERSION MOD 256," Build: ",_BUILD



_VERSION

Beschreibung: Dieses Symbol ist innerhalb des Quellcodes von Assemblerprojekten (siehe hierzu die Hilfe zur Entwicklungsumgebung) vordefiniert. Es kann Werte zwischen 0 und 65535 annehmen. Der Wert des High-Bytes entspricht der Hauptversionsnummer des Projekts, der Wert des Low-Bytes der Unterversionsnummer.

Siehe auch:Das Symbol _BUILD
Pseudokommandos

Beispiel:ECHO "Version: ",_VERSION/256,".",_VERSION MOD 256," Build: ",_BUILD



_DATEDAY
_DATEMONTH
_DATEYEAR


Beschreibung: Diese Symbole sind mit dem aktuellen Datum vordefiniert. _DATEDAY kann Werte zwischen 1 und 31 annehmen und entspricht dem aktuellen Tagesdatum, _DATEMONTH liegt zwischen 1 und 12 und gibt den Monat an, _ DATEYEAR gibt das aktuelle Jahr an.

Siehe auch:Die Symbole _TIMEHOUR, _TIMEMIN, _TIMESEC
DEFFMTSTR, DEFDATETIME
Pseudokommandos



_TIMEHOUR
_TIMEMIN
_TIMESEC


Beschreibung: Diese Symbole sind mit der aktuellen Uhrzeit vordefiniert. _TIMEHOUR kann Werte zwischen 0 und 23 annehmen und entspricht der aktuellen Stunde. _TIMEMIN liegt zwischen 0 und 59 und gibt die Minute an, _TIMESEC gibt dementsprechend die Sekunde an.

Siehe auch:Die Symbole _DATEYEAR, _DATEMONTH, _DATEDAY
DEFFMTSTR, DEFDATETIME
Pseudokommandos



_READPAR

Beschreibung: Dieses Symbol ermöglicht den Zugriff auf die geöffnete Parameterdatei. Jede Verwendung von _READPAR list eine Textzeile aus der Datei ein und wertet sie als mathematischen Ausdruck aus. _READPAR kann wie jedes andere Symbol auch verwendet werden. Wird es innerhalb eines Ausdrucks mehrfach verwendet, so werden mehrere Zeilen der Datei eingelesen.

Siehe auch:Der Befehl PARAMETERFILE
Pseudokommandos



Mathematische Ausdrücke

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



Mathematische Operatoren

- <Ausdruck>
Kehrt das Vorzeichen des <Ausdrucks> um.

NOT <Ausdruck>
Bildet das Einerkomplement von <Ausdruck>, d.h. jedes Bit in der Binärdarstellung wird invertiert. So ist z.B. NOT 0 gleich -1.

HI <Ausdruck>
Verschiebt den <Ausdruck> um 8 Bits nach rechts. War <Ausdruck> ein WORD, so bleibt das High-Byte übrig. Das High-Byte eines DWORDs liefert HI HI HI <dword> zurück.

LO <Ausdruck>
Liefert die unteren 8 Bits (das Low-Byte) eines Ausdrucks zurück, entspricht also <Audruck> AND 0FFh.

<Faktor1> * <Faktor2>
Bildet das Produkt von <Faktor1> und <Faktor2>.

<Dividend> / <Divisor>
Bildet den Quotienten (ganzzahlig, d.h. mit Rest) von <Dividend> und <Divisor>, d.h.
<Dividend>
<Divisor>

<Dividend> MOD <Divisor>
Bildet den Rest aus der Division von <Dividend> und <Divisor>.

<Summand> + <Summand>
Bildet die Summe aus den beiden <Summanden>.

<Minuend> - <Subtrahend>
Bildet die Differenz von <Minuend> und <Subtrahend>.

<Wert> OR <Wert>
Bitweise ODER-Verknüpfung der beiden <Werte>.

<Wert> AND <Wert>
Bitweise UND-Verknüpfung der beiden <Werte>.

<Wert> XOR <Wert>
Bitweise Exklusiv-ODER-Verknüpfung der beiden <Werte>.

<Wert> SHL <Stellen>
<Wert> wird um <Stellen> Bitpositionen nach links verschoben (jede Verschiebung entspricht einer Multiplikation mit 2).

<Wert> SHR <Stellen>
<Wert> wird um <Stellen> Bitpositionen nach rechts verschoben (jede Verschiebung entspricht einer Division durch 2).

<Wert1> < <Wert2>
Ist <Wert1> kleiner als <Wert2>, so ist das Ergebnis -1, sonst 0.

<Wert1> > <Wert2>
Ist <Wert1> größer als <Wert2>, so ist das Ergebnis -1, sonst 0.

<Wert1> = <Wert2>
Ist <Wert1> gleich <Wert2>, so ist das Ergebnis -1, sonst 0.

<Wert1> <= <Wert2>
Ist <Wert1> kleiner oder gleich <Wert2>, so ist das Ergebnis -1, sonst 0.

<Wert1> >= <Wert2>
Ist <Wert1> größer oder gleich <Wert2>, so ist das Ergebnis -1, sonst 0.

<Wert1> <> <Wert2>
Ist <Wert1> ungleich <Wert2>, so ist das Ergebnis -1, sonst 0.

Siehe auch: Pseudokommandos
Mathematische Ausdrücke



Allgemeine Optionen

Folgende Optionen stehen im Dialogfenster Konfiguration (erreichbar über "Projekt"-"Assembler-Optionen..." oder "Optionen"-"Assembler-Defaultoptionen...") zur Verfügung:

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



Fehlermeldungen

Im folgenden sind die prozessorunabhängigen Fehlermeldungen aufgelistet. Die prozessorspezifischen Fehlermeldungen (solche mit einer Fehlernummer ab 10000) finden Sie hier.

E1 Zu viele Parameter
Einem Pseudobefehl wurden mehr Parameter als erwartet übergeben.

E2 Parameter erwartet
Der verwendete Befehl erwartet mindestens einen Parameter.

E3 Ausdruck muß in Pass 1 auswertbar sein
Der Befehl erfordert einen in Pass 1 auswertbaren mathematischen Ausdruck.

E4 ELSE ohne vorangehendes IF
Vor einem ELSE-Befehl muß immer ein IF oder IFDEF stehen.

E5 Kein Parameter erwartet
Der verwendete Befehl erwartet keine Parameter.

E6 ELSE doppelt
Hinter einem IF oder IFDEF wurde zweimal ELSE verwendet.

E7 ENDIF ohne vorangehendes IF/IFDEF
Vor einem ENDIF-Befehl muß immer ein IF oder IFDEF stehen.

E8 Macrodeklaration innerhalb IF/IFDEF-Block nicht zulässig
Innerhalb eines IF oder IFDEF-Blockes darf kein Makro definiert werden.

E9 Macro-Parameteranzahl muß in Pass 0 auswertbar sein
Die Parameterzahl-Angabe einer Makrodefinition muß ein in Pass 0 auswertbarer mathematischer Ausdruck sein.

E10 INCLUDE innerhalb IF/IFDEF-Block nicht zulässig
Innerhalb eines IF oder IFDEF-Blockes darf INCLUDE nicht verwendet werden.

E11 CAT innerhalb IF/IFDEF-Block nicht zulässig
Innerhalb eines IF oder IFDEF-Blockes darf CAT nicht verwendet werden.

E12 END innerhalb IF/IFDEF-Block nicht zulässig
Innerhalb eines IF oder IFDEF-Blockes darf END nicht verwendet werden.

E13 Zieladresse muß größer als aktuelle Adresse sein
Die Zeiladresse des ORG-Befehls ist kleiner als der aktuelle Stand des Programmzählers. Möglicherweise erfüllt der Befehl SETBASE die gewünschte Funktion.

E14 Ausdruck außerhalb des zulässigen Wertebereichs
Das Ergebnis des verwendeten mathematischen Ausdrucks liegt außerhalb des für den Befehl zulässigen Wertebereichs.

E15 Verschachtelte Macrodefinition
Eine Makrodefinition innerhalb einer anderen Makrodefinition ist nicht zulässig.

E16 Zu viele verschachtelte Makro-Aufrufe oder endlos rekursiver Makro-Aufruf
Innerhalb einer Makrodefinition dürfen zwar weitere Makros aufgerufen werden, jedoch darf die Verschachtelungstiefe dabei 250 nicht überschreiten.

E17 ENDMACRO außerhalb einer Macrodeklaration
Der Befehl ENDMACRO ist nur am Ende einer Makrodefinition erlaubt.

E18 Interner Parser-Fehler
Dieser Fehler sollte nie auftreten. Bitte informieren Sie uns, möglichst mit einen Quellcodeausschnitt, der den Fehler auslöst.

E19 Syntaxfehler
Es wurde ein Syntaxfehler gefunden. Vermutlich haben Sie einen Befehl falsch geschrieben.

E20 Abbruch durch Benutzer
Sie haben den Abbrechen-Knopf im Assembler-Fortschritt-Fenster betätigt.

E21 Zu viele Fehler
Es sind zu viele Fehler aufgetreten, daher wurde der Übersetzungsvorgang abgebrochen. Beseitigen Sie die anderen gemeldeten Fehler und assemblieren Sie erneut.

E22 DEFINE innerhalb IF/IFDEF-Block nicht zulässig
Innerhalb eines IF-Blockes ist DEFINE nicht zulässig, da die DEFINE-Statements in Pass 0 abgearbeitet werden, d.h. bevor die IF-Bedingungen ausgewertet werden können.

E23 Unerwartetes Zeichen in definiertem/redefiniertem Bezeichner
In einem DEFINE-Statement sind nur bestimmte Zeichen erlaubt ('A'...'Z', 'a'...'z', '_', '.').

E24 DEFINE-Ziel bereits definiert (DEFINE doppelt)
Jeder DEFINE-Zielzeichenkette kann nur einmal eine andere Zeichenkette zum Ersetzen zugewiesen werden.

E25 DEFINE-Ziel bereits als DEFINE-Ersetzungszeichenkette verwendet
Wurde eine Zeichenkette bereits einmal als Quelle in einem DEFINE-Statement verwendet, d.h. wurde sie bereits als Ersetzung zugewiesen, kann sie nicht selber umdefiniert werden.

E26 Dieser reservierte Bezeichner kann nicht reDEFINiErt werden
Die Befehle MACRO, ENDMACRO und DEFINE können nicht Quelle oder Ziel einer Ersetzung mittels DEFINE sein.

E27 DEFINE innerhalb Makrodeklaration nicht zulässig
Innerhalb einer MACRO-Deklaration ist DEFINE nicht zulässig.

E28 Erstes Segment kann nicht definiert werden, nachdem bereits Code erzeugt wurde
Das erste DEFSEGMENT-Statement muß vor dem ersten Codeerzeugenden Befehl stehen. Der Assembler hat bereits ein Default-Segment erzeugt, dessen Eigenschaften nun durch den DEFSEGMENT-Befehl nicht mehr angepaßt werden können, da bereits Code erzeugt wurde.

E29 Ausgabedateiname wird bereits für anderes Segment verwendet
Der angegebene Ausgabedateiname im DEFSEGMENT-Statement wurde bereits für ein anderes Segment verwendet. Wählen Sie einen anderen Namen oder lassen Sie den Assembler einen Dateinamen wählen, indem Sie den entsprechenden Parameter weglassen.

E30 Segmentname wurde bereits verwendet
Der angegebene Segmentname wurde bereits in einem anderen DEFSEGMENT-Statement verwendet. Wählen Sie einen anderen Namen. Achtung: Groß- und Kleinschreibung werden nicht unterschieden.

E31 Unbekannter Segmentname
Der angegebene Segmentname wurde vorher nicht definiert, evtl. haben Sie das DEFSEGMENT-Statement vergessen.

E32 Codeadresse muß an Wortgrenzen ausgerichtet sein
Assemblerbefehle sowie bestimmte Pseudobefehle und Labeldefinitionen sind nur an glatten, durch die Wortbreite des Segments teilbaren Byteadressen (d.h. PC ganzzahlig) zulässig. Schalten Sie das Alignment ein.

E33 Fehler oder falsch platziertes Zeichen in Format-String
Im Format-String des DEFFMTSTR-Befehls wurde ein Fehler oder ein falsch platziertes Zeichen gefunden. Prüfen Sie auch die Anzahl der übergebenen Zahlenparamter udn evtl. angegebene Indexwerte.

E34 Zweiter Parameter darf nur EXPORT-Direktive sein
Der zweite Parameter des EQU-Befehls darf (sofern er angegeben wird) nur das EXPORT-Statement sein.

E35 Nichts zum Exportieren gefunden, keine Labeldeklaration in Zeile
Das Pseudokommando EXPORT darf nur innerhalb einer Labeldefinition verwendet werden. Der Befehl wurde jedoch in einer Quellcodezeile ohne Label gefunden.

E36 Benutzerdefinierter Fehler (Befehl ERROR) aufgetreten
Das Pseudokommando ERROR hat einen Fehler ausgelöst.

E37 Keine Parameterdatei geöffnet oder angegeben
Das vordefinierte Symbol _READPAR wurde verwendet, ohne vorher eine Parameterdatei mittels PARAMETERFILE zu öffnen.

E38 Unter dem angegebenen Index wurden keine Daten gespeichert
Der Pseudobefehl RECALLDATA ist fehlgeschlagen, da unter dem angegebenen Index keine Daten mittels STOREDATA gespeichert wurden.

E51 Label schon deklariert
Sie haben versucht, ein bereits deklariertes Symbol/Label erneut zu definieren. Dies ist jedoch nur unter Verwendung des Befehls DEFL zulässig.

E52 Label nicht definiert
Innerhalb eines mathematischen Ausdrucks wurde auf ein nicht definiertes Symbol zugegriffen. Möglicherweise haben Sie sich beim Symbolnamen vertippt oder einen Operator falsch geschrieben. Sofern Sie das vordefinierte Symbol _RECALLEDDATA verwendet haben, stellen Sie sicher, daß auch ein Aufruf von RECALLDATA vorangeht.

E53 Reserviertes Wort kann nicht als Label verwendet werden
Reservierte Wörter, d.h. Pseudobefehle, Prozessorbefehle, Register etc. können nicht als Symbol/Label verwendet werden.

E54 Macrobezeichner kann nicht als Label verwendet werden
Der Name eines Makros kann nicht auch als Symbol- oder Labelname verwendet werden.

E55 Reserviertes Wort kann nicht als Macrobezeichner verwendet werden
Reservierte Wörter, d.h. Pseudobefehle, Prozessorbefehle, Register etc. können nicht als Name für ein Makro verwendet werden.

E56 Macro schon deklariert
Ein Makro mit diesem Namen wurde bereits definiert.

E57 Unerwarteter MACRO-Bezeichner
Der Name eines definierten Makros wurde in einem mathematischen Ausdruck wie ein Symbol/Label verwendet.

E71 Unerwarteter :
Ein Doppelpunkt schließt innerhalb einer Symbol-/Labeldefinition den Symbolnamen ab. An anderer Position ist ein Doppelpunkt nicht zulässig.

E72 Zeichenkette nicht abgeschlossen
Eine Zeichenkette wurde nicht richtig beendet. Zeichenketten, die mit " eingeleitet werden, müssen auch mit " beendet werden. Umgekehrt sind mit ' eingeleitete Zeichenketten auch mit ' zu beenden.

E73 Zeichen nicht erlaubt in Labelbezeichnern
Für Label-/Symbolnamen sind als Anfangszeichen nur 'A'..'Z', 'a'..'z', '_' und (für Makro-lokale Labels) '~' erlaubt, als folgende Zeichen nur 'A'..'Z', 'a'..'z', '0'..'9' und '_'.

E81 Datei nicht gefunden
Die in einem INCLUDE oder CAT angegebene Datei wurde nicht gefunden. Prüfen sie den Dateinamen und evtl. die Pfadeinstellungen.

E82 Kreisverkettung von Dateien per INCLUDE/CAT
Per INCLUDE oder CAT darf keine zyklische Dateiverkettung aufgebaut werden. Wird z.B. die Datei A assembliert, die einen INCLUDE-Befehl für Datei B enthält, und enthält Datei B einen INCLUDE-Befehl für Datei A, so tritt dieser Fehler auf.

E91 Makro-lokale Labels (~) sind nur gültig innerhalb des Makrocodes
Das Zeichen '~' kennzeichnet ein Makro-lokales Label. Diese Labels können nur innerhalb eines Makros definiert und aufgerufen werden.

E101 Überlauf - Zeichenkettenausdruck zu lang
Dieser Fehler tritt auf, wenn versucht wird, innerhalb eines mathematischen Ausdrucks eine Zeichenketten-Konstante mit mehr als vier Zeichen zu verwenden (eine so lange Zeichenkette kann nicht als Zahl ausgewertet werden).

E102 Überlauf - Konstante zu groß
Innerhalb eines eines mathematischen Ausdrucks wurde eine zu große Zahl verwendet.

E103 Falsch platziertes/unerwartetes Zeichen
Innerhalb eines eines mathematischen Ausdrucks trat ein nicht erlaubtes Zeichen auf (z.B.  DEFB 12} ).

E104 Falsch platzierter/unerwarteter Operator
Innerhalb eines eines mathematischen Ausdrucks wurde ein Operator fehlerhaft verwendet (z.B. DEFB 3 AN+ ).

E105 Interner Fehler
Dieser Fehler sollte nie auftreten. Bitte informieren Sie uns, möglichst mit einen Quellcodeausschnitt, der den Fehler auslöst.

E106 Schließende Klammer ")" fehlt
Innerhalb eines mathematischen Ausdrucks wurden mehr öffnende als schließende Klammern verwendet (z.B. DEFB 3*(7 ).

E107 Unerwartetes Ende des Ausdrucks
Ein mathematischer Ausdruck endete unerwartet (vermutlich fehlt zu einem Operator der zweite Operand, z.B. DEFB 3+ ). Evtl. wurde auch das vordefinierte Symbol _READPAR verwendet, und das Ende der angegebenen Parameterdatei ist erreicht.

E108 Fehlender Operator
Innerhalb eines mathematischen Ausdrucks fehlt zwischen zwei Zahlen der Operator bzw. wurde falsch geschrieben (z.B.DEFB 3 AN 3 ).

E109 Überlauf / Ergebnis zu groß
Das Ergebnis einer Berechnung überschreitet den zulässigen Wertebereich.

E111 Division durch Null
Innerhalb eines mathematischen Ausdrucks wurde durch Null dividiert.

E112 Macro-Parameter existiert nicht
Innerhalb eines Makros wurde innerhalb eines mathematischen Ausdrucks auf einen nicht existierenden Parameter Bezug genommen, z.B. "@2" bei einem Makro mit nur einem Parameter.

E500 Interner Fehler
Dieser Fehler sollte nie auftreten. Prüfen Sie, ob die Programminstallation möglicherweise beschädigt wurde, und informieren Sie uns, möglichst mit einen Quellcodeausschnitt, der den Fehler auslöst.

E501 Fehler beim Laden der Assembler-DLL
Die Programminstallation wurde beschädigt und eine benötigte DLL gelöscht. Installieren Sie das Programm erneut.

E502 Assembler-DLL beschädigt/fehlerhaft
Die Programminstallation wurde beschädigt und eine benötigte DLL gelöscht. Installieren Sie das Programm erneut.

E503 Assembler-DLL benötigt neuere Version der PARSER.DLL
Wenden Sie sich an uns für ein Update.


Warnungen

W1000 IFDEF erfaßt nur Symbole, die vor dem Statement definiert sind
Der Befehl IFDEF erkennt nur solche Symbole als bereits definiert, die vor dem IFDEF-Befehl definiert worden sind (also solche, die in einem mathematischen Ausdruck an stelle des IFDEF in Pass 1 auswertbar wären).

W1001 ORG doppelt - Füge bis zur neuen Startadresse Nullbytes ein
Der Befehl ORG wurde verwendet, nachdem bereits Binärcode erzeugt wurde. Es werden jetzt Nullbytes eingefügt, um die neue Zeiladresse zu erreichen.

O1002 Vorgang ohne Fehler beendet
Der Übersetzungsvorgang war erfolgreich, es wurden keine Fehler gefunden.

W1003 Ein oder mehrere Füllbytes wurden eingefügt, um an die Wortbreite des Prozessors anzupassen
Der Befehl hat eine nicht durch die Wortbreite des Prozessors bzw. des aktuellen Segments teilbare Anzahl von Bytes erzeugt. Es wurden daher Nullbytes zum Auffüllen eingefügt.

W1004 Die definierte Größe des aktuellen Segments wurde überschritten
Im aktuellen Segment hat der Programmzähler (PC) die in der Segmentdefinition angegebene Obergrenze überschritten. Der erzeugte Code ist zu groß für das aktuelle Segment.




Letzte Aktualisierung am 22.10.2005 durch aside@theeg.de
Home ASide im Detail: Editor Symbolprüfung Syntaxhilfe Assembler Download Registrierung Impressum