CALMDEF.DOK CALM-Definitionen ZWECK UND ANWENDUNGSBEREICH CALM setzt Schreibweisen für Assemblerprogramme fest, die sich für Prozessoren beliebiger Daten- und Adresswortlänge eignen und eine "von-Neumann"-Architektur aufweisen. Diese Schreibweisen umschreiben mittels englischen Tätigkeitswörtern die auszuführende Operation. Nicht nur aktuelle, auch künftige, komplexere Architekturen sind vorgesehen. CALM setzt die mnemotechnischen Namen und die Syntax, der am häufigsten vorkommenden Operationen, Testbedingungen, Spezial- registern, Datentypen, Adressierungsarten und Pseudobefehlen fest. Die CALM-Schreibweise beschreibt exakt alle Befehle eines Prozessors. Stehen für eine gegebene Operation mehrere, aber funktionell identische Befehle zur Verfügung (z.B. absolute und relative Adressierung), so bietet CALM einerseits eine explizite und genaue Schreibweise für jeden dieser Befehle und andererseits eine vereinfachte Schreibweise an, die dem Assembler die Wahl des Befehls überlässt. CALM setzt keinen Programmierstil fest, aber ermöglicht und fördert eine klare und modulare Gestaltung der Programme. CALM berücksichtigt ebenfalls künftige, leistungsfähigere Anzeigen und Drucker. Module und die notwendigen Pseudobefehle sind ebenfalls vorgesehen und ermöglichen somit die Verbindung mit höheren Programmiersprachen. CALM definiert kein Binärformat für das Objektprogramm, empfiehlt aber die Norm P695. CALM ist in DIN 66283 normiert. BEGRIFFE Die verwendeten Begriffe entsprechen den Bedeutungen, wie sie von den wichtigsten Mikroprozessorherstellern benutzt werden. Verbindlich sind die Syntaxdiagramme. Sie entsprechen den üblichen Regeln, wie sie z.B. in der Sprache Pascal verwendet werden. Kreise und Rechtecke mit runden Ecken verweisen auf Grundelemente (Zeichen oder Schlüsselwörter). Rechtecke verweisen auf an anderer Stelle definierte Elemente. Symbole in Winkelklammern (<>) bedeuten den Wert dieses Symbols, z.B. . Dezimalzahlen werden nur Zahlen genannt. Die Zahlen bleiben auch als Zusatzangaben dezimal, selbst wenn die Basis geändert wurde. ZEICHENVORRAT Der Zeichenvorrat basiert auf dem vollen ASCII-Zeichensatz. Er besteht aus druckbaren und nichtdruckbaren Zeichen. DRUCKBARE ZEICHEN Buchstaben - obligatorisch: A..Z - fakultativ: a..z Kleinbuchstaben werden den entsprechenden Grossbuchstaben gleichgesetzt (Symbole, Registernamen). Ziffern - obligatorisch: 0..9 Sonderzeichen - obligatorisch: + Pluszeichen - Minuszeichen * Stern / Schrägstrich . Punkt , Komma : Doppelpunkt = Gleichheitszeichen ; Strichpunkt _ Unterstrich $ Dollarzeichen # Nummernzeichen ' Apostroph " Anführungszeichen ^ Zirkumflex | Vertikalstrich % Prozentzeichen () runde Klammern {} geschweifte Klammern <> Winkelklammern Zwischenraum, Leerzeichen Horizontal-Tabulator CALM-Definitionen Seite: 2 - fakultativ verwendbar in Kommentaren: & "Und"-Zeichen ! Ausrufezeichen ? Fragezeichen @ "at"-Zeichen ` Gravis ~ Tilde [] eckige Klammern \ Schrägstrich rückwärts Anmerkung: Der Schrägstrich rückwärts oder typographisches Fluchtsymbol (\) ermöglicht die Erweiterung des Zeichenvorrats um spezielle graphische und typographische Zeichen. Die Verträglichkeit zwischen einem Bildschirm oder Drucker mit fester Zeichenbreite und einem Gerät mit Proportionalschrift und frei setzbaren Tabulatoren lässt sich durch Pseudo-Tabulatoren (\) erreichen. Nicht-ASCII-Zeichen Buchstaben mit Akzenten oder sonstige spezielle Zeichen dürfen in Kommentaren verwendet werden, sofern kein Widerspruch zu einem anders definierten Zeichen entsteht. NICHTDRUCKBARE ZEICHEN Steuerzeichen Zeilen-Ende leer Alle anderen Steuerzeichen werden ignoriert. PROGRAMM IN ASSEMBLER UND ANWEISUNGEN Ein Programm in Assemblersprache besteht aus einer endlichen Folge von Anweisungen. Jede Anweisung kann bis zu 255 Zeichen lang sein und wird durch ein abgeschlossen. Eine "END-Anweisung" beendet das Programm in Assemblersprache. Das Syntaxdiagramm eines Programms in Assemblersprache ist in Fig. 1 dargestellt. Das Syntaxdiagramm einer Anweisung ist in Fig. 2 dargestellt. Programm in Assemblersprache /---------------<---------------, | | | ------------- ------ | ------------------------[ Anweisung ]--->( )---' | ------------- ------ | | ----------------- `->[ END-Anweisung ] ----------------- END-Anweisung -------- ------ -------- --------------- ------ --->[ f.T. ]--->( .END )--->[ s.f. ]--->[ Kommentar ]--->( ) -------- ------ -------- | --------------- | ------ | | `--------->--------' f.T.: fakultatives Trennzeichen Fig. 1 CALM-Definitionen Seite: 3 Anweisung --------------- /--------------------->[ Zuweisung ]-, | --------------- | | /------<------, | | | | --------------- | | | | /->[ Pseudobefehl]-| | | ---------*| | --------------- | ------ ----------- ----->[ Marke ]-----| |->[f.T.]--->[Kommentar]---> | --------- | | --------------- | ------ | ----------- | | | `->[ Befehl ]-| | | |--------->----' --------------- | `------->------' | | `------------------>----------------' Marke --------------------- /->[ globale Marke ]-, -------- | --------------------- | ------>[ f.T. ]---| |---> -------- | --------------------- | `->[ lokale Marke ]-' --------------------- Kommentar /-------------<---------------, | | --- | -------------------- | -------->( ; )----->( druckbares Zeichen )-' --- | -------------------- | `-----------------------------> * bei einigen Pseudobefehlen sind Marken nicht zugelassen. Fig. 2 TRENNZEICHEN Ein Trennzeichen besteht aus einem oder mehreren Zwischenräumen und/oder Tabulatoren. Normalerweise wird ein Zwischenraum oder ein Tabulator verwendet. Das Syntaxdiagramm ist in Fig. 3a dargestellt. Das Syntaxdiagramm für ein fakultatives Trennzeichen (f.T.) ist in Fig. 3b dargestellt. Trenn /------------------<-------------------, | | | -------- | ------->( )------------->-----------------> | -------- | | | | ------- | `->( )------------->-----------| ------- | | V /---------<---------, ^ | | | | | | --- ------- | | `--->( \ )->( )---' --- ------- Fig. 3a CALM-Definitionen Seite: 4 f.T. --------- ------>[ Trenn ]-----> | --------- | | | `------>-----' Fig. 3b VORZEICHENLOSE KONSTANTEN Vorzeichenlose Konstanten sind p-Zahlen oder Zeichencodes. Sie werden innerhalb des Assemblers als 128 Bit Wörter gespeichert. Das Syntaxdiagramm ist in Fig. 4 dargestellt. vorzeichenlose Konstante ------------ /------------->[ p-Zahl ]-------------, | ------------ | | | | --------------- --- ------------ V ------------------------>[ Zahl (=p) ]->( ' )->[ p-Zahl ]-----> | --------------- --- ------------ ^ | | | --------------------- | `-------->[ Zeichencode ]---------' --------------------- Fig. 4 P-ZAHLEN Eine p-Zahl ist eine positive ganze Zahl der Basis p, mit 2 <= p <= 16. Ihre p-Ziffern werden der geordneten Folge 0..9, A..F entnommen. Das Syntaxdiagramm ist in Fig. 5 dargestellt. Falls die Basis nicht p ist, kann die Basis explizit vorangestellt werden: p=2 (dual) 2' z.B.: 2'11110001 p=8 (oktal) 8' z.B.: 8'361 p=10 (dezimal) 10' z.B.: 10'241 p=16 (sedezimal) 16' z.B.: 16'F1 Die eingestellte Basis beim CALM Assembler ist 10 (Dezimalsystem). Ist die Basis grösser als 10 und wird keine Basis explizit vorangestellt, so muss die erste Ziffer einer Zahl eine Dezimalziffer sein. Deshalb muss eine nicht bedeutsame führende Null vor die p-Zahl gesetzt werden, wenn die höchstwertige p-Ziffer ein Buchstabe ist (z.B. 0FF). p-Zahl /-----<-----, | | p<=10 V ------ | /-------------->( 0.. )-----------, | ------ | | | ------| /-------<--------, |---> | | | | | ------ V ----------- | | `->( 0..9 )----->( 0..9,A.. )-----' p>10 ------ | ----------- ^ | | `--------->----------' Fig. 5 CALM-Definitionen Seite: 5 ZEICHENCODE Durch Anführungszeichen (") vor und hinter einem druckbaren Zeichen erhält man den ASCII-Code dieses Zeichens. Das Syntaxdiagramm ist in Fig. 6 dargestellt. Beispiel: "A" ergibt 16'41 und mit """" erhält man den ASCII-Code 16'22 des Anführungszeichen. Zeichen --- ------------------------------ --- ---------->( " )--->( druckbares Zeichen, ausser " )--->( " )---> --- | ------------------------------ ^ --- | --- --- | `------>( " )----------->( " )--------' --- --- Fig. 6 GLEITPUNKTZAHLEN Das Syntaxdiagramm von Gleitpunktzahlen ist in Fig. 7 dargestellt. Es wird das IEEE P754 Format unterstellt. Der Assembler verwendet intern das 80 Bit P754 Format. Der Wert einer Gleitpunktzahl wird erst dann in das Format mit 64 oder 32 Bits umgewandelt, wenn der Wert in einem Befehl benutzt wird. Gleitpunktzahlen können nur als unmittelbare Werte aufgerufen werden. Die Behandlung von Gleitpunktzahlen in Ausdrücken wird in CALM nicht gefordert. Beispiel: -300.0 oder -3E+2. Bemerkung: Wir benützen hier bewusst den Begriff Gleitpunktzahl (anstatt Gleitkommazahl), da ja ein Punkt verwendet werden muss. Gleitpunktzahl /--------------->----------------, | | - | - | /->(+)-, | /->(+)-, | | - | | | - | | | | ------ - ------ | - | | ------ V ----->---->[v.K.]-->(.)->[v.K.]------->(E)---------->---->[v.K.]--> | | ------ | - ------ ^| - ^ | | ------ | - | | || - - | | - | `->(-)-' `------>-------'`->(\)->(E)-' `->(-)-' - - - - v.K.: vorzeichenlose Konstante Fig. 7 SYMBOLE Symbole besitzen einen Namen und einen Wert. Der Name eines Symbols besteht aus bis zu 32 Zeichen. Der Assembler speichert den Wert des Symbols mit einer Wortlänge von 256 Bits. Klein- und Grossbuchstaben im Namen des Symbols werden gleichgesetzt. Das Syntaxdiagramm für einen Symbolnamen ist in Fig. 8 dargestellt. Es gibt drei Arten von Symbolen: - reservierte Symbole - vordefinierte Symbole - anwenderdefinierte Symbole CALM-Definitionen Seite: 6 Symbolname /----------<---------, | | --------- V --------- | ------------>( Buchstabe )----->( Buchstabe )---| --------- | --------- | | | | ------- | |--->( Ziffer )---| | ------- | | | | --- | |------>( _ )------' | --- | `----------------------> Fig. 8 RESERVIERTE SYMBOLE Reservierte Symbole bezeichnen spezielle Register. Sofern nicht eine aussergewöhnliche Architektur berücksichtigt werden muss, bezeichnen: PC den Befehlszähler zur Programmausführung (Program Counter) SP den Stapelzeiger (Stack Pointer) F arithmetisches Bedingungsregister (Flags) S Zustandsregister (System, Status) Die Namen der Register sollte mit denen der Hersteller übereinstimmen. Tabelle 1 zeigt die in CALM gewählten Registernamen einiger Prozessoren. Z80: Zilog: F A BC DE HL IX IY SP CALM: F A BC DE HL IX IY SP 6809: Motorola: CC D X Y S U DP CALM: F AB IX IY SS US P 68000: Motorola: CCR SR D0..D7 A0..A7 A7 CALM: F SF D0..D7 A0..A7 A7 = SP Tab. 1 VORDEFINIERTE SYMBOLE Es gibt drei Arten von vordefinierten Symbolen: obligatorische: APC = Wert des Assemblerbefehlzählers zu Beginn des Befehls, in dem APC steht. TRUE = -1 (alle Bits auf 1) FALSE = 0 (alle Bits auf 0) fakultative: SYSTIME = 0 h m s (32 Bits BCD) SYSDATE = 0 j m t (32 Bits BCD) FLOATPI = Zahl Pi FLOATE = Zahl e im Assembler definierte: sollte vermieden werden CALM-Definitionen Seite: 7 ANWENDERDEFINIERTE SYMBOLE Ein anwenderdefiniertes Symbol wird vom Programmierer explizit eingeführt. Es bezeichnet eine Konstante oder eine Speicheradresse und besitzt zusätzliche Kennzeichen zur Erleichterung des Assemblierungsvorgangs und der Fehlererkennung. Namen eines reservierten oder vordefinierten Symbols dürfen nicht verwendet werden. Es gibt vier Möglichkeiten für anwenderdefinierte Symbole: - globale Marke - lokale Marke - Zuweisung - IMPORT-Pseudobefehl GLOBALE MARKE Eine globale Marke ist ein Symbol, das im Markenfeld einer Assembleranweisung definiert ist. Der Wert einer Marke ist durch den aktuellen Assemblerbefehlszähler gegeben. Eine globale Marke ist im ganzen Programm gültig. Das Syntaxdiagramm ist in Fig. 9 dargestellt. globale Marke ------------------ --- ------------------>[ Symbolname ]--->( : )---> ------------------ --- Fig. 9 LOKALE MARKE Lokale Marken sind befristet gültige Marken, die nur zwischen zwei globalen Marken existieren. Die Länge des Symbolnamens ist auf 8 Zeichen beschränkt. Das Syntaxdiagramm ist in Fig. 10 dargestellt. lokale Marke ------------------ --- --- ------------------>[ Symbolname ]--->( $ )--->( : )---> ------------------ --- --- Fig. 10 ZUWEISUNG Ein Symbol wird mittels eines Gleichheitszeichens (=) definiert. Die rechte Seite der Zuweisung ist entweder ein Ausdruck oder eine Gleitpunktzahl. Das Syntaxdiagramm ist in Fig. 11 dargestellt. Zuweisung ---------- /---->[Ausdruck]-------, ------ ------ ------ - ------ | ---------- | --->[f.T.]->[Sn. ]->[f.T.]->(=)->[f.T.]-| |--> ------ ------ ------ - ------ | ------------------- | `->[ Gleitpunktzahl ]-' ------------------- Sn.: Symbolname Fig. 11 IMPORT-PSEUDOBEFEHL Ein IMPORT-Pseudobefehl deklariert diejenigen Symbole, die in anderen Programmodulen definiert sind. Auf den reservierten Namen .IMPORT folgen eines oder mehrere Symbole. Das Syntaxdiagramm ist in Fig. 12 dargestellt. Die Werte der Symbole sind dem Assembler unbekannt. CALM-Definitionen Seite: 8 IMPORT-Pseudobefehl ------ --- ------ /-[f.T.]<-( , )<-[f.T.]-, | ------ --- ------ | | | -------- --------- --------- V ------------ | --->[ f.T. ]--->( .IMPORT )--->[ Trenn ]------->[Symbolname]------> -------- --------- --------- ------------ Fig. 12 AUSDRÜCKE Ausdrücke mit Operatoren höherer Priorität werden zuerst berechnet. Bei Operatoren gleicher Priorität erfolgt die Berechnung von links nach rechts. Mit Klammern kann die Priorität geändert werden. Die Syntaxdiagramme für einen Ausdruck sind in Fig. 13 dargestellt. Operatoren unter Faktor haben die höchste Priorität, Vergleichsoperatoren die niedrigste. Operatoren mit einem Operand (monadische Operatoren): + positiv - negativ (Zweierkomplement) .BIT. äquivalent zu 1.sl.Faktor oder 2**Faktor .DEFINED. ergibt TRUE falls Symbol definiert ist sonst FALSE .EQ0. logische Negation (0 -> TRUE, <>0 -> FALSE) .HIGH8. äquivalent zu (Faktor.sr.8).and.16'FF .HIGH16.äquivalent zu (Faktor.sr.16).and.16'FFFF .LOG2. ergibt 0..31 für Faktor = 1..16'FFFFFFFF (0 = Fehler) .LOW8. äquivalent zu Faktor.and.16'FF .LOW16. äquivalent zu Faktor.and.16'FFFF .NOT. Komplement (Einerkomplement) .SQR. äquivalent zu Faktor*Faktor .SQRT. berechnet Quadratwurzel (Faktor = 0..16'7FFFFFFF) Operatoren mit zwei Operanden (dyadische Operatoren): + Addition - Subtraktion * Multiplikation ** Potenzieren / Division (oder .DIV.) .MOD. Rest der ganzzahligen Division .OR. logische Addition, logisches ODER, Disjunktion .AND. logisches Produkt, logisches UND, Konjunktion .XOR. ausschliessendes ODER, Antivalenz .ASR. arithmetische Verschiebung nach rechts (2. Operand: Amplitude) .SR. Verschiebung nach rechts .SL. Verschiebung nach links (oder .ASL.) .RR. Rotation nach rechts (32 Bits) .RL. Rotation nach links (32 Bits) Vergleichsoperatoren (zwei Operanden, Ergebnis ist TRUE oder FALSE): .EQ. gleich .NE. ungleich .LO. kleiner * vorzeichenlos, .LS. kleiner oder gleich * logisch .HS. grösser oder gleich * .HI. grösser * .LT. kleiner als + arithmetisch, .LE. kleiner als oder gleich + Zweierkomplement .GE. grösser als oder gleich + .GT. grösser als + CALM-Definitionen Seite: 9 Ausdruck ---------------------- --->[ einfacher Ausdruck ]--------------------------------------> ---------------------- | ^ V | /-----------------------------------------------------, | V V V V V V V V V V | ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- | (.EQ.)(.NE.)(.LO.)(.LS.)(.HS.)(.HI.)(.LT.)(.LE.)(.GE.)(.GT.) | ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- | | | | | | | | | | | | `-----------------------------------------------------' | | ---------------------- | `--->[ einfacher Ausdruck ]-------' ---------------------- einfacher Ausdruck --- /->( + )-, | --- | | | --------- ------------->------->[ Term ]------------------------> | | ^ --------- V V V V | --- | | --- --- ---- ----- `->( - )-' | ( + )( - )(.OR.)(.XOR.) --- | --- --- ---- ----- | | | | | `------<------------------------' Term -------- ->[Faktor]--------------------------------------------------------> ^ --------V V V V V V V V V V | - --- --- ----- ----- ----- ---- ---- ---- ---- | (*)( **)( / )(.MOD.)(.AND.)(.ASR.)(.SR.)(.SL.)(.RR.)(.RL.) | - --- --- ----- ----- ----- ---- ---- ---- ---- | | | | | | | | | | | `----<---------------------------------------------------------' Faktor ---------------------------- /------>[ vorzeichenlose Konstante ]--------, | ---------------------------- | | | | ------------------ | |--------------------->[ Symbolname ]---| | ^ ------------------ | | ----------- | | |-->( .DEFINED. )--' | | ----------- | | | ------ | --- ---------------------- --- V ------ -->[f.T.]------>( ( )-->[ einfacher Ausdruck ]-->( ) )---->[f.T.]-> ------ | --- ---------------------- --- ^ ------ | | | ------- | |----------------->[ APC ]------------------| | ------- | | | | ------- ----------- | `---------->( .fop. )--->[ Faktor ]--------' ------- ----------- fop = BIT, EQ0, HIGH8, HIGH16, LOG2, LOW8, LOW16, NOT, SQR, SQRT. Fig. 13 CALM-Definitionen Seite: 10 DATENANGABE Eine Datenangabe wird direkt an den Operationscode oder an den Operanden angehängt. Ein Punkt dient als Trennzeichen. Eine Datenangabe setzt sich aus einem Datentyp und einer Länge zusammen. Diese Länge wird immer in Bits ausgedrückt, also auch für BCD-Ziffern und Zeichen. Wenn kein Datentyp angegeben ist, handelt es sich um vorzeichenlose Daten. Folgende Datentypen und die zugehörigen, reservierten Buchstaben werden definiert: U oder nichts vorzeichenlos, logisch A arithmetisch (Zweierkomplement) S vorzeichenbehaftet (Vorzeichen und Betrag) O Abstand (um 2n-1 erhöht) D dezimal (vorzeichenlos, 2 Ziffern pro Byte) F Gleitpunkt (IEEE 754 Format) Weitere Datentypen können für spezielle Prozessoren durch neue Buchstaben definiert werden. Das Syntaxdiagramm für Datenangaben ist in Fig. 14 dargestellt. In einem Befehl müssen die verarbeiteten Daten durch Datenangaben explizit beim Operationscode oder bei den Operanden angegeben werden. Eine Ausnahme bilden solche Prozessoren, die für jeden Befehl nur über einen Datentyp und eine Datenlänge verfügen. Hier kann die Datenangabe entfallen, da sie implizit ist. Datenangabe --- ---------- --------->( . )------------------------------------->[ Zahl ]---> --- V V V V V V ^ ---------- --- --- --- --- --- --- | ( U )( A )( S )( O )( D )( F ) | --- --- --- --- --- --- | | | | | | | | `-------------------------->--' Fig. 14 ADRESSENANGABE Eine Adresse, dargestellt durch einen Ausdruck, kann im absoluten oder relativen Bereich festgelegt werden. Hierzu wird eine Adressenangabe vor dem Ausdruck verwendet. Ein Zirkumflex dient als Trennzeichen. Im absolut adressierten Bereich gibt die Adressenangabe an, wie die angegebene Adresse auf die volle Adresslänge erweitert werden soll. Die Erweiterung ist entweder vorzeichenlos (Nullerweiterung, kein Buchstabe oder Buchstabe U) oder arithmetisch (Vorzeichenerweiterung, Buchstabe A). Danach folgt die Anzahl der Bits, die von der nicht erweiterten Adresse genommen werden sollen. Der relativ adressierte Bereich, angegeben durch den Buchstaben R, wird unter "relative Adressierung" definiert. Das Syntaxdiagramm für Adressenangaben ist in Fig. 15 dargestellt. CALM-Definitionen Seite: 11 Adressenangabe ---------- --- --------------------->------------->[ Zahl ]------->( ^ )---> | ^ ---------- ^ --- | --- | | |--->( A )--------------->---------' | --- | | | | --- | |--->( R )---| | --- | | | | --- | `--->( U )---' --- Fig. 15 ADRESSEN, ADRESSRÄUME UND DIREKTE ADRESSIERUNG Ein Adressraum ist eine zusammenhängende Folge von Speicherzellen, die meist von Null an numeriert werden. Normalerweise ist jede Speicherzelle 8 Bits (= 1 Byte) breit Sie besitzt eine Nummer oder einen gleichwertigen Ausdruck, die sogenannte Adresse. Existieren mehrere Adressräume, so bezieht sich die obige Definition auf den Adressraum, in dem die Befehle des Prozessors stehen. Diesen Adressraum nennt man Speicheradressraum oder allgemein Speicher oder Hauptspeicher. Andere Adressräume (z.B. Ein-/Ausgabe, Daten) werden durch reservierte Sonderzeichen ($, %) gekennzeichnet. Registeradressräume sind oft nicht geordnet. Die Registernamen sind reserviert. Numerierte Register können als Adressräume betrachtet werden, die mit den Buchstaben A, D oder R beginnen. Die Adressierung eines Adressraums durch eine Adresse (Registername oder Ausdruck) nennt man direkte Adressierung. Das Syntaxdiagramm einer direkten Adresse ist in Fig. 16. dargestellt. direkte Adresse --------------- /--->( Registername )---, | --------------- | -----------------| |---> | -------------- | `----->[ Ausdruck ]------' -------------- Fig. 16 INDIREKTE ADRESSIERUNG Der Inhalt einer beliebigen Adresse in einem beliebigen Adressraum kann erneut als eine Adresse in einem beliebigen Adressraum verwendet werden. Dies nennt man indirekte Adressierung. Ist dieser Adressraum nicht der Speicheradressraum, so muss der betreffende Adressraum gekennzeichnet werden. Geschweifte Klammern zeigen an, dass der Inhalt der ermittelten Adresse zur Berechnung der neuen Adresse innerhalb desselben Befehls verwendet wird. Das Syntaxdiagramm einer indirekten Adresse ist in Fig. 17 dargestellt. Der darin verwendete Begriff effektive Adresse wird später definiert. Eine Registeradresse kann nicht durch eine indirekte Adressierung gebildet werden. Existiert diese Möglichkeit auf einem bestimmten Prozessor, so müssen Register als Speicher- oder zusätzliche Datenadressräume betrachtet werden. CALM-Definitionen Seite: 12 indirekte Adresse --- --------------------- --- ----------------->( { )--->[ effektive Adresse ]--->( } )---> --- --------------------- --- Fig. 17 RELATIVE ADRESSIERUNG Da der PC (Befehlszähler) einen zur Assemblierungszeit bekannten Wert besitzt, spielt die indirekte Adressierung relativ zum PC eine besonders wichtige Rolle. Für den Programmierer ist der Ausdruck {PC}+ABSTAND gleichbedeutend mit einer direkten Adresse ADSPEICHER (nur im Speicheradressraum). Der Assembler berechnet den Wert ABSTAND aus dem Wert ADSPEICHER und setzt diesen kodiert in den Befehl ein. Die relative Adressierung kann vom Programmierer mittels des vorangestellten Buchstaben R gefordert werden. Ist der Abstand begrenzt, wird die Bitzahl hinter dem R angegeben. ABSTAND wird immer als arithmetische Zahl (Zweierkomplement) kodiert und wird deshalb mit Vorzeichen auf die volle Länge des PC erweitert. Die relative Angabe R ist in Fig. 15 enthalten. AUTOMATISCHE MODIFIKATION Register und Speicherzellen, die zur indirekten Adressierung verwendet werden, können beim Aufruf modifiziert werden. Die häufigsten Operationen sind Erhöhung oder Verminderung um 1, 2 oder 4. Besteht eine Beziehung zwischen der verarbeiteten Datenlänge und dem Erhöhungs-/Verminderungswertes, wird ein einzelnes Plus- oder Minuszeichen verwendet. Besteht keine Beziehung zwischen der verarbeiteten Datenlänge und dem Erhöhungs-/Verminderungswertes, wird dieser Wert zwischen zwei Plus- oder Minuszeichen gesetzt. Das Syntaxdiagramm ist in Fig. 18 dargestellt. automatisch modifizierte indirekte Adresse --------------------- ---------------- /--->[ effektive Adresse ]--->[ Modifikation ]-, --- | --------------------- ---------------- | --- ->( { )-| |->( } )-> --- | ---------------- --------------------- | --- `--->[ Modifikation ]--->[ effektive Adresse ]-' ---------------- --------------------- Modifikation --- /->( + )-, | --- | /--------| |---------, | | --- | | | `->( - )-' | | --- | | | --------------------| --- ---------- --- |---> |->( + )->[ Zahl ]->( + )-| | --- ---------- --- | | | | --- ---------- --- | `->( - )->[ Zahl ]->( - )-' --- ---------- --- Fig. 18 CALM-Definitionen Seite: 13 EFFEKTIVE ADRESSE Eine Adresse kann vom Prozessor aus Informationen gebildet werden, die direkt oder indirekt aus dem Befehl resultieren. Eine effektive Adresse ist die Summe von verschiedenen Adressen innerhalb desselben Adressraums. Eine Adresse kann in einem gegebenen Unteradressraum liegen und die Addiererlänge kann begrenzt sein. Die Addiererlänge und die Art und Weise, wie errechnete Adressen auf die volle Adresslänge erweitert werden, werden durch fakultative Adressenangaben angegeben (nur bei speziellen Befehlen erforderlich). Die Adresse wird innerhalb der Befehlsausführungszeit gebildet. Die Operationen sind Addition (+), Subtraktion (-) und Multiplikation (*). Der Operator * wird für die automatische Skalierung verwendet, d.h. für die Multiplikation mit 2, 4, usw., je nach der Länge der einzelnen Elemente in einer Tabelle. Runde Klammern gruppieren einzelne Ausdrücke. Werden keine Adressenangaben gemacht, wählt der Assembler den kompaktesten und bezüglich Ausführungszeit günstigsten Befehl. Das rekursive Syntaxdiagramm für effektive Adressen ist in Fig. 19 dargestellt. effektive Adresse ------------------------------ ------------------------------>[ einfache effektive Adresse ]---> | ^ ------------------------------ | --- | |->( $ )-| | --- | | --- | `->( % )-' --- einfache effektive Adresse ------------------- ---------------------------->[ Adressterm ]----------> ^ ------------------- V V | --- --- | ( + )( - ) | --- --- | | | `------------<---------------' Addressterm ---------------- ----------->[ Adressfaktor ]----------------------->--------------> ---------------- | ^ ^ | --- | ---------------- | `->( * )----->[ Adressfaktor ]--' --- ---------------- Adressfaktor ------------------- /->[ direkte Adresse ]-, | ------------------- | | | ------ | ------------------- | ------ ->[f.T.]------->--------------->[indirekte Adresse]------->[f.T.]-> ------ | ^ | | ------------------- | ^ ------ | -------- | | | | | `->[ A.a. ]-' | | ------------------- | | -------- | `->[autom.mod.ind.Ad.]-' | | ------------------- | | | | --- -------------- --- | A.a.: Adressenangabe `->( ( )->[einf.eff.Ad.]->( ) )-' --- -------------- --- Fig. 19 CALM-Definitionen Seite: 14 UNMITTELBARE ADRESSIERUNG Mit der unmittelbaren Adressierung wird die effektive Adresse selbst weiter verwendet. Die unmittelbare Adressierung wird durch das Nummernzeichen (#) vor dem Adressausdruck angegeben und ist nur für Quelloperanden zulässig. Die gleiche Schreibweise wird für arithmetische Werte (ganze Zahlen oder Gleitpunktzahlen) verwendet. Das Syntaxdiagramm einer unmittelbaren Adresse ist in Fig. 20 dargestellt. Ist die Grösse eines arithmetischen Wertes in einem Befehl (z.B. ADD-QUICK-Befehl) begrenzt, so kann eine Daten- oder Adressenangabe verwendet werden. unmittelbare Adresse --- --------------------- -------------------->( # )--->[ effektive Adresse ]---> --- --------------------- Fig. 20 BITADRESSIERUNG Die Byteadresse, wie sie bisher definiert wurde, weist auf Bit 0 des Bytes, d.h. auf das niedrigstwertige Bit (LSB) dieses Bytes. In dem adressierten Byte werden die Bits von 0 bis 7, im nächsten von 8 bis 15, usw., numeriert. Negative Bitnummern sind erlaubt. Im vorangehenden Byte werden die Bits von -8 bis -1 numeriert, wobei -8 das LSB ist. Die Bitadresse ist eine Erweiterung der Byteadresse. Alle Adressierungskombinationen sind erlaubt. Ein Doppelpunkt (:) trennt die Byte- von der Bitadresse. Das Syntaxdiagramm einer Bitadresse ist in Fig. 21 dargestellt. Bitadresse --------------------- /-->[ effektive Adresse ]--, --------------------- --- | --------------------- | --->[ effektive Adresse ]->( : )-| |---> --------------------- --- | --- -------------- | `->( # )->[ Ausdruck ]---' --- -------------- Fig. 21 LISTEN Eine Liste ist eine Auflistung von Registern, Speicherzellen oder Bits. Aufeinanderfolgende Register, Speicherzellen oder Bits können in Gruppen zusammengeschlossen sein. Eine Liste von Registern oder Speicherzellen wird entweder durch Gruppen (das erste und letzte Element, das erste Element und die Länge) oder durch jedes Element einzeln definiert. Ein Vertikalstrich trennt die einzelnen Aufzählungen voneinander. Das Syntaxdiagramm einer Liste von Registern oder Speicherzellen ist in Fig. 22 dargestellt. CALM-Definitionen Seite: 15 Liste von Registern oder Speicherplätzen --- /-------( | )<-----------, | --- | | | V --------------------- | ------------------->[ Listenelement ]-----> --------------------- Listenelement --- --- --------------------- /->( . )->( . )->[ effektive Adresse ]-, | --- --- --------------------- | | | | --------------------- | | /->[ effektive Adresse ]------| --------------------- | --- | --------------------- | ->[ effektive Adresse ]--->( % )-| |-> --------------------- | --- | --- -------------- | | `->( # )->[ Ausdruck ]------| | --- -------------- | | | `------------------->------------------' Fig. 22 Eine Liste von Bits wird entweder durch Gruppen (die erste und die letzte Bitadresse, die erste Bitadresse und die Länge in Bits) oder durch jede Bitadresse einzeln definiert. Der Vertikalstrich trennt die einzelnen Definitionen. Das Syntaxdiagramm einer Liste von Bits ist in Fig. 23 dargestellt. Bitliste --- /-----------( | )<----------, | --- | | | | -------------------- | | /->[ Listenelement ]-, | --------------------- --- V | -------------------- | | --->[ effektive Adresse ]->( : )-----| |----> --------------------- --- | -------------------- | `->[ u. Listenelement ]-' -------------------- unmittelbares Listenelement --- --- --- -------------- /->( . )->( . )->( # )->[ Ausdruck ]-, | --- --- --- -------------- | | | --- -------------- | --- --- -------------- | ->( # )->[ Ausdruck ]--->( % )->( # )->[ Ausdruck ]----------> --- -------------- | --- --- -------------- | | | `-------------------->-----------------' Fig. 23 CALM-Definitionen Seite: 16 BEDINGUNGS- UND ZUSTANDSREGISTERBITS Die Bits in den Bedingungs- und Zustandsregistern (F und S) der Prozessoren werden häufig mit einem Buchstaben benannt. Diese Buchstaben sind keine Adressen, sondern mnemotechnische Buchstaben, die an Operationscodes angehängt werden. Die empfohlenen Buchstaben sind unten angegeben. Eine mögliche Verwechslung mit den Herstellerbezeichnungen sollte vermieden werden. Buchstabe/Funktion Verwendung C Übertrag (Carry) Binäraddierer und Binärverschiebung L Verbindung (Link) nur, falls nie als Übertrag benutzt Z Null (Zero) gesetzt: Ergebnis gleich null N Vorzeichen (Negative) gesetzt: MSB gesetzt (negative Zahl) H Halb-Übertrag (Half Carry) 4 Bit Übertrag (8 Bit Prozessoren) V Überlauf (Overflow) gesetzt: Überlauf (arithm. Zahlen) I Unterbrechung (Interrupt) gesetzt: Unterbrechung aktiv T Ablaufverfolger (Trace) gesetzt: Ablaufverfolgerzustand S Überwachung (Supervisor) gesetzt: Überwachungszustand Beispiele: SETC, CLRC, usw. OPERANDEN Operand ist ein Sammelbegriff für die verschiedenen Möglichkeiten der Adressierung: Effektive Adresse, unmittelbare Adresse, Bitadresse, Liste, arithmetische Zahlen und Gleitpunktzahlen. Die Länge der Daten, die transferiert werden soll, wird durch eine Datenangabe angegeben. Diese wird direkt entweder an den Operationscode oder an den Operanden angehängt. Das Syntaxdiagramm eines Operanden ist in Fig. 24 dargestellt. Operand --------------------- /--->[ effektive Adresse ]------------, | --------------------- | | | | ------------------------ | |-->[ unmittelbare Adresse ]----------| | ------------------------ | | | | ------------------ | |----->[ Bitadresse ]-------------| | ------------------ | ---------------| |---> | ---------- | |---------->[ Listen ]----------------| | ---------- | | | | -------------- | | /--->[ Ausdruck ]----------| | --- | -------------- | `->( # )-| | --- | ------------------------- | `->[ Gleitpunktzahl ]-' ------------------------- Fig. 24 CALM-Definitionen Seite: 17 BEDINGUNGSCODES Die Ausführung eines Befehls kann von einem Bedingungsbit abhängen, das seinerseits von einem Befehl verändert werden kann. Ein Bedingungscode drückt einen Bedingungsbitzustand oder eine Kombination von Bedingungsbitszuständen aus. Die Bedingungscodes sind mnemotechnische Namen, die sich üblicherweise aus zwei Buchstaben zusammensetzen: EQ gleich NE ungleich BC Bit nicht gesetzt (EQ) BS Bit gesetzt (NE) CS Übertrag gesetzt CC Übertrag nicht gesetzt VS Überlauf gesetzt VC Überlauf nicht gesetzt MI Minus, negativ PL Plus, positiv LO kleiner | nach vorzeichenlosem Vergleich LS kleiner oder gleich | HS grösser oder gleich | HI grösser | LT kleiner als | nach arithmetischem Vergleich LE kleiner als oder gleich | GE grösser als oder gleich | GT grösser als | Häufig mit Bedingungen verknüpfte Befehle: JUMP, DJ, CALL, RET und SKIP.