Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Für die Ausführungen in Abschnitt 2.1 sind Vorgriffe auf nachfolgende Abschnitte unvermeidbar. So werden wir z.B. die Beschreibung einiger Befehle zur Darstellung allgemeiner Prozessormerkmale vorziehen. Als Beispiel für die verwendete Befehlsdarstellung sei der MOVE-Befehl angegeben MOVE d,s.

Die Quellangabe s (source) und die Zielangabe d (destination) werden durch die Adressierungsarten näher bestimmt. Bei den 16-Bit-Mikroprozessoren ist – abweichend von der vereinfachten Mikroprozessorstruktur in Kapitel 1 – die kleinste adressierbare Einheit das Byte, d.h. eine vom Prozessor auf den Adreßbus gegebene Speicheradresse ist immer eine Byteadresse. Der Speicher selbst ist aufgrund des 16-Bit-Datenbusses wortweise aufgebaut, d.h. eine Speicherzelle umfaßt 16 Bits. Der Zugriff auf den Speicher erfolgt byte- oder wortweise. Die Wort/Byte-Unterscheidung gibt der Prozessor über eine Steuerleitung vor; sie wird von der Speichereinheit für die Byte- und W ortanwahl ausgewertet.

Programmiermodell

Als Programmiermodell bezeichnet man die Struktur und die Funktion der vom Programm direkt ansprechbaren Prozessorregister. Dies sind der Registerspeicher einschließlich zweier Stackpointerregister, der Befehlszähler und das Statusregister (Bild 2.1).

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Registerspeicher. Der Registerspeicher umfaßt acht allgemeine 16-Bit-Register mit den Bezeichnungen RO bis R7. Sie werden unmittelbar im Adreßteil der Befehle adressiert und können alle in gleicher Weise als Arbeitsregister zur Speicherung von Operanden eingesetzt werden (Akkumulatoren). Die Register dienen außerdem zur Speicherung von Adressen (Adreßregister) und Distanzangaben (Indexregister) zur Adressierung von Speicherzellen (s. Abschnitt 2.1.4).

Stackpointerregister . Die Register R 7 und R 7′ werden von einigen Befehlen sowie bei der Trap- und Interruptbehandlung als Stackpointerregister SPR angesprochen. Ihr Inhalt, der Stackpointer SP, adressiert einen Speicherbereich, der als Stack (Kellerspeicher, Stapelspeicher) organisiert ist. Ein solcher Speicher kann in seiner Zugriffsorganisation mit einem Stapel verglichen werden; Stapelelemente können nur oben aufgelegt bzw. entnommen werden, d.h. in einem Stack werden die nacheinander eintreffenden Daten in aufeinanderfolgenden Speicherplätzen gespeichert und in umgekehrter Reihenfolge wieder gelesen. Der Stackpointer zeigt dabei auf den zuletzt belegten Speicherplatz.

Bei einer Schreiboperation wird zunächst der Stackpointer. weitergesetzt, so daß er auf die erste freie Speicherzelle des Stacks zeigt; danach wird das Datum unter dieser Adresse gespeichert. Bei einer Leseoperation wird zunächst die durch den Stackpointer adressierte Zelle gelesen und danach der Stackpointer zurück gesetzt, so daß er auf den davorliegenden Eintrag zeigt (UFO-Prinzip: last-in first-out). Üblicherweise wird der Stack mit absteigender Adreßzählung gefüllt und mit aufsteigender Adreßzählung geleert.

Die Arbeitsweise des Stacks soll anhand der beiden Stack-Befehle PUSH sund POP d gezeigt werden. PUSH schreibt den Quelloperanden s in den Stack, POP liest den letzten Stackeintrag und schreibt ihn an den Zielort d. Die transportierten Daten haben Wortlänge, das Stackpointerregister wird zur Bildung von Wortadressen jeweils um den Wert 2 verändert (Bild 2.2). Beide Stackpointerregister R 7 und R T haben dieselbe Registeradresse und werden durch die Betriebsarten Normalmodus (R7) und Systemmodus (RT) unterschieden.

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Dementsprechend bezeichnet man die beiden Stackpointer als Normalstackpointer NSP und als Systemstackpointer SSP und die zugehörigen Stacks als Normalstack bzw. als Systemstack. Beide Stacks werden außer von den PUSH- und POP-Befehlen zur Datenspeicherung auch von den Befehlen JSR (jump to subroutine) und RTS (return from subroutine) zur Verwaltung von Programmadressen für den Unterprogrammanschluß benutzt. Der Systemstack wird darüber hinaus zur Statusspeicherung bei der Trap- und Interruptbehandlung verwendet. Mit dem Befehl R TE (return from exception processing) wird der Status wieder gelesen.

