Motorola 68000: Adressierungsarten

Motorola 68000: Adressierungsarten

Die Motorola 68000 ist ein eindrucksvoller Mikroprozessor, der eine große Anzahl von Adressierungsarten bietet. Für diejenigen, die mit der x86-Familie vertraut sind, ist es überraschend, in der Assembly-Sprache dieses Mikroprozessors Konstrukte zu finden, die sehr ähnlich sind wie diejenigen, die von Hochsprachen wie Pre- und Postdekremente oder mehrfache bedingte Sprungbefehle bereitgestellt werden.

Der Prozessor bietet 6 verschiedene Adressierungsarten, von denen jede mehrere Versionen hat, insgesamt also 14. Die spezifische Anweisung, die verwendet wird, um die Daten zu manipulieren, kann auch mit verschiedenen Datengrößen arbeiten, aber diese Variationen werden hier nicht berücksichtigt, da sie Merkmale der Anweisung und nicht der Adressierungsart sind.

Die Adressierung bezieht sich auf das Format der effektiven Adresse (ea oder EA in vielen Handbüchern), das die Darstellung des Quell- oder Zielorts einer Anweisung ist. Beachten Sie, dass nicht alle Anweisungen alle 14 Modi unterstützen. Wenn Sie also ea lesen, bedeutet dies, dass wir über Daten sprechen, deren Adresse durch einen oder mehrere dieser Modi dargestellt werden kann.

Die Syntax der movea-Anweisung ist zum Beispiel movea , An, was uns sagt, dass die Quelle eine der 14 möglichen Kombinationen ist, während das Ziel eine der Adressregister a1-a6 ist. Strenge genommen ist die Syntax der Anweisung jedoch movea , , wobei eine der 14 Modi sein kann und nur ein Adressregister (Adressregister-Direktmodus) sein kann.

Die Adressierungsart wird mit drei Feldern der binären Anweisung codiert. Das EA-Modus-Feld, das EA-Register-Feld und die Erweiterungswörter. Die ersten beiden sind 3-Bit-Felder, die im Anweisungswort enthalten sind und die Kombination eindeutig die Adressierungsart und die Nummer des Registers identifiziert, falls dies erforderlich ist. Die Erweiterungswörter sind hingegen Wörter, die dem Anweisungswort im Speicher folgen und normalerweise tatsächliche 8-, 16- oder 32-Bit-Zahlen darstellen.

Vorzeichenverlängerung

Bevor wir die Adressierungsarten des MC68000 diskutieren, ist es sinnvoll, den vom Prozessor verwendeten Vorzeichenverlängerungsmechanismus zu erklären. Manchmal werden Adressierungsarten verwendet, um anstelle eines vollständigen Langworts 8-Bit- oder 16-Bit-Daten zu verwenden, z. B. um eine Konstante bereitzustellen, die einem Register hinzugefügt wird, bevor sein Wert verwendet wird. Berechnungen innerhalb des Mikroprozessors werden jedoch immer mit 32-Bit-Zahlen durchgeführt, daher werden solche Werte auf ein Long-Wort verlängert.

Es gibt zwei Möglichkeiten, ein Byte/Wort auf ein Long-Wort zu erweitern. Eine Möglichkeit besteht darin, links mit Nullen aufzufüllen (ungezeichnete Verlängerung), und die andere besteht darin, das Vorzeichen zu erhalten (signierte Verlängerung). Dies ändert positive Zahlen nicht, sondern betrifft negative Zahlen. Betrachten wir zum Beispiel eine 8-Bit-negative Zahl wie -126, die durch 10000010 in 8-Bit-Zweierkomplement dargestellt wird, 0x82 in hexadezimal. Eine 32-Bit-signierte Erweiterung dieser Zahl ergibt 0xffffff82, was immer noch -126 im 32-Bit-Zweierkomplement ist, aber eine nicht signierte Verlängerung würde 0x00000082 ergeben, was 130 ist.

Während der MC68000 sowohl Adress- als auch Datenregister zur allgemeinen Datenspeicherung verwenden kann, sind die beiden Kategorien dazu gedacht, Daten unterschiedlicher Art zu verwalten. Insbesondere erweitern Datenregister niemals Bytes oder Worte mit Vorzeichen, da dies die reine Darstellung dieser Bitsequenz ändert und zusätzliche Bits hinzufügt, um das Vorzeichen beizubehalten. Adressen hingegen sollten ihren Wert niemals ändern, daher erweitern Adressregister eingehende Werte, um die tatsächliche Adresse oder Verschiebung, die durch die Bits dargestellt wird, beizubehalten.

