Musterlösung 6 Mikroprozessor & Eingebettete Systeme 1

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