Musterlösung 6 Mikroprozessor & Eingebettete Systeme 1 WS2015/2016 Hinweis: Die folgenden Aufgaben erheben nicht den Anspruch, eine tiefergehende Kenntnis zu vermitteln; sie sollen lediglich den Einstieg in weiterführende Literatur erleichtern. Thema: Mikroprozessor MC6809 – Registersätze, Stapel und Adressierungsarten Übungsblatt Nr.: 6 Datum: 15.12.15 1 Aufgabe 1 1.1 Nennen Sie alle Register des Mikroprozessors 6809. Lösung: Akkumulator: A (8), B(8) - D(16) Index Register: X (16) und Y (16) Stack Register: S (16)- System Stack und U (16)- User Stack PC (16) – Programmzähler DP (8) – Direkt Page Register CCR (8) – Condition Code Register (Flag Register) 1.2 Nennen und erklären Sie die Statusregister-Bits (CCR-Bits) des Mikroprozessors 6809. Lösung: E F H I N Z V C E-Entire, F-FIRQ, H-Half carry, I- Interrupt, N-Negativ, Z-Zero, V-Overflow (Überlauf) ,C-Carry Das Zero-Flag (Nullbit) wird gesetzt, wenn das Ergebnis der letzten Operation leich Null war. Dies ist wichtig zur Programmierung von Schleifen. Man dekrementiert einen Schleifenzähler und verlässt die Schleife über einen bedingten Sprungbefehl, sobald der Schleifenzähler Null ist. 2 Aufgabe 2 Die folgenden Befehle werden unabhängig voneinander ausgeführt. Nach welcher Befehlsausführung ist das Zero-Flag gesetzt? Lösung: a) LDA #01 DECA ; Z=1 b) LDA #h'FF ADDA #1 ; Z=1 c) LDA #00 CMPA #00 ; Z=1 d) LDA #h'FF COMA ; Z=1 e) LDA #h’FF NEGA ; Z=0 f) LDA #h’F0 ANDA #h’0F ; Z=1 g) LDA #04 TFR A,CCR ; Z=1 h) CLRA ; Z=1 Aufgabe 3 Die folgenden Befehle werden unabhängig voneinander ausgeführt. Nach welcher Befehlsausführung ist das Carry-Flag gesetzt? Lösung: a) LDA #h’F0 ADDA #14 ;C=0, A=h’FE b) LDA #h’F0 ADDA #h’33 ; C=1 c) LDA #h’F0 SUBA #h’F0 ; C=0 d) LDA #h’FF NEGA ; C=0 3 4 Aufgabe 4 4.1 Nennen Sie einige Befehle, die bei ihrer Ausführung folgende Zustandsbits prüfen: Zero, Carry und Negativ-Bit Lösung: Zero-Flag: BEQ, BNE, BGE(/BLT), BLE (/BGT), BLS, BHS Carry- (Übertrag) Flag: BCS, BCC, BLS (/BHI), BLO (/BHS) Negative-Flag: BMI, BPL, BLE(/BGT), BLT(/BGE) Overflow- (Überlauf) Flag: BVS, BVC, BLE (/BGT), BLT(/BGE) Mit Hilfe der Verzweigungs- und Sprungbefehle kann man die Zustandsbits im CCR prüfen. Diese Befehlsgruppe kann in zwei Teile gegliedert werden, nämlich: - unbedingte Sprungbefehle, - bedingte Sprungbefehle. Zu den unbedingten Sprungbefehlen zählen BRA und JMP. Funktionsmäßig sind beide identisch. Jedoch besteht ein Unterschied hinsichtlich der erreichbaren Sprungziele. Das Sprungziel eines BRA-Befehls darf nur innerhalb einer Grenze Z von – 127 10 ≤ Z ≤ + 128 10 liegen. Ist dies nicht der Fall, so muss auf den JMP-Befehl zurückgegriffen werden. Für die verbleibenden bedingter Sprungbefehl gilt: - Alle besitzen die relative Adressierungsart. - Als Bedingungen sind einzelne Flags des Statusregisters oder Verknüpfungen derselben definiert. Der Anwender kann in seinem Programm bedingte Sprünge einbauen, um beispielsweise nach einem Vergleich abhängig vom Zustand des Zero-Flags im Programm zu verzweigen. r steht in der Tabelle unten jeweils für das am Vergleich beteiligte Register (A oder B), m für die Speicherstelle. Die Flags seien entsprechend dem Wert der Differenz r – m gesetzt (z.B. durch einen CMP-Befehl). 5 4.2 Nennen Sie einige Befehle, die mit dem CCR arbeiten. Lösung: ANDCC ; Logisches UND mit CCR ORCC ; Logisches OR mit CCR TFR A,CCR ; Transferieren zum CCR TFR CCR,A ; Transferieren vom CCR EXG A, CCR ; Tauschen des Registerinhalts mit dem CCR PSHS CCR ; CCR-Inhalt im Systemstack sichern PSHU CCR ; CCR-Inhalt im Userstack sichern PULS CCR ; gesicherten CCR-Wert vom Systemstack zurückholen PULU CCR ; gesicherten CCR-Wert vom Userstack zurückholen 6 Aufgabe 5 Erklären Sie den Stapelspeicher und nennen Sie die Befehle für den Zugriff auf den Stapelspeicher. Nennen Sie die Stapelregister und Befehle für Stapelspeicher. Lösung: Der Stapel (Stack) Damit Unterpogrammen und Unterbrechungen die Möglichkeit einer temporären Datenspeicherung gewährt werden kann, wird ein Stapel benötigt. Man kann einen Stapel auf zweierlei Art implementieren: Durch eine feste Anzahl von Registern, die im Mikroprozessor fest vorgegeben sind und durch die Hardware realisiert werden. Der Vorteil des Hardwarestapels ist seine große Verarbeitungsgeschwindigkeit. Allerdings ist die Beschränkung auf eine dadurch festgelegte Anzahl von Registern meistens ein großer Nachteil. Die meisten verwendeten Mikroprozessoren (auch der 6809) verwenden einen, durch die Software generierten Softwarestapel. Dadurch kann man die Beschränkung auf eine bestimmte Anzahl von Registern umgehen. Bei der Softwarelösung wird die Adresse des obersten Stack-Elements plus eins im Stack-Pointer (SP) abgelegt. Dadurch wird der Stapel ein Bestandteil des Speichers. Damit der Stapelzeiger auf jedes Wort im Adressraum des Systems zugreifen kann, muss er eine Wortlänge von 16 Bit (für 6809) haben. Für eine Stapelverarbeitung wird ein Stapelzeiger benötigt. Man braucht einen Stapel (Stack) für die Abarbeitung von Unterbrechungen des normalen Programmflusses, sog. Interrupts oder Unterprogrammaufrufe. Der Stapelzeiger ist im Allgemeinen ein 16-Bit Register, das die Lage des obersten Stack-Elements kennzeichnet und meistens durch die Software erstellt wird. Der Stack-Pointer (SP) enthält also immer die Adresse des obersten Stack-Elements. Der Stack ist immer in einer LIFO Struktur ausgeführt (LIFO = Last In First Out) und setzt sich aus einer Anzahl von Speicherstellen od er Registern zusammen. Ein Hauptmerkmal des Stapels ist, dass das erste auf dem Stapel abgelegte Datenwort immer das untere Ende des Stapels bildet; während das obere Ende des Stapels wird immer durch das zuletzt abgelegte Datenwort gebildet wird. Der Zugriff auf den Stack erfolgt normalerweise nur über die Befehle PUSH (lege ein oder mehrere Registerinhalte auf den Stack) oder PULL (hole ein oder mehrere Registerinhalte vom 7 Stack). Das oberste Element des Stapels wird durch den Befehl PULL wieder in das, durch den Befehl näher bezeichnete, Register zurückgeladen. Der Stapel wächst nach unten in Richtung niedrigere Adresse. Bei PUSH wird der SP (Stack Pointer) vermindert, bei PULL erhöht. Aufgabe 6 6.1 Was versteht man unter dem Begriff „Adressierungsart“ bei einem Mikroprozessor? 8 Lösung: Als Adressierung bezeichnet man die Angabe der Speicherstelle eines Operanden, mit dem ein Befehl arbeitet. Das heißt, eine Adressierung ist ein vom Programm vorgegebenen Weg, wie ein Prozessor die Operanden im Speicher lokalisiert und den Speicherort für das Ergebnis angibt. Ein Mikroprozessor bietet eine Reihe von Möglichkeiten der Adressierungsarten. 6.2 Nennen Sie die Adressierungsarten des Mikroprozessors 6809 und erläutern Sie diese anhand einzelner Beispiele. Lösung: Der MC6809 Prozessor unterstützt folgende unterschiedliche Typen von Adressierungsarten. - Unmittelbare Adressierung (Immediate Addressing): Bei dieser Adressierungsart liegt der Operand in einem oder mehreren Erweiterungsbyte (Konstante), die in ein Register geladen werden. Nach dem Opcode sollen die Werte in Registern gespeichert werden. LDA #h’55 - Lade den Wert h’5555 in Register A. LDY #h’1234 - Lade den Wert h’1234 in Register Y. (Hinweis: Der Zeichen # bezeichnet nur die Werte und wurde nur bei der Immediate Adressierung benutzt.) -Implizierte Adressierung (Implied Addressing): Bei dieser Adressierungsart liegen die Operanden in einem Register und die sind eine Einheit von Opcode, die dieses Register verwenden. CLR B - Lösche Register B INC A -Inkrementiere die Registerinhalt Akkumulator A - Erweiterte Adressierung (Extended Addressing): Bei diesem Adressierungsart ist der Opcode eine 16 Bit Adresse, die Speicherzelle zeigt, gegeben. LDA h’2000 -Kopiere den Inhalt der Speicherzelle, die mit h’2000 adressiert ist, in RegisterA. LDD h’2000 -Kopiere den Inhalt der Speicherzelle, die mit 2000 und 2001 (High- und Low-Byte) adressiert ist, in Register A und B (High- und Low-Byte). - Direkte Adressierung (Direct Addressing) LDA h’ 30 - Kopiere den Wert, der in der Speicherzelle mit der Adresse h’xx30 steht, in Register A. xx ist der Inhalt von DP (Direkt Page) Register. Nach dem Reset, der Inhalt des DP Register ist 00, deshalb wird der Wert von Adresse h’0030 geladen. 9 - Register Adressierung -Indizierte Adressierung (Indexed Addressing) LDA B,X - Kopiere den Inhalt des Speicherplatzes, dessen Adresse gleich Register X + Register B(Offset) ist, in Register A. 10 - Indizierte Adressierung mit Indirekte Modifikation LDA [,Y++] - Bilde eine Adresse (High-Byte und Low-Byte) aus dem Inhalt der Speicherzellen, die mit Y und Y+1 adressiert sind, und kopiere den Wert, der dort eingetragen ist, nach Register A. Erhöhe danach den Wert im Register Y um 2. - Erweiterte indirekte Adressierung (Extended Indirect Addressing) LDA [h’2000] - Kopiere den Inhalt der Speicherzelle, die mit dem Inhalt der 11 Speicherzellen h’2000 und h’2001 (High- und Low-Byte) adressiert ist, in Register A. - Relative Adressierung mit Verzweigung- Befehlen (Branch) 6.3 Folgendes Programm wurde ausgeführt. Bitte schreiben Sie die entsprechende Adressierungsart für jede Programmzeile. a) LDB #h'30 b) EORA #h’0F TFR B, DP LDX #h’2000 LDA #11 STB ,X+ STA h'02 RORB RORB RORB RORB STB ,X c) STA [h'2000] d) LDA, -Y LDY # h'300A STA B,Y LDB # 05 CMPA #h'50 12 L11: LDA, Y+ BNE L22 STA 4, Y CMPA #h'2A BEQ L22 BRA L11 Lösung: 13
© Copyright 2024 ExpyDoc