Befehlszähler.

Der 16-Bit-Befehlszähler pe enthält die Adresse des jeweils nächsten Befehlswortes. Er wird nach jedem Befehlswortzugriff um 2 erhöht. Ferner kann der Befehlszählerinhalt durch Sprungbefehle verändert werden. Statusregister. Das 16-Bit-Statusregister SR gibt den aktuellen Mikroprozessorzustand nach jeder abgeschlossenen Befehlsausführung und die momentane Betriebsart des Prozessors an. Dazu ist es funktionsmäßig in zwei Bytes, das Userbyte und das Systembyte unterteilt (Bild 2.3).

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Das Userbyte enthält die Zustandsinformation des Prozessors in Form der Bedingungsbits N, Z, V und C (condition code cq, die von der ALU bei der Ausführung bestimmter Befehle beeinflußt werden und damit Aussagen über das Ergebnis arithmetischer und logischer, aber auch anderer Operationen machen. Die Bedingungsbits werden von den bedingten Sprungbefehlen als Sprungbedingungen ausgewertet. Im einzelnen haben sie folgende Funktion:

  • Das Carrybit C (Übertragsbit) zeigt mit C = 1 den Übertrag beim Überschreiten des Zahlenbereichs der Dualzahlen an (s. auch Abschnitt 1.1.1).
  • Das Overflowbit V (Überlaufbit) zeigt mit V = 1 den Überlauf beim Überschreiten des Zahlenbereichs der Zweikomplementzahlen an (s. auch Abschnitt 1.1.1).
  • Das Zero bit Z (Nullbit) zeigt mit Z = 1 an, daß das Resultat einer Operation gleich Null ist.
  • Das Negativebit N (Negativbit) zeigt mit N = 1 an, daß das Resultat einer Operation, wenn es als Zweikomplementzahl betrachtet wird, negativ ist. Das N-Bit wird dementsprechend gleich dem höchstwertigen Bit des Resultats gesetzt.

Die Bedingungsbits CC können durch den Befehl MOVCC (move condition code) auch gezielt verändert werden.

Das Systembyte des Statusregisters beschreibt die Betriebsart des Prozessors in Form von Modusbits (mode bits), die im allgemeinen während der Ausführung eines Programms unverändert bleiben. Sie können nur im Systemmodus verändert werden, entweder durch den privilegierten Befehl MOVSR (move status) oder bei der Trap- und Interruptbehandlung. Die Modusbits haben folgende Funktion:

  • Das System/Normalbit S/N gibt mit S/N =0 die Betriebsart Normalmodus und mit S/N = 1 die übergeordnete Betriebsart Systemmodus vor. Der Systemmodus sieht gegenüber dem Normalmodus erweiterte Verarbeitungsmöglichkeiten vor, wie z.B. das Ausführen privilegierter Befehle.
  • Das Tracebit T führt mit T = 1 (Trace-Modus) nach Abschluß der Befehlsausführung zu einer Programmunterbrechung (Trap) und verzweigt zu einem Trace-Programm. Das Trace-Programm kann Z.B. dazu benutzt werden, den Prozessorstatus anzuzeigen und anschließend das unterbrochene Programm fortzusetzen, das dann nach der nächsten Befehlsausführung wieder unterbrochen wird (Programmtest).
  • Die Interruptmaske 1M2 bis IMO gibt die Prioritätenebene des Prozessors und damit die Priorität des laufenden Programms an. Sie nimmt mit steigendem Maskenwert ab, d.h. die Ebene 0 hat die höchste und die Ebene 7 die niedrigste Priorität. Externe Unterbrechungsanforderungen an speziellen Interruptcode- Eingängen des Mikroprozessors (IL2 bis ILO) können das laufende Programm nur unterbrechen, wenn der Interruptcode (lnterruptebene) der Anforderung eine höhere Priorität hat als die Ebene, in der sich der Prozessor befindet. Eine Ausnahme bildet eine Anforderung in der Ebene 0, der immer stattgegeben wird.

Prozessorstatus.

Der elementare Status des Prozessors wird durch den Befehlszähler und das Statusregister beschrieben. Diese beiden Register enthalten die Mindestinformation, die notwendig ist, um ein Programm, das zwischen zwei Befehlsausführungen unterbrochen wurde, fortsetzen zu können. Diese Information wird bei Programmunterbrechungen durch Traps oder Interrupts automatisch in den Systemstack gespeichert.

Zum vollständigen Status gehören jedoch auch die Inhalte der vom Programm benutzten allgemeinen Prozessorregister. Diese werden nicht automatisch gespeichert und müssen deshalb nach Bedarf vom Unterbrechungsprogramm zwischengespeichert werden. Hierzu gibt es einen speziellen Transportbefehl, den Befehl MOVEM d,R,n (move multiple). Mit ihm werden n aufeinanderfolgende Registerinhalte, beginnend mit dem Inhalt des Registers R, ab der Zieladresse d in aufeinanderfolgende Speicherzellen geschrieben. Die Umkehrung, das Laden des Registerstatus, erfolgt mit dem Befehl MOVEM R,n,s.

Datentypen, Datenformate und Datenzugriff

Datentypen und Datenformate. Als Datentypen bezeichnet man die unterschiedlichen Informationsarten, die auf der Hardwareebene, d.h. durch den Mikroprozessorbefehlssatz, direkt verarbeitet werden können. Sie sind charakterisiert durch eine bestimmte Anzahl von Bits – das Datenformat – und deren Bedeutung. Die gebräuchlichen Datentypen eines 16-Bit-Mikroprozessors, aufgelistet nach den Formaten (Bild 2.4), sind

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

  • Zustandsgröße (1 Bit),
  • binärcodierte Dezimalziffer (1 Halbbyte=4 Bits),
  • Dualzahl, Zweikomplementzahl, logischer Vektor und ASCII-Zeichen (1 Byte = 8 Bits),
  • Dualzahl, Zweikomplementzahl, logischer Vektor und Speicheradresse (1 Wort = 16 Bits, 1 Doppelwort= 32 Bits).

Hinzu kommen die Bytekette (byte string = bis zu n Bytes) und die Wortkette (word string = bis zu n Wörter) mit den oben genannten Datentypen. Datenzugriff. Direkt adressierbar im Sinne eines Speicherzugriffs sind das Byte, das Wort und das Doppelwort. Die Unterscheidung dieser drei Datenformate bei der Adressierung erfolgt im Operationscode. In den Befehlsmnemonen werden Operationen mit Byteoperanden durch den Zusatz B (z.B. MOVEB) und Operationen mit Doppelwortoperanden durch den Zusatz D (z.B. MOVED) bezeichnet. Operationen mit Wortoperanden werden nicht gesondert gekennzeichnet (z.B. MOVE).

Die Unterscheidung zwischen Byte- und Wortzugriff im Speicher erfolgt durch das niedrigstwertige Adreßbit AO und die Wort/Byte-Steuerleitung W(‚B entspre chend Tabelle 2.1. Beim Bytezugriff bleibt das nicht adressierte Byte des Wortes unverändert. Wort- und Doppelwortzugriffe sind, wie in Bild 2.5 dargestellt, jeweils nur an den Wortgrenzen möglich (AO=O).

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Der Bytezugriff im Registerspeicher ist im Gegensatz zum Bytezugriff im Arbeitsspeicher auf das niedrigerwertige Byte beschränkt, da in der Registeradresse kein Unterscheidungsmerkmal für die beiden Registerhälften vorgesehen ist; das höherwertige Byte bleibt dabei unverändert (Bild 2.5). Ein Bytetransport mit dem Speicher oder einer Ein/Ausgabeeinheit erfolgt unabhängig davon über die höher- oder niedrigerwertige Datenbushälfte, je nachdem ob die Speicheradresse gerade (AO = 0) oder ungerade (AO = 1) ist. (Einige Mikroprozessoren, so Z.B. der Z8000, erlauben zusätzlich auch die Adressierung des höherwertigen Registerbytes.) Der Doppelwortzugriff im Registerspeicher ist aus Gründen interner Organisation nur an geraden Wortgrenzen möglich. Die Übertragung eines Doppelwortes auf dem 16-Bit-Datenbus erfolgt durch zwei aufeinanderfolgende Wortübertragungen.

Beispiel 2.1. Drei Programmbeispiele sollen den Wort-, Byte- und Doppelwortzugriffillustrieren: a) Transportiere den Wortoperanden der Speicherzelle LOC nach R1. b) Übertrage die ASCII-Steuerzeichen Carriage-Return CR ($OD) und Line-Feed LF ($OA) in das 8-Bit-Datenregister OUTR einer Ein/Ausgabeeinheit. Das Datenregister sei an die niedrigerwertige Datenbushälfte angeschlossen (ungerade Byteadresse $FF03). c) Transportiere ein Doppelwort, das in den Speicherstellen LOC und LOC + 2 steht, in die Register R2 und R3. LOC muß eine geradzahlige Byteadresse sein; die Registeradresse im MOVED-Befehl muß ebenfalls geradzahlig sein.

