2.3 Programmiermodell des 68000 Aus Sicht des Programmierers besteht der Prozessor aus Registersatz Befehlssatz Adressierungsarten Registersatz des 68000 8 universelle Datenregister (32 Bit) D0 D7 8 Adress-Register (32 Bit) A0 A7 A7 ist der Stackpointer Statusregister (16 Bit), bestehend aus Controlregister und Condition Code Register ProgramCounter (32-Bit) PC Auf die Datenregister kann Byteweise (Bit 0- Bit7), Wortweise (Bit0 Bit 15) und als Langwort (Bit 0 Bit 31) zugegriffen werden. Auf Adress-Register wird wortweise oder Langwortweise zugegriffen. MCT 2-33
Folie Register MCT 2-34
Befehlsatz des 68000 1/2 Arithmetische Operationen mit ganzen Zahlen Logische Befehle Mnemonik Befehlsbedeutung Mnemonik Befehlsbedeutung ADD ADDA ADDI ADDQ ADDX CLR CMP CMPA CMPI CMPM DIVS DIVU EXT MULS MULU NEG NEGX SUB SUBA SUBI SUBA SUBX TST BCD-Befehle ABCD NBCD SBCD Binäre Addition Binäre Addition von Adressen Addition einer Konstanten Schnelle Addition einer Konstanten Addition mit Extendbit (Übertrag) Löschen eines Operanden Vergleichen zweier Operanden Vergleichen zweier Adressen Vergleichen mit einer Konstanten Vergleichen zweier operanden Division mit Vorzeichen Division ohne Vorzeichen Vorzeichenrichtige Erweiterung Multiplikation mit Vorzeichen Multiplikation ohne Vorzeichen Negation eines Operanden (2er Komplt) Negation eines Operanden mit Extendbit Binäre Subtraktion Binäre Subtraktion von Adressen Subtraktion einer Konstanten Schnelle Subtraktion einer Konstanten Subtraktion mit Extendbit (Borgen) Testen eines Operanden gegen Null Addition zweier BCD-Zahlen Negation einer BCD-Zahl Subtraktion zweier BCD-Zahlen AND Logisches UND ANDI Logisches UND mit einer Konstanten EOR Exklusiv-ODER EORI Exklusiv-ODER mit einer Konstanten NOT Einer-Komplement (Invertieren) OR Logisches ODER ORI Logisches ODER mit einer Konstanten TAS Prüfe und setze ein bestimmtes Bit Schiebe- und Rotiere-Befehle ASL Arithmetische Verschiebung links ASR Arithmetische Verschiebung rechts LSL Logische Verschiebung links LSR Logische Verschiebung rechts ROL Rotation nach links ROR Rotation nach rechts ROXL Rotation mit Extendbit nach links ROXR Rotation mit Extendbit nach rechts Bitmanipulationsbefehle BCHG Verändere ein bestimmtes Bit BCLR Lösche ein bestimmtes Bit BSET Setze ein bestimmtes Bit BTST Prüfe ein bestimmtes Bit MCT 2-35
Befehlsatz des 68000 2/2 Datenübertragungsbefehle Steuer- und Verzweigungsbefehle Mnemonik Befehlsbedeutung Mnemonik Befehlsbedeutung EXG Austauschen von Registerinhalten LEA Lade eine effektive Adresse LINK Baue Stackbereich auf MOVE Übertrage ein Datum MOVE fr SR Übertrage den Inhalt des Statusregisters MOVE to CCR Lade die Flags MOVE to SR Lade das Statusregister MOVE USP Lade den User Stack Pointer MOVEA Übertrage eine Adresse MOVEM Übertrage mehrere Register MOVEP Übertrage Daten von und zur Peripherie MOVEQ Übertrage schnell eine Konstante PEA Lege eine Adresse auf den Stack ab SWAP Vertausche zwei Registerhälften UNLK Baue Stackbereich ab Bcc Verzweige bedingt BRA Verzweige unbedingt BSR Verzweige in ein Unterprogramm (relativ) CHK Prüfe ein Datenregister gegen Grenzen DBcc Prüfe Bedingung. dekrementiere und verzweige JMP Springe an absolute Adresse JSR Springe an ein Unterprogramm NOP Keine Operation RESET Rücksetzen der Peripherie RTE Rückkehr von einer Exception RTR Rückkehr mit Laden der Flags RTS Rückkehr aus einem Unterprogramm Scc Setze ein Byte abhängig von einer Bedingung STOP Halte in der Verarbeitung an TRAP Gehe in eine Exception (Softwareinterrupt) TRAPV Prüfe, ob Flag gesetzt, evtl. Exception MCT 2-36
Adressierungsarten Die Art und Weise, wie auf die Operanden eines Befehls zugegriffen wird, bezeichnet man als Adressierungsarten. Die Kombinationsmöglichkeiten von Befehlen und Adressierungsarten bestimmt, wie einfach oder kompliziert ein Prozessor zu programmieren ist. Orthogonaler Befehlsatz Im Idealfall kann jede Adressierungsart für jeden Befehl angewendet werden. Eine solche Kombinationsmöglichkeit wird als orthogonaler Befehlsatz bezeichnet. MCT 2-37
Adressierungsarten des 68000 unmittelbare Adressierung (immediate) Bei dieser Adressierungsart ist der Operand eine Konstante, die direkt hinter dem OpCode im steht. MOVE.W #123,D1 Lade D1 mit 123 OpCode Operand Befehl Beispiel: MOVE #123, D1 Eine Konstante kann nur als Quelloperand auftreten, nie als Ergebnis einer Rechenoperation. Häufig wird diese Adressierung verwendet, um Register des Prozessors mit Startwerten oder Adressen vorzubelegen. In Assemblerschreibweise wird der Konstanten beim 68000 das Zeichen # vorangestellt. MCT 2-38
absolute Adressierung (direct, absolute) Die effektive Adresse des Operanden befindet sich als absolute Adresse direkt im Anschluß an den Opcode im. In der Assemblersyntax (68000) steht die Adresse ohne spezielle Kennzeichnung als Zahlenwert direkt hinter dem Opcode. OpCode $10000 Beispiel: MOVE $10000, D1 $10000 Operand MCT 2-39
Registeradressierung (register direct) Der Operand steht in einem der Prozessorregister. Die Adresse steht als kurze Registeradresse im OpCode. Als Register können universelle Register wie z.b. Datenregister oder Adreßregister, aber auch spezielle Register wie Stackpointer, Statusregister usw. angesprochen werden. Register OpCode D1 Beispiel: CLR D1 CLR D1 Lösche D1 MCT 2-40
Adressierungsarten, die auf Adressregister basieren: Registerindirekte Adressierung (register indirect) Die effektive Adresse steht in einem Register, üblicherweise in einem Adreßregister, der Operand steht im. Diese Adressierungsart hat gegenüber der absoluten Adressierung den Vorteil, daß beim Holen des Befehls die Operandenadresse nicht gelesen werden muß. Sie wird eingesetzt, wenn innerhalb eines Programmteils häufig auf dieselbe Operandenadresse zugegriffen wird. In Assemblersyntax wird der Name des zur Adressierung verwendeten Registers in Klammern geschrieben. MOVE D1,(A1) Lade die stelle, mit der Adresse in A1 mit D1. Register OpCode A1 Operand Beispiel: MOVE D1, (A1) MCT 2-41
Registerindirekte Adressierung mit Postinkrement Bei der Adressierung wird der Inhalt des verwendeten Adressregisters verändert. Beim Postinkrement wird nach der Verwendung der Adresse der Inhalt des Registers inkrementiert, wobei das Inkrement abhängig von der Datenbreite des adressierten Operanden die Werte 1, 2 oder 4 annehmen kann. Diese Anpassung der Schrittweite nennt man Skalierung, da das Inkrement mit dem skalaren Faktor 1,2 oder 4 multipliziert wird. Wird zum Beispiel mit dem Befehl MOVE.B D1, (A1)+ ein Byte vom Datenregister D1 in den kopiert, so wird A1 anschließend um den Wert 1 erhöht. Wird mit MOVE.L D1, (A1)+ ein Langwort, also 4 Byte kopiert, so wird A1 entsprechend um den Wert 4 inkrementiert. Nach der Befehlausführung zeigt daher das Adreßregister immer auf das nächste Datenwort im. Register Berechnung OpCode A1 + Skalierung 1, 2 oder 4 Operand Beispiel: MOVE D1, (A1)+ Diese Adressierungsart eignet sich für die Bearbeitung von Datenfeldern in einer Schleife, wie das folgende Beispiel zeigt. Soll das Feld nicht byteweise, sondern wortweise mit 1 belegt werden, so muß nur move.b durch move.w ersetzt werden, die Adreßberechnung passt sich automatisch an. MCT 2-42
Beispiel zur Verwendung der Adressierung mit Postinkrement Im folgenden Programmausschnitt werden die Elemente eines Feldes mit dem ; Wert 1 vorbelegt. FELDANF equ 10000 ; Startadresse des Feldes FELDEND equ FELDANF+100 ; Endadresse des Feldes move.l #FELDANF,A1 ; Startadresse ins Register A1 LOOP move.b #1, (A1)+ ; 1 in das akt. Feldelement cmp.l FELDEND, A1 ; Vergleich auf Feldende ble LOOP ; Verzweigung zu LOOP, falls ; Feldende noch nicht erreicht ist MCT 2-43
Registerindirekte Adressierung mit Prädekrement Das Gegenstück zum Postinkrement ist die Adressierung mit Prädekrement. Hierbei wird vor dem zugriff der Inhalt des Adressregisters dekrementiert. Diese Adressierungsart wird durch ein Minuszeichen vor dem Adreßregister symbolisiert. Wird als Adreßregister der Stackpointer verwendet, so ersetzen diese beiden Adressierungsarten die Befehle PUSH und POP zur Stackverwaltung Register Berechnung OpCode A1 - Skalierung 1, 2 oder 4 Operand Beispiel: MOVE D1, -(A1) MCT 2-44
Registerindirekte Adressierung mit Displacement Bei der Adressierung mit Displacement wird die effektive Adresse aus dem Inhalt eines Adreßregisters und einer konstanten Adreßdistanz (Displacement) berechnet. Das Displacement ist vorzeichenbehaftet (2er-Komplement) und erlaubt so eine positive und negative Adreßdistanz zur Basisadresse im Adreßregister. Diese Methode wird beim Zugriff auf Daten verwendet, die in einer festen Struktur im vorliegen. In der Assemblersyntax steht das Displacement als eine Zahl vor dem Adressregister. Register Berechnung OpCode Displacement A1 + Operand Beispiel: MOVE D1, $20(A1) MCT 2-45
Indizierte Adressierung mit Displacement Wird neben einer Konstanten noch eine variable Adreßdistanz benötigt, die erst zur Laufzeit eines Programms feststeht, so wird die indizierte Adressierung verwendet. Die effektive Adresse wird hier aus der Basisadresse in einem Adreßregister, einem konstanten und einem variablen Adreßversatz aus einem weiteren Register berechnet Register Berechnung OpCode Displacement A1 D0 + Operand + Beispiel: MOVE D1, $5(A1,D0) MCT 2-46
PC-relative Adressierung Eine interessante Variante ist die Verwendung des Befehlszählers (program counter) als Adreßregisters. Die effektive Adresse wird hier immer mit Bezug zum aktuellen Befehlszähler gebildet, d.h. alle Adressen werden nur mehr als relativer Adreßabstand zum Befehlszähler abgespeichert. Die befehlszählerrelative Adressierung ermöglicht es, ein übersetztes Programm mitsamt Daten und Konstanten im zu verschieben. Der Befehlszähler darf dabei natürlich nicht verändert werden, da sonst das Programm nicht mehr korrekt ablaufen würde. Von den bisher vorgestellten Methoden eignen sich daher nur die indizierte Adressierung oder die Adressierung mit Displacement zur PC-relativen Adressierung. Die Assemblersyntax verwendet die bereits besprochene Schreibweise, statt einem Adreßregister steht in Klammern das Symbol PC für ProgramCounter. (PC) disp Move $10(PC), D1 Beispiel: MOVE $10(PC), D1 Operand MCT 2-47
Mikrocomputertechnik 2.Mikroprozessor MCT 2-48