Adressierungsarten

Direkte Registrierung

Dies ist die einfachste Adressierungsart, da Daten in einem der Mikroprozessorregister gelesen oder geschrieben werden. Es gibt zwei Versionen davon, eine für Datenregister und eine für Adressregister.

LESEN  Warum Employer Branding wichtig ist: Schaffe Wettbewerbsvorteile bei der Personaleinstellung

Direkte Datenregister

  • Assembly-Syntax: Dn
  • EA-Modus-Feld: 000
  • EA-Register-Feld: Registernummer
  • Erweiterungswörter: 0

Diese Adressierungsart adressiert die Daten, die in einem der Datenregister d0-d7 enthalten sind. Das EA-Modus-Feld ist 000 und das EA-Register-Feld enthält die Nummer des Registers. Die offizielle Dokumentation verwendet die Syntax Dn, um diese Adressierungsart zu identifizieren. Es werden keine Erweiterungswörter verwendet.

Adressregister-Direktmodus

  • Assembly-Syntax: An
  • EA-Modus-Feld: 001
  • EA-Register-Feld: Registernummer
  • Erweiterungswörter: 0

Diese Adressierungsart identifiziert die Daten, die in einem der Adressregister a0-a6 enthalten sind. Das EA-Modus-Feld ist 001 und das EA-Register-Feld ist die Nummer des Registers, während die offizielle Syntax dafür An ist. Es werden keine Erweiterungswörter verwendet.

Indirekte Registrierung

Wie der Name dieser Adressierungsart vermuten lässt, wird die Adressierung unter Verwendung eines Registers durchgeführt, aber die Daten werden indirekt abgerufen. Das Register enthält nicht die Daten, die wir verwenden möchten, sondern die Adresse im Speicher der Daten. Dies ist das, was Hochsprachen wie C als Speicherzeiger bezeichnen.

Adressregister indirekt

  • Assembly-Syntax: (An)
  • EA-Modus-Feld: 010
  • EA-Register-Feld: Registernummer
  • Erweiterungswörter: 0

Die einfachste Form des indirekten Zugriffs besteht darin, dass die Adresse der Daten in einem der Adressregister a0-a6 gespeichert ist. Die Syntax für diese Adressierungsart ist (An), während die binäre Form das EA-Modus-Feld auf 010 setzt und das EA-Register-Feld die Nummer des verwendeten Adressregisters darstellt. Es werden keine Erweiterungswörter verwendet.

Das folgende Beispiel vergleicht die Zahl 0x1111 mit dem Inhalt der Speicherzelle, deren Adresse in a1 enthalten ist.

Adressregister indirekt mit Postinkrement

  • Assembly-Syntax: (An)+
  • EA-Modus-Feld: 011
  • EA-Register-Feld: Registernummer
  • Erweiterungswörter: 0

Diese Adressierungsart ist eine weitere der Konstrukte der Hochsprachen, die der MC68000 direkt in seiner Assemblersprache bereitstellt. Diese Art funktioniert genauso wie die Adressregister indirekt, aber nachdem die Daten aus dem Speicher abgerufen wurden, wird das Adressregister um die Größe der Daten selbst erhöht. Diese Adressierungsart eignet sich daher perfekt für Algorithmen, die aufeinanderfolgende Arrays aus dem Speicher lesen müssen, da keine Anweisungen hinzugefügt werden müssen, die den Zeiger inkrementieren.

Die Standard-Syntax lautet (An)+ und für diese Art beträgt das EA-Modus-Feld 011, während das EA-Register-Feld die Registernummer enthält. Es werden keine Erweiterungswörter verwendet.

Diese und die folgende Adressierungsart sind sehr mächtig, da sie automatisch die Größe der gelesenen Daten zur Adresse hinzufügen, also 1 für ein Byte, 2 für ein Wort und 4 für ein Langwort. Die einzige Ausnahme von dieser Regel ist, wenn das Register a7 ist, das ein Alias für sp, den System-Stack-Zeiger, ist. In diesem Fall wird der Zeiger immer auf eine Wortgrenze ausgerichtet, sodass die Erhöhung auch für ein Byte 2 beträgt.