Um Konstanten im Byte-, Wort- und Doppelwortformat definieren zu können, sehen wir anstelle der Assembleranweisung DC, die wir in Kapitel 1 benutzt haben, drei Anweisungen DCB, DCW und DCD vor. Eine entsprechende Erweiterung werden wir später auch für die DS-Anweisung vornehmen.

Bitoperanden werden von den bitverarbeitenden Befehlen im Speicher byte- oder wortweise adressiert; der Zugriff auf einzelne Bits erfolgt im Prozessor durch eine Maskenangabe im Befehl. BCD-Ziffern werden paarweise zusammengefaßt, als Bytes adressiert und durch spezielle BCD-Befehle verarbeitet. Im Speicher stehende Byte- und Wortketten werden durch Angabe der Byte- bzw. Wortadressen des ersten oder letzten Elementes der Kette adressiert. Die Anzahl der Bytes bzw. Wörter ist durch eine Längenangabe oder eine Bedingungsabfrage im Befehl festgelegt.

Erweiterter Adreßraum

Mit einer Adreßlänge von 16 Bits entsprechend der Wortlänge des Prozessors ergibt sich ein Adreßraum von 64 K Bytes oder 32 K Wörtern. 16-Bit-Mikroprozessoren in den Standardversionen sehen jedoch einen Adreßraum von mehreren M Bytes vor (M steht für Mega: 1 M = 220), um Systeme mit größerem Speicherbedarf oder Systeme mit vereinfachter Adressierung der Systembuskomponenten realisieren zu können. Dazu benötigen sie längere Adressen und dementsprechend einen breiteren Adreßbus.

