CALMPSEU.DOK CALM-Pseudobefehle PSEUDOBEFEHLE Pseudobefehle sind Befehle an den Assembler. Alle Pseudooperationen beginnen mit einem Punkt. Pseudobefehle bestehen entweder nur aus einer Pseudooperation oder einer Pseudooperation und einem oder mehreren Ausdrücken (getrennt durch Kommas). Es gibt zwei Arten von Pseudobefehlen: Pseudobefehle mit einer eventuellen, vorangehenden Marke: .ASCII, .ASCIZ, .ASCIZE, .BLK.n, .DATA.n, .FILL.n, .n (.8, .16, .32, usw.), .STRING, .SYSCALL.n . Diese Pseudobefehle generieren Code oder reservieren Speicherplatz. Für generierte Datenwörter der Länge 16 und 32 Bits hängt die Bytenumerierung vom Prozessor ab. Pseudobefehle ohne vorangehende Marke: .ALIGN, .APC, .BASE, .CHAP, .ELSE, .END, .ENDIF, .ENDLIST, .ENDMACRO .ENDTEXT, .ERROR, .EVEN, .EXPORT, .IF, .IMPORT, .INS, .LAYOUT, .LIST, .LISTIF, .LOC, .LOCALMACRO, .MACRO, .MESSAGE, .ODD, .PAGE, .PROC, .PROCSET, .PROCVAL, .RANGE, .REF, .START, .TEXT, .TITLE . Diese Pseudobefehle generieren keinen Code und hängen nicht vom Prozessor ab. Eine vorangehende Marke ist aus folgenden Gründen nicht erlaubt: a) Zweideutigkeit: Eine Marke vor bsw. .LOC klärt nicht eindeutig den Wert der Marke. b) Unübersichtlichkeit: Eine Marke vor beispielsweise dem Pseudobefehl .IF erscheint nicht in der Auslistung, da Pseudobefehle zur bedingten Assemblierung nicht in die Auflistung kopiert werden. c) Unmöglichkeit: Eine Marke vor bsw. .MACRO ergibt keinen Sinn. d) Pseudobefehle sind in erster Linie Befehle an den Assembler und haben mit Marken, die im Benutzerprogramm verwendet werden, nichts zu tun. .ALIGN Beschreib.:Richtet den APC-Wert auf das nächste Vielfache des gegebenen Wertes aus. Kommentar: Der Inhalt der übersprungenen Speicherzellen ist nicht definiert. Beispiel: .LOC 16'234 ; APC = 16'234 .ALIGN 16'200 ; APC = 16'400 .ALIGN 16'100 ; APC = 16'400 .APC Beschreib.:Wählt einen der Assemblerbefehlszähler aus. Kommentar: Normalerweise wird nur ein Assemblerbefehlszähler verwendet. Mit dem Pseudobefehl .APC kann der Programmierer zwischen verschiedenen Befehlszählern auswählen (z.B. ROM- und RAM-Bereich). Bis zu acht verschiedene APC-Werte sind üblich. Alle APC-Werte werden zu Programmbeginn auf Null gesetzt. Beispiel: ROM = 0 RAM = 1 .APC ROM ; ROM-Bereich ab 16'0 .LOC 16'0 .APC RAM ; RAM-Bereich ab 16'2000 .LOC 16'2000 ... .APC ROM ; Programm JUMP BEGINN TESTRAM: MOVE.8 ALPHA,D0 .APC RAM ; Daten ALPHA: .8 0 ... CALM-Pseudobefehle Seite: 2 .ASCII Beschreib.:Fügt die ASCII-Codes der angegebenen druckbaren Zeichen ein. Das Syntaxdiagramm für eine ASCII-Zeichenfolge ist in Fig. 1 dargestellt. Die druckbaren Zeichen linke Winkelklammer und Anführungszeichen erhält man, indem man sie doppelt aufführt. Ein beliebiger 8 Bit Wert kann mit spitzen Klammern eingefügt werden. Kommentar: Der Pseudobefehl .ASCII liesse sich durch eine Folge von .8 ersetzen, aber ist viel natürlicher. Nicht druckbare Zeichen können mittels Winkelklammern eingefügt werden. Beispiel: .ASCII "Hier ist ein Beispiel" Um die Zeichenfolge "A( " )--------->( druckbares Zeichen ausser " < )--------->( " )-> --- | | ------------------------------- ^ ^ --- | | | | | | --- ---------------------- --- | | | |->( < )--->[ einfacher Ausdruck ]->( > )-| | | | --- | ---------------------- --- | | | | | | | | | | --- | | | | `------------------------->( < )-| | | | --- | | | | --- --- | | | `------------->( " )--->( " )-------------' | | --- --- | | | `------------------------>-----------------------' Fig. 1 .ASCIZ .ASCIZE Beschreib.:Gleiche Wirkung wie .ASCII. Fügt am Ende den ASCII-Code hinzu. Kommentar: In vielen Fällen signalisiert der Null-Code das Ende einer Zeichenfolge: .ASCIZ "ABC" oder: .ASCII "ABC<0>" .ASCIZE "ABC" ; = .ASCIZ + .EVEN (erzeugt 0) .BASE Beschreib.:Definiert die neue Zahlenbasis. Kommentar: Der Assembler CALM startet mit einer dezimalen Basis (Dezimalsystem). Gebräuchliche Basen sind: binär, oktal, dezimal und sedezimal (hexadezimal). Die neue Basis muss in der alten Basis ausgedrückt werden, ausser die Basis wird explizit vorangestellt (z.B.: 16'10). Beispiel: .BASE 10'16 CALM-Pseudobefehle Seite: 3 .BLK Beschreib.:Addiert das Produkt der Datenlänge mit der Datenanzahl zum APC-Wert. Kommentar: Dieser Befehl reserviert Speicherplatz ohne den Inhalt der Speicherzellen zu verändern. Verschiedene Datenlängen können gemischt werden und drücken so klarer die zu reservierende Datenstruktur aus. Beispiele: .BLK.8 100 ; addiert zu APC 100 .BLK.16 100 ; addiert zu APC 200 .BLK.32 100 ; addiert zu APC 400 .BLK.8.16.32 12 ; addiert zu APC 84 (1+2+4)*12 .CHAP Beschreib.:Fügt den angegebenen Text in den Untertitel der Überschrift ein. Kommentar: Dieser Pseudobefehl beginnt einen wichtigen Programmteil oder ein Unterprogramm. Der angegebene Text beschreibt in einigen Worten die ausgeführten Funktionen. Der Text erscheint im Untertitelfeld der Überschrift (vielfach neben dem Titel). Normalerweise beginnt dieser Pseudobefehl eine neue Seite. Beispiel: .CHAP Symbolbehandlung .DATA Beschreib.:Fügt den angebenen Wert in das Objektprogramm ein, wobei jeder Wert die angegebene Datenlänge hat. Kommentar: Bei Datenlängen von 16 und 32 Bits hängt die Reihenfolge der Bytes vom Mikroprozessor (durch .PROC definiert) ab. Der Assemblerbefehlszähler wird entsprechend erhöht. Äquivalente Pseudobefehle: .8, .16, .32, ... Beispiele: .DATA.8 255 ; Bereich (.8): -256..+255 .DATA.16 16'FFFF .DATA.32 -1 ; = 16'FFFFFFFF .DATA.8.8.16 "A", "Z", AD_A_Z .ELSE Beschreib.:Die folgenden Anweisungen bis zum zugehörigen .ENDIF werden assembliert, wenn der Ausdruck, der beim zugehörigen .IF stand, falsch (FALSE) war. Nach .ELSE kann ein Text angefügt werden, der vom Assembler ignoriert wird. Kommentar: Die zusätzliche Angabe hinter dem Pseudobefehl .ELSE dient nur zur besseren Orientierung für den Programmierer, vor allem wenn die Pseudobefehle .IF, .ELSE und .ENDIF weit auseinander liegen und geschachtelt sind. Beispiel: siehe .IF. .END Beschreib.:Beendet die Programmbefehle. Zusätzliche Kommentare können nach diesem Pseudobefehl hinzugefügt werden. Kommentar: Der Assembler ignoriert alle möglichen Anweisungen nach diesem Befehl. Der Pseudobefehl .END kann auch eine eingefügte Datei (mit dem Pseudobefehl .INS) beenden. Beispiel: .END CALM-Pseudobefehle Seite: 4 .ENDIF Beschreib.:Beendet einen .IF oder .ELSE Abschnitt. Nach .ENDIF kann ein Text angefügt werden, der vom Assembler ignoriert wird. Kommentar: Die zusätzliche Angabe hinter dem Pseudobefehl .ENDIF dient nur zur besseren Orientierung für den Programmierer, vor allem wenn die Pseudobefehle .IF, .ELSE und .ENDIF weit auseinander liegen und geschachtelt sind. Beispiel: siehe .IF. .ENDLIST Beschreib.:Beendet einen bedingten Auflistungsabschnitt. Kommentar: Nach dem Pseudobefehl .ENDLIST kann ein Text angefügt werden, der vom Assembler ignoriert wird. Zur besseren Übersicht kann man den Ausdruck des Pseudobefehls .LIST wiederholen (vor allem wenn mehrere Pseudobefehle .LIST geschachtelt sind und das Programm lang ist). Beispiel: siehe .LIST. .ENDMACRO Beschreib.:Beendet eine Makrodefinition. Kommentar: Beispiel: siehe .MACRO. .ENDTEXT Beschreib.:Rückkehr zu Assembleranweisungen. Kommentar: Beispiel: siehe .TEXT. .ERROR Beschreib.:Erzeugt eine Fehlermeldung. Kommentar: Beispiel: .ERROR Fehler: Programm zu lang .EVEN Beschreib.:Richtet den APC-Wert auf den nächsten geraden Wert aus (APC wird nicht geändert, falls bereits gerade). Kommentar: Der Inhalt der übersprungenen Speicherzelle ist nicht definiert. Der Pseudobefehl .EVEN lässt sich durch .ALIGN 2 ersetzen. Beispiel: .LOC 16'233 ; APC = 16'233 .EVEN ; APC = 16'234 .EVEN ; APC = 16'234 .EXPORT Beschreib.:Definiert die exportierten Symbole. Kommentar: Normalerweise können nur Adressen exportiert werden. Die generierte Objektdatei enthält diese Informationen. Der Binder (Linker) überprüft dann, ob alle Symbole definiert wurden. Beispiel: .EXPORT MUL64, DIV64 .FILL Beschreib.:Füllt die angegebene Länge mit dem angegebenen Wert. Kommentar: Das folgende Beispiel füllt 2048 Speicherzellen mit dem Wert 16'FF (z.B. für EPROM): Beispiele: .FILL.8 2048, 16'FF .FILL.16 10, 16'A5A5 .FILL.32 16, AD_ROUT CALM-Pseudobefehle Seite: 5 .IF Beschreib.:Die folgenden Anweisungen bis zum zugehörigen .ELSE oder .ENDIF werden assembliert, wenn der Ausdruck wahr (TRUE) ist. Die Pseudobefehle .IF können geschachtelt sein. Kommentar: Dieser Pseudobefehl erlaubt die bedingte Assemblierung. Beispiel: .IF M6801 ... ; assembliert wenn M6801 = TRUE .IF DEBUG ... ; assembliert wenn M6801 = TRUE ; und DEBUG = TRUE .ENDIF DEBUG ... .ELSE M6801 ... ; assembliert wenn M6801 = FALSE .ENDIF M6801 .IMPORT Beschreib.:Definiert die importierten Symbole. Kommentar: Die importierten Symbole müssen in einem anderen Modul exportiert worden sein (.EXPORT). Importierte Symbole sind Adressen. Beispiel: .IMPORT MUL64, DIV64 .INS Beschreib.:Fügt die angegebene Datei ein. Der Dateiname wird wie die Quelldatei ergänzt (falls keine Erweiterung). Kommentar: Bei grossen und komplexen Programmen ist es vorteil- hafter, das Programm auf mehrere Dateien zu verteilen. Das Hauptprogramm fügt dann die einzelnen Unterprogramme ein. Ebenso können oft verwendete Konstanten in einer Datei zusammengefasst werden. Beispiel: .INS KONSTANTEN .LAYOUT Beschreib.:Definiert die Parameter für die Gestaltung der Programm- auflistung. Diese Parameter werden entweder in einer Datei (FILE "Dateiname") oder durch eine Liste reservierter Namen angegeben (OCT, HEX, TAB n, LENGTH n, WIDTH n, usw.). Kommentar: Dieser Pseudobefehl ist sehr allgemein gehalten und ermöglicht alle denkbaren Erweiterungen. Grundidee hierbei ist, eine Programmauflistung flexibel zu gestalten. Andere Assembler definieren eine ganze Reihe verschiedener Pseudobefehle, die hier in einem Pseudobefehl zusammengefasst sind. Folgende Namen wurden bisher reserviert: HEX, OCT (Daten in sedezimaler oder oktaler Darstellung) LENGTH n (definiert n Zeilen pro Seite; n=0: unendlich) WIDTH n (definiert n Zeichen pro Zeile) TAB n (ein Tabulator entspricht n Leerzeichen) LEADING0 TRUE/FALSE (vor Adressen/Werte (.LST): '0'/' ') DEFFIRST, LSBFIRST, MSBFIRST (Byte-Folge [.16, .32,...]) Beispiel: .LAYOUT HEX, LENGTH 66 .LIST Beschreib.:Die folgenden Anweisungen werden aufgelistet, wenn der Ausdruck wahr (TRUE) ist. Die Pseudobefehle .LIST können geschachtelt sein. Kommentar: Dieser Pseudobefehl erlaubt die bedingte Auflistung. Beispiel: .LIST DEBUG ; aufgelisteter Programmabschnitt wenn DEBUG = TRUE. .ENDLIST DEBUG CALM-Pseudobefehle Seite: 6 .LISTIF Beschreib.:Zeigt alle .IF/.ELSE/.ENDIF-Pseudobefehle in der Auflistung. Kommentar: Kein Ausdruck oder ein Ausdruck <> null bedeuten TRUE. Beispiel: .LISTIF DEBUG_IF .LOC Beschreib.:Weist einen neuen Wert dem laufenden Assemblerbefehlszähler zu. Die APC-Werte sind zu Programmbeginn auf Null gesetzt. Beispiel: .LOC 16'2000 .LOCALMACRO Beschreib.:Deklariert die lokalen Symbole in einer Makro. Kommentar: Dieser Pseudobefehl ist nur innerhalb einer Makrodefinition gültig. Die entsprechenden Symbole werden vom Assembler durch lokale Symbole (z.B.: M_10$) beim Makroaufruf ersetzt. Beispiel: siehe .MACRO. .MACRO Beschreib.:Beginnt eine Makrodefinition mit dem Makronamen und einer fakultativen Parameterliste. Die Syntax für den Makronamen ist dieselbe wie für Symbolnamen. Kommentar: Die auf den Makronamen folgende Parameterliste, bestimmt die Werte der entsprechenden Parameter, wenn diese bei einem Makroaufruf nicht vorhanden sind. In der Makrodefinition werden die einzelnen Parameter durch ein Prozentzeichen, gefolgt von einer Ziffer, aufgerufen. Beispiel: Makrodefinition (68000): .MACRO WARTEN, D0, 1 .LOCALMACRO SCHLAUFE MOVE.16 #%2-1,%1 SCHLAUFE:DJ.16,NMO %1,SCHLAUFE .ENDMACRO Erster Aufruf: WARTEN D1,EINE_MSEK ergibt: MOVE.16 #EINE_MSEK-1,D1 M_0$: DJ.16,NMO D1,M_0$ Zweiter Aufruf: WARTEN ,ZWEI_MSEK ; ohne ersten Parameter ergibt: MOVE.16 #ZWEI_MSEK-1,D0 M_1$: DJ.16,NMO D0,M_1$ .MESSAGE Beschreib.:Zeigt den Text während des Assemblierens. Beispiel: .MESSAGE Assemblierung dauert etwa 10 Minuten .n (.8, .16, .32, ...) Beschreib.:Fügt den angebenen Wert in das Objektprogramm ein, wobei jeder Wert die angegebene Datenlänge hat. Kommentar: Bei Datenlängen von 16 und 32 Bits hängt die Reihenfolge der Bytes vom Mikroprozessor (durch .PROC definiert) ab. Der Assemblerbefehlszähler wird entsprechend erhöht. Beispiele: .8 255 ; Bereich (.8): -256..+255 .16 16'FFFF .32 -1 ; = 16'FFFFFFFF .8.8.16 "A", "Z", AD_A_Z CALM-Pseudobefehle Seite: 7 .ODD Beschreib.:Richtet den APC-Wert auf den nächsten ungeraden Wert aus (APC wird nicht geändert, falls bereits ungerade). Kommentar: Der Inhalt der übersprungenen Speicherzelle ist nicht definiert. Der Pseudobefehl .ODD lässt sich durch .ALIGN APC+1-(APC.AND.1) ersetzen. Beispiel: .LOC 16'234 ; APC = 16'234 .ODD ; APC = 16'235 .ODD ; APC = 16'235 .PAGE Beschreib.:Beginnt eine neue Seite in der Auflistung (.LST). Kommentar: Wenn ein Parameter N angegeben wird, dann testet ASCALM ob noch N Zeilen nach .PAGE vorhanden sind. Beginnt eine neue Seite, wenn nicht. Beispiel: .PAGE .PROC Beschreib.:Fügt die angegebene Prozessorbeschreibung ein und generiert den Maschinencode für diesen Prozessor. Kommentar: Ein CALM Assembler lässt sich so konstruieren, dass er aus einem Hauptteil und einem prozessorspezifischen Teil besteht. Daher existiert nur ein CALM Assemblerprogramm, aber mehrere Prozessorbeschreibungen. Ihre entsprechenden Dateien werden mit dem Pseudobefehl .PROC eingefügt. Beispiel: .PROC M68000 .PROCSET .PROCVAL Beschreib.:Erlaubt lokake Einstellungen im Prozessormodul .PRO. Kommentar: .PROCSET erlaubt nur Namen. .PROCVAL erlaubt Namen und Werte. Namen und Werte sind modulspezifisch. Beispiele: .PROCSET FPU ;erlaubt FPU-Befehle (M68020.PRO) .PROCVAL FPU_ID 2 ;FPU-Nummer ist 2 (M68020.PRO) .RANGE Beschreib.:Definiert den erlaubten Wertebereich für .DATA, .FILL und .n. Kommentar: Vordefinierte Wertebereiche: - .RANGE.8 -256,+255 - .RANGE.16 -65536,+65535 - .RANGE.32 16'80000000,16'7FFFFFFF ; Spezialfall, da ; 32-Bit-Arithmetik Beispiele: .RANGE.16 -32768,+32767 .16 Wert ; -32767 <= Wert <= +32767 .RANGE.16 -65536,+65535 ; Vorgabewerte CALM-Pseudobefehle Seite: 8 .REF Beschreib.:Fügt die angegebene Symboltabelle ein. Dadurch werden die Symbolnamen und deren Werte definiert. Kommentar: Mit dem Pseudobefehl .REF lassen sich Symbole mit festen Werten direkt in die Assemblersymboltabelle laden. Z.B.: - feste Speicheradressen (z.B. in ROM) - Ein-/Ausgabedefinitionen - nicht druckbare ASCII-Zeichen (z.B. CR, LF) Das Format dieser Datei hängt von der internen Datenstruktur der Symbole im Assembler ab. Zwei Vorteile hat diese Methode. Erstens geht das Einfügen der Datei sehr schnell (Analyse entfällt) und zweitens benötigt diese Datei weniger Speicherkapazität als die gleichwertige Methode mit .INS. Beispiel: .REF SYMBOLE .START Beschreib.:Definiert die Startadresse. Kommentar: Die Startadresse ist die Adresse, bei der der Prozessor die Ausführung beginnen soll. Wird keine Startadresse definiert, nimmt der Assembler den Wert Null an. Beispiel: .START 16'100 .STRING Beschreib.:Gleiche Wirkung wie .ASCII. Fügt am Anfang die Länge (8 Bits) der Zeichenfolge ein. Beispiel: .STRING "Hallo!" oder: .ASCII "<6>Hallo!" .SYSCALL Beschreib.:Definiert einen speziellen Befehl (Systemaufruf). Kommentar: Möglich sind .SYSCALL.8, .SYSCALL.16 und .SYSCALL.32. Erzeugt .8, .16 oder .32 mit SYSCALL-Name und Aufrufname. Beispiel: .SYSCALL.16 INT ; Definition, ausserdem INTDOS=16'CD21 INT DOS ; Aufruf, erzeugt: .16 INTDOS .TEXT Beschreib.:Bis zum Pseudobefehl .ENDTEXT werden alle folgenden Zeilen vom Assembler ignoriert. Kommentar: Mit den Pseudobefehlen .TEXT und .ENDTEXT ist es möglich, zusätzliche Informationen (z.B. Text, Tabellen, Grafiken) in ein Assemblerprogramm zu schieben. Der Assembler interpretiert diese Informationen nicht mehr als Assembleranweisungen, kopiert sie aber in die Auflistungsdatei. Im Prinzip sind diesen Informationen keine Grenzen gesetzt, aber folgende Schreibweise muss beachtet werden: .TEXT alles ist hier möglich .ENDTEXT .TITLE Beschreib.:Beginn einer neuen Seite mit dem angegebenen Titel in der Überschrift. Dieser Titel wird in den folgenden Seiten wiederholt. Kommentar: Dieser Pseudobefehl steht normalerweise zu Beginn eines Programms. Es sollte der Name des Programms angegeben werden. Auch das Datum und die Zeit werden üblicherweise in der Überschrift der Programmauflistung angegeben. Beispiel: .TITLE ASSEMBLER