Adressregister indirekt mit Prädekrement

  • Assembly-Syntax: -(An)
  • EA-Modus-Feld: 100
  • EA-Register-Feld: Registernummer
  • Erweiterungswörter: 0

Dies ist die Spiegelversion der vorherigen Adressierungsart, bei der das Adressregister, das auf die Daten zeigt, vor der Adressierung dekrementiert wird. Die standardmäßige Syntax lautet -(An); das EA-Modus-Feld ist 100 und das EA-Register-Feld enthält die Registernummer. Es werden keine Erweiterungswörter verwendet.

Adressregister indirekt mit Versatz

  • Assembly-Syntax: (d16,An) / d16(An)
  • EA-Modus-Feld: 101
  • EA-Register-Feld: Registernummer
  • Erweiterungswörter: 1

Die natürliche Weiterentwicklung der beiden vorherigen Adressierungsarten besteht darin, einen beliebigen Offset zu verwenden, der zur im Register enthaltenen Basisadresse hinzugefügt wird. Die Standard-Syntax für diese Adressierungsart ist (d16,An) oder d16(An), wobei d16 eine 16-Bit-ganze Zahl ist. Beispielweise ist 0xf(a1) die in dem Speicher enthaltene Daten an der Adresse a1 + 0xf. Das EA-Modus-Feld ist 101 und das EA-Register-Feld ist die Nummer des verwendeten Adressregisters. Diese Adressierungsart erfordert 1 Erweiterungswort, das die 16-Bit-Versetzung enthält.

Bitte beachten Sie, dass die Versetzung auf 16 Bit festgelegt ist und ihr Wert im Bereich (-32768, 32767) begrenzt ist. Die Versetzung wird jedoch auf 32 Bit verlängert, bevor sie zur Basisadresse addiert wird.

LESEN  Welches Content-Management-System verwendet wird? Diese Tools zeigen es

Anmerkung: Diese Adressierungsart wird manchmal als “Register Indirekt mit Offset” bezeichnet.

Adressregister indirekt mit Index

  • Assembly-Syntax: (d8,Dn,An)
  • EA-Modus-Feld: 110
  • EA-Register-Feld: Registernummer
  • Erweiterungswörter: 1

Neben einer Adressierungsart, die Schleifen im C-Stil nachahmt, und einer Möglichkeit, auf Arrays mit einem 16-Bit-Versatz zuzugreifen, bietet der MC68000 einen doppelt indizierten Array-Zugriff mit dieser Adressierungsart. Die in einem der Adressregister a0-a6 enthaltene Basisadresse wird zur Inhalte eines 16/32-Bit-Registers und eines 8-Bit-Index hinzugefügt. Diese Adressierungsart erfordert 1 Erweiterungswort, das den 8-Bit-Index enthält; nur die 8 least significant Bits des Erweiterungsworts werden beibehalten und vor jeder Berechnung auf 32 Bits erweitert.

Für diese Adressierungsart beträgt das EA-Modus-Feld 110 und das EA-Register-Feld enthält die Nummer des verwendeten Adressregisters. Die in den Handbüchern verwendete Standard-Syntax ist (d8, An, Dn.SIZE), wobei SIZE entweder w oder l sein kann. Diese Adressierungsart kann einen unschätzbaren Zugriff auf zweidimensionale Arrays bieten und zeigt einmal mehr die Leistungsfähigkeit dieses Mikroprozessors.

Anmerkung: Diese Adressierungsart wird manchmal als “Indexierter Registerindirekt mit Offset” bezeichnet.

Absolute Daten

Diese Modi bieten eine Version der Adressregister indirekt-Modi, bei denen die Adresse direkt in der Anweisung und nicht über ein Register angegeben wird.

Absolute kurze Daten

  • Assembly-Syntax:
    .w
  • EA-Modus-Feld: 111
  • EA-Register-Feld: 000
  • Erweiterungswörter: 1

Diese Adressierungsart gibt die Adresse der Daten im Speicher über eine 16-Bit-Direktoperand in dem Erweiterungswort direkt in der Anweisung an. Die Standard-Syntax ist

.w, während das EA-Modus- und das EA-Register-Feld jeweils 111 und 000 sind. Da die Adresse ein vorzeichenbehaftetes Wort ist, können nur die ersten oder die letzten 32 KiB des Speichers adressiert werden (verwenden Sie positive bzw. negative Adressen).

Absolute lange Daten

  • Assembly-Syntax:
    .l
  • EA-Modus-Feld: 111
  • EA-Register-Feld: 001
  • Erweiterungswörter: 2

Dies ist die 32-Bit-Version des vorherigen Modus, wobei das EA-Modus-Feld und das EA-Register-Feld jeweils 111 und 001 sind. Die Standard-Syntax ist .l, und sie erfordert zwei Erweiterungswörter. Wie immer bei der MC68000 werden Long-Wörter in Big-Endian-Reihenfolge angegeben, wobei das erste Wort den höherwertigen Teil der Adresse darstellt und das zweite Wort den weniger signifikanten Teil.

Es ist erwähnenswert, dass dieser Modus die Beschränkung des vorherigen Modus aufhebt und den vollen 16-MiB-Adressraum zugänglich macht. Es erfordert jedoch mehr Speicherplatz, da zwei Erweiterungswörter und 4 zusätzliche CPU-Zyklen benötigt werden, um ausgeführt zu werden.

Program Counther-Relativ

Die auf den Program Counter (PC) bezogenen Adressierungsarten sind der grundlegende Baustein für umplatzierbare Programme, da die effektive Adresse als Verschiebung von der Adresse der gerade ausgeführten Anweisung berechnet wird. Genauer gesagt ist die Basisadresse die des Erweiterungsworts, wie später in diesem Artikel detailliert erläutert wird.

Bitte beachten Sie, dass effektive Adressen, die mit dem Program Counter relativ sind, nur zum Lesen aus dem Speicher verwendet werden können.

Program Counter relativ mit Versatz

  • Assembly-Syntax: (d16,PC) oder d16(PC)
  • EA-Modus-Feld: 111
  • EA-Register-Feld: 010
  • Erweiterungswörter: 1

Diese Art ist der Adressregister indirekt mit Versatz sehr ähnlich, da beide einen 16-Bit-Offset verwenden, der zu einer Basisadresse hinzugefügt wird. In diesem Fall stellt jedoch letzterer den PC anstelle eines allgemeinen Registers zur Verfügung. Das EA-Modus-Feld ist 111 und das EA-Register-Feld ist 010. Ein Erweiterungswort wird benötigt, um die signierten 16-Bit-Versetzung bereitzustellen, die vor jeder anderen Berechnung auf 32 Bit erweitert wird.

Anmerkung: Diese Adressierungsart wird manchmal als “Program Counter Relative mit Offset” bezeichnet.

Program Counter relativ mit Index

  • Assembly-Syntax: (d8,Dn,PC)
  • EA-Modus-Feld: 111
  • EA-Register-Feld: 011
  • Erweiterungswörter: 1

Dies ist die Program Counter-Version von Adressregister indirekt mit Index. Das EA-Modus-Feld ist 111 und das EA-Register-Feld ist 011. Es wird ein Erweiterungswort benötigt, um die signierten 8-Bit-Versetzung bereitzustellen, die zuvor auf 32 Bit erweitert wird.

LESEN  Unterschiede zwischen Wertschätzung, Anerkennung und Lob

Anmerkung: Diese Adressierungsart wird manchmal als “Program Counter Relative mit Index und Versatz” bezeichnet.

Direkte Daten

Direkte Datenverarbeitung ist eine Art, bei der wir das unmittelbare Datenwort direkt in die Anweisung schreiben, anstatt auf den Speicher zu verweisen.

  • Assembly-Syntax: #
  • EA-Modus-Feld: 111
  • EA-Register-Feld: 100
  • Erweiterungswörter: 1,2

Unmittelbare Daten verwenden das im Erweiterungswort angegebene reine Datenwort anstelle des Systemspeichers. In diesem Modus können Sie eine Konstante beliebiger Länge (Byte, Wort, Long) angeben. Das EA-Modus- und das EA-Register-Feld sind jeweils 111 und 100, und die Anzahl der Erweiterungswörter beträgt entweder 1 (Byte und Wort) oder 2 (Long). Beachten Sie, dass der 68000 Daten nur erweitert, wenn das Ziel ein Adressregister ist, wenn jedoch ein Datenregister verwendet wird, wird es unverändert gelassen. Die Standard-Syntax für diese Adressierungsart lautet #.

Schnelle Konstante

Diese Adressierungsart steht nur für einen Satz von 3 Anweisungen zur Verfügung, nämlich addq, subq und moveq. Für die ersten beiden Anweisungen ermöglicht es, einen Wert zwischen 1 und 8 (3 Bits) anzugeben, während die dritte Anweisung mit einem vollen vorzeichenbehafteten Byte interagieren kann, wobei ein Wert zwischen -128 und 127 verwendet wird. Der Begriff “schnell” kommt daher, dass die Anweisungen Bits ihrer eigenen binären Darstellung verwenden, um die Daten zu speichern und somit keine Erweiterungswörter benötigt werden. Wie bei der einfachen Datenverarbeitung lautet das EA-Modus-Feld 111 und das EA-Register-Feld 100.

Implizit

Dies ist eine weitere Art, die nur für bestimmte Anweisungen verfügbar ist. Diese sind an bestimmte Register gebunden und ermöglichen daher keine Verwendung einer allgemeinen effektiven Adresse. Die in dieser Adressierungsart verwendeten Register sind nur SP, PC, SP, SSP, SR und USP.

Tabelle der Adressierungsarten

Die folgende Tabelle gibt einen Überblick über alle Adressierungsarten. Für jede von ihnen werden der Name, die standardmäßige Assembly-Syntax, der Wert des EA-Modus-Felds, der Wert des EA-Register-Felds und die Anzahl der benötigten Erweiterungswörter angezeigt.

Name Syntax EA-Modus EA-Register Erweiterungswörter
Direkte Datenregister Dn 000 Registernummer 0
Adressregister Direct Mode An 001 Registernummer 0
Adressregister indirekt (An) 010 Registernummer 0
Adressregister indirekt mit Postinkrement (An)+ 011 Registernummer 0
Adressregister indirekt mit Prädekrement -(An) 100 Registernummer 0
Adressregister indirekt mit Versatz (d16,An) oder d16(An) 101 Registernummer 1
Adressregister indirekt mit Index (d8,Dn,An) 110 Registernummer 1
Absolute kurze Daten
.w
111 000 1
Absolute lange Daten
.l
111 001 2
Program Counter relativ mit Versatz (d16,PC) oder d16(PC) 111 010 1
Program Counter relativ mit Index (d8,Dn,PC) 111 011 1
Unmittelbare Daten # 111 100 1,2

Beispiele

Betrachten wir einige Beispiele für tatsächlichen MC68000-Code, der effektive Adressierungsarten verwendet.

Beispiel 1

Diese Anweisung verwendet den Adressregister Direct Mode, um auf das Register d0 zuzugreifen. Das Format der andi-Anweisung ist wie folgt:

andi <ea>,#<data>

Im obigen Beispiel wird der Mikroprozessor also nach zwei Erweiterungswörtern (Long) Ausschau halten, die die direkten Daten enthalten, die vor dem Zugriff auf das Register hinzugefügt werden. Das Register wird ausgewählt, da das EA-Modus-Feld 000 ist und das EA-Register-Feld die Registernummer auswählt. Die beiden folgenden Erweiterungswörter sind 0003 und ffff, sodass die Zahl 0x3ffff zum Register hinzugefügt wird.

Beispiel 2

Die movea-Anweisung verschiebt Daten in ein Adressregister, verwendet in diesem Fall jedoch den Adressregister Indirect Mode, um die Quelle anzugeben. Das Format der movea-Anweisung ist:

movea <ea>,An

Daher wird im obigen Beispiel der hexadezimale Code 2052 zu:

movea 2052(a1),a2

Beispiel 3

Diese move-Anweisung legt ein Wort mit dem Wert 0x200 an eine Adresse, die 0x100 über der Adresse liegt, auf die a4 zeigt. Es verwendet Immediate Data für die Quelle und Address Register Indirect with Displacement für das Ziel. Das Format der move-Anweisung ist:

move <ea>,<ea>

(Bitte beachten Sie, dass Register und Modus im Zielteil vertauscht sind)

In diesem Fall haben wir:

move #0x200,0x100(a4)

Es ist interessant festzustellen, dass das Wort für die Quelle mit Immediate Data angegeben wird und tatsächlich direkt nach der Anweisung (0x0200) steht, gefolgt von der 16-Bit-Versetzung für Address Register Indirect with Displacement (0x0100).