Die nächstliegende Lösung ist die Erweiterung der prozessorinternen Adreßdarstellung auf Z.B. 24 Bits, was eine Adressierung von 16 M Bytes erlaubt. Dies hat zur Folge, daß sämtliche Prozessorregister, in denen Adressen gespeichert werden, Z.B. der Befehlszähler und die Register des Registerspeichers, auf eine Länge von 24 Bits erweitert werden müssen. Nachteilig ist dabei, daß z.B. eine Operanden adresse zwei Worte im Befehl belegt und damit beim Lesen des Befehls auch zwei Speicherzugriffe erforderlich sind. Um diesen Nachteil zu mindern, sieht man zusätzlich auch Befehlsformate mit herkömmlichen 16-Bit Adressen vor. Sie ermöglichen eine komprimierte Befehlsdarstellung bei Operandenzugriffen im unteren Adreßbereich. Ein Beispiel für diese Lösung ist der Mikroprozessor MC68000 der Firma Motorola.

Bei diesem Prozessor umfassen die internen Register 32 Bits, wobei die 24 niedrigerwertigen Bits für die Adreßdarstellung belegt werden. Zur Speicheradressierung werden die 23 höherwertigen Adreßbits (Wortadresse A23 bis Al) auf den Adreßbus gegeben; das niedrigstwertige Bit AO (Byteanwahl) wird zusammen mit der Angabe zur Wort/ Byte-Unterscheidung als 2-Bit-Code auf den Steuerbus gegeben. Der Z800lProzessor der Firma Zilog arbeitet ebenfalls mit erweiterter Adreßdarstellung; sein Adreßbus ist für 23-Bit-Byteadressen ausgelegt. Bei der Speicherung von 23-Bit-Adressen im Registerspeicher werden jeweils zwei aufeinanderfolgende 16-Bit-Register belegt.

Eine andere Lösung ist die Verwendung von Basisadreßregistern mit einer Registerlänge von z.B. 20 Bits, wodurch eine Adressierung von 1 M Bytes ermöglicht wird. Sämtliche Programmadressen werden als 16-Bit-Relativadressen dargestellt. Die eigentliche Speicheradresse ergibt sich aus der Addition der Basisadresse und der Relativadresse. Führt man die Basisadresse ebenfalls als 16-BitAdresse und erweitert sie im Prozessor um vier niedrigerwertige Nullbits, so können die Adreßspeicherung und der Adreßtransport einheitlich im 16-BitFormat erfolgen (Bild 2.6). Ein Beispiel für diese Art der Adressierung ist der Mikroprozessor 8086 der Firma Intel. Er besitzt vier 16-Bit-Basisadreßregister mit jeweils vier Nullbits als Erweiterung. Je nachdem, ob Speicherzugriffe auf Programmcode, Daten oder Stackdaten erfolgen, wird automatisch eines der vier Basisregister ausgewählt.

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Befehlsformate und Adressierungsarten

In der vereinfachten Mikroprozessorstruktur in Kapitell wurde die Speicheradresse eines Operanden unmittelbar im Befehlswort angegeben. Reale Mikroprozessoren sehen indessen verschiedene Möglichkeiten der Adreßmodifikation vor. Hierbei wird die Adresse, mit der eine Speicherzelle adressiert wird (effektive Adresse), erst während der Befehlsausführung errechnet (dynamische Adreßrechnung). Dies erlaubt eine wesentliche Leistungssteigerung durch Pro grammierungstechniken, auf die wir in Kapitel 3 näher eingehen werden.

Befehlsformate.

Die verschiedenen Adressierungsarten werden auf der Assemblerebene durch verschiedene Schreibweisen im Adreßfeld gekennzeichnet. Um sie auf der Maschinenebene unterscheiden zu können, müssen wir unser bisheriges Adreßmodifikationsbit RjS zu einem Adreßmodifikationsfeld erweitern. Das so geänderte Standardbefehlsformat für zweistellige Operationen zeigt Bild 2.7. Das erste Befehlswort enthält für die Quell- und Zielangaben sund d je ein 3-Bit-Modifikationsfeld MOD zur Unterscheidung von acht Adressierungsarten und ein 3-Bit-Registeradreßfeld REG zur Adressierung der an der Adreßmodifikation beteiligten allgemeinen Register.

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

In den darauf folgenden Befehlswörtern können ergänzende Angaben für den Operandenzugriff stehen, wie die effektive Adresse selbst (direct address DA), eine Relativadresse (relative address RA) oder der Operand selbst (Direktoperand, immediate operand IM). Durch die Erweiterung der Adreßangaben ist der Operationscode des Standardbefehlsformats auf vier Bits reduziert.

Diese reichen natürlich nicht zur Darstellung des gesamten Befehlssatzes aus. Andererseits benötigt ein großer Teil der Befehle nicht alle im Standardbefehlsformat vorgesehenen Adressierungsmöglichkeiten bzw. nur eine oder gar keine Adreßangabe. Für diese Befehle existieren weitere Befehlsformate, bei denen das Operationscodefeld mehr als vier Bits umfaßt. Adressierungsarten. Die folgende Beschreibung von acht möglichen Adressierungsarten wird durch Abbildungen ergänzt, die die Ermittlung der effektiven Adressen illustrieren. Sie zeigen die Adreßbildung am Beispiel des Datentransports durch MOVE-Befehle.

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Gezeigt ist nur die Modifikation der Quelladresse, während die Zieladresse mit R1 fest bleibt. Die Adressierungsarten können jedoch in gleicher Weise für die Zieladressierung benutzt werden. Eine Ausnahme bildet die Direktoperand-Adressierung, da Direktoperanden nur Datenquellen sein können. Bei der Adressierung von Wörtern und Doppelwörtern ist darauf zu achten, daß die effektive Adresse geradzahlig ist.
In den Abbildungen bezeichnen einfache Pfeile den Transport von Operanden und mit einem Punkt versehene Pfeile die Adressierung von Daten.

  1. Registeradressierung (register addressing R): Die effektive Adresse steht als Registeradresse im REG-Feld; der Operand steht im Registerspeicher. Die Adressierungsart wird in der Assemblerschreibweise durch das Symbol Ri (i = 0 bis 7) bezeichnet, z.B. MOVE R1,R5.
  2. Direkte Adressierung (direct addressing DA): Die effektive Adresse steht im zweiten bzw. dritten Befehlswort; der Operand steht im Speicher. Die Adressierungsart wird durch ein Adreßsymbol oder eine numerische Adresse bezeichnet; z.B. MOVE Rl,LOCl oder MOVE Rl,$A004.
  3. Direktoperand-Adressierung (immediate addressing IM): Der Operand steht im zweiten Befehlswort. Der Direktoperand kann nur Quellgröße sein. Die Adressierungsart wird durch ein Symbol, eine Zahl oder ein Bitmuster mit vorangestelltem # bezeichnet; z.B. MOVE Rl,#325 oder MOVE Rl,#LOC2.
  4. Registerindirekte Adressierung (register indirect addressing RI): Die effektive Adresse steht im Register; der Operand steht im Speicher. Die Adressierungsart wird durch ein in runden Klammern stehendes Registersymbol bezeichnet; z.B.: MOVE Rl,(RO).
    Beispiel 2.2. a) Lade die Speicherzelle LOC mit dem Direktoperanden 325. b) Transportiere den Wortinhalt von LOCl in eine Speicherzelle LOC2, deren Adresse zuvor nach RO geschrieben wurde.
  5. Autoinkrement-Adressierung (autoincrement addressing IN): Die effektive Adresse steht im Register; der Operand steht im Speicher. Die Adresse wird nach dem Speicherzugriff bei Byteadressierung um Eins, bei W ortadressierung um Zwei und bei Doppelwortadressierung um Vier erhöht. Die Adressierungsart wird durch ein Registersymbol in runden Klammern mit nachgestelltem Plus-Zeichen angegeben; z.B. MOVE Rl,(RO) +.
  6. Autodekrement-Adressierung (autodecrement addressing DC): Die effektive Adresse steht im Register; der Operand steht im Speicher. Vor dem Speicherzugriff wird der Registerinhalt bei Byteadressierung um Eins, bei W ortadres sierung um Zwei und bei Doppelwortadressierung um Vier vermindert. Die Adressierungsart wird durch ein Registersymbol in runden Klammern mit vorangestelltem Minus-Zeichen angegeben; Z.B. MOVE R1, – (RO).

Beispiele 2.3. a) Transportiere die Inhalte der aufeinanderfolgenden Speicherzellen LOC1, LOC2 und LOC3 in einen Speicherbereich, dessen erste Zelle mit FELD adressiert wird. b) Ergänze das Programm so, daß die Inhalte des Bereichs FELD anschließend nach R1, R2 und R3 gebracht werden.

7. Indizierte Adressierung (indexed addressing X): Die effektive Adresse wird durch Addition der im zweiten bzw. dritten Befehlswort stehenden 16-BitAdresse und des Inhalts eines Indexregisters (allgemeinen Registers) gebildet. Die 16-Bit-Adresse zeigt auf den Anfang des zu adressierenden Bereichs (Basisadresse), der Index (Inhalt des Indexregisters) wird als positive 16-BitBytedistanz interpretiert. Der Operand steht im Speicher. Die Adressierungsart wird durch ein Adreßsymbol oder eine numerische Adresse mit nachfolgendem, in runden Klammern stehenden Indexregistersymbol (RO bis R 7) bezeichnet; z.B. MOVE R1,FELD(RO).

Beispiel 2.4. Transportiere den Inhalt von LOC in das fünfte Wort eines Datenbreichs FELD. Verwende dazu RO als Indexregister.

8. Relative Adressierung (relative addressing RA): Die effektive Adresse wird durch Addition des Inhalts des Befehlszählers und der im zweiten bzw. dritten Befehlswort stehenden 16-Bit-Bytedistanz (Relativadresse) gebildet. Der Befehlszähler zeigt dabei auf das auf die Relativadresse folgende Befehlswort. Die Relativadresse wird als Zweikomplementzahl interpretiert, wodurch Vorwärts- und Rückwärtsadreßbezüge möglich sind. Der Operand steht im Speicher. Man bezeichnet diese Adressierungsart auch als befehlszählerrelative Adressierung.

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Die relative Adressierung läßt sich durch zusätzliche Indizierung erweitern. Bei der Bildung der effektiven Adresse wird dabei der Inhalt eines im Registeradreßfeld angegebenen Indexregisters zur oben ermittelten effektiven Adresse addiert (gestrichelter Zusatz in der Abbildung). Als Indexregister sind, im Gegensatz zur normalen indizierten Adressierung, nur die Register Rl bis R7 zugelassen; der Wert Null im Registeradreßfeld zeigt an, daß keine Indizierung stattfindet, womit beide Adressierungsarten unterschieden werden.

Die befehlszählerrelative Adressierung von Operanden setzt voraus, daß diese Operanden unmittelbarer Bestandteil eines Programmblocks sind. Solche Operanden sind üblicherweise Konstanten. Neben der Adressierung von Operanden wird die relative Adressierung (ohne Indizierung) vor allem zur Angabe des Sprungziels bei Sprungbefehlen eingesetzt. Hierbei werden je nach Sprungdistanz 16-Bit-Relativadressen (Zweiwortbefehle) oder 8-Bit-Relativadressen (Einwortbefehle) verwendet. Der Vorteil liegt hier in der Möglichkeit, Programmblöcke im Speicher verschieben zu können, ohne die Adreßbezüge innerhalb der Blöcke ändern zu müssen. Dies betrifft auch die relativ adressierten Konstanten. Man spricht von dynamisch verschiebbarem Programmcode (s. dazu die Abschnitte 3.1.3 und 3.1.4).

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Die relative Adressierung und die relative Adressierung mit Indizierung werden vom Assembler automatisch in Programm blöcken verwendet, die mit einer RORG-Anweisung beginnen und bei denen die befehlszählerrelative Adressierung in der RORG-Anweisung als Option angegeben ist. Sie ersetzen hierbei die direkte bzw. die indizierte Adressierung, sofern die verwendeten Adreßsymbole im gleichen Block als verschiebbar definiert wurden. Die relative Adressierung kann auch explizit durch einen positiven oder negativen Wert mit vorangestelltem Asterisk-Zeichen angegeben werden, z.B. BNE * -10.

Hierbei steht * für die Adresse des ersten Befehlswortes des aktuellen Befehls, d.h. die Bezugspunkte für den Programmierer und für den Prozessor sind verschieden. Der Assembler berücksichtigt das bei der Bildung der Relativadresse. Beispiel 2.5. Die Sprungdistanz für den bedingten Sprungbefehl BNE soll so vorgegeben werden, daß bei erfüllter Sprungbedingung der vorangehende Vergleichsbefehl CMPB ausgeführt wird. Der BNE-Befehl umfasse ein, der CMPB-Befehl drei Befehlswörter. Fall a) zeigt die Adressierung des Sprungziels mit dem Wert -6 als Sprungdistanz, bezogen auf das Befehlswort des BNE-Befehls (Rückwärtsadreßbezug).

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Mikroprozessorstruktur: Programmiermodell, Befehlszähler, Prozessorstatus, Datentypen, Datenformate und Datenzugriff

Die vom Assembler daraus ermittelte tatsächliche Sprungdistanz beträgt – 8. Fall b) zeigt die symbolische Adressierung des Sprungziels, die der Assembler ebenfalls in die relative Adressierung mit der Distanz -8 umsetzt. (Andere Adressierungsarten sind bei bedingten Sprungbefehlen nicht vorgesehen.)

Like this post? Please share to your friends:
Schreibe einen Kommentar

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: