GESAMTÜBERBLICK
I.
EinleitungII.
Assembler
III.
ZustandsflagsIV.
Adressierungen
V.
Strukturiertes ProgrammierenVI.
PIA(T)
I.
Einleitung
INHALT
1.
Geschichtliche Entwicklung2.
Mikroprozessor
Prinzip und Aufbau3.
Grundlagen zum Praktikum
3.1 Praktikumsthemen3.2 R65023.3 Arbeitsschritte
1. Geschichliche Entwicklung
entnommen aus K. Wüst, Mikroprozessortechnik , Vieweg
(2003)
1948 Erfindung des Transistors(Bardeen
, Brattain
, Shockley
; Nobelpreis 1956)
1950 M.I.T. : erster Transistor-Computer , TX-01953 IBM : erster Röhrenrecher
(IBM 701)
Röhrenrechner nur bis 19581957 Gründung von DEC 1961 DEC : PDP-1
Nachfolgermodelle PDP-8 und -11 schon mit Buskonzept und 5μs Zykluszeiten
1964 DCD (Control
Data
Corporation) : CD6600IBM überholt bei alter Technik
Nächster Technologiesprung :
1958 Entwicklung integrierter Schaltkreise durchRobert Noyce
,
gründete mit Gordon Moore und Arthur Rockkleine Firma (Intel) zur Herstellung integrierterSchaltkreise
1964 IBM System/360 16 Mbyte
Adressraum,realer Magnetspeicher aber nur 512 kbyte, Prozessoreinheit noch nicht auf einem Chip.
1969 Erstes EPROM (Erasable
Programmable
ROM)
1969 japanischer Tischrechner →Auftrag an Intel, entsprechende Schaltkreise zu entwickeln
⇒
Rechner nur noch 4 Chips, einer davon dieCPU (4004 , 4-Bit
Prozessor)
4 Bit ALU4 Bit Register4 Datenleitungen
12 Adressleitungen (Arbeitsspeicher 4 kbyte)2300 Transistoren
1971 Intel : 8008 als 8 Bit
Prozessor mit 16 kbyte
Arbeitsspeicher
Der Ausdruck Mikroprozessor wurde geprägt.1972 Intel : 8080 (8 Bit, 64 kbyte
und Interrupt-Eingang)
1978 Intel : 8086 als 16 Bit
Prozessor, der 1981 von IBM im ersten PC eingesetzt wurde.
2. Mikroprozessor Prinzip und Aufbau
Grundbestandteile eines Mikrorechnersystems
•
Prozessor (CPU)•
Programm-
und / oder
Datenspeicher
•
Ein-
und Ausgabebausteine (I/O-Unit)•
Diese Elemente sind durch Busleitungen miteinander verbunden:
Steuer-, Adress-
und Datenbus•
Programmzähler
Vergleich Neumann-
und Harvard-Architektur
•
Harvard : zwei Bus-Systeme (getrennter Zugriff auf Progamm
und Datenspeicher)
•
Neumann : gemeinsamer Speicher für Daten undProgrammkode
Die Alu (arithmetic
and logical
unit) ist zentraler Teil des Operationswerk.
Prinzipielle Funktionsweise :
1.
Auslesen des nächsten Befehls aus dem Programmspeicher
2.
Programmzeiger weiterrücken 3.
Erkennen und Ausführen des Befehls
Ablauffrequenz wird durch einen Taktgenerator (clock) vorgegeben.Taktfrequenz etwa 1 MHz ( 1 μs )
80er zwei Entwicklungsrichtungena)
PC
b)
Mikrorechner Computer gesteuerte Geräte,embedded
systems
Mikrokontroller Handy , MP3-Player , GPS
Was sind die besonderen Anforderungen an einen Mikrocomputer ?
●
i.a. wenig Platz ●
Schnelle Programmausführung
⇒ Maschinen nahes Programmieren
Warum Assembler ?Programm liegt im Programmspeicher byteweise als binärerKode vor (meist als hexadezimaler Kode geschrieben).
Schwer interpretierbarund daher ungeeignet zurProgrammentwicklung
Daher hat man für jeden Maschinenbefehl einemnemotechnische Bezeichnung definiert, die als Ganzesden
Mnemokode
darstellt.
„$“ bedeutet : Angabe im hexadezimalen Kode
•
Assembler hat die Aufgabe den Mnemokode
in den Maschinenkode umzuwandeln.
•
Der Assembler hängt vom Prozessor abEnthält die ALU eine integrierte Schaltung füreine Operation, so sollte auch eine Kodierung für diese Operation im Assembler definiert sein.
Anmerkung :
Assembler immer schneller als Compiler,durch Studien bewiesen
3. Grundlagen zum Praktikum
3.1 Praktikumsthemen :
Teil I ( TI und AI ) :
•
arithmetischen Ausdruck (Arbeiten mit Speicher- adressen, Flags)
•
Tabellen (Adressierungsarten)•
Makros und Unterprogramme
•
Koroutinentechnik•
PIAT mit Interruptkonzept
Teil II ( TI ) :
•
Externe Interrupts•
Anwendung des Konzeptes der endlichen Maschinen
•
Kommunikation
3.2 Prozessor R65C02
Rockwell
MOSES als Mikrocomputer Plattform MOdulares
Sender und Empfanger
System
MOSES ist ein Host-Target
SystemHost : PCTarget
: Prozessor der Familie der R6500 (Rockwell
Ein-Chip Prozessoren), die in NMOS-
und in derschnelleren CMOS-Version
erhältlich waren.
•
CPU : R65C02 (CMOS-Technik) 4 MHz•
RAM : 32 kb
1-byte Speicher
•
ROM : 32 kb
Speicher•
BUS : 16 Bit Adressbus , 8 Bit Datenbus
•
I/O unit
: R65C24 PIAT (Timer und Interruptvorhanden , siehe später)
•
Betriebssystem : Blos
( Bus Link Operating
System
):
Kommunikation mit Shell auf dem PC,einige Dienstroutinen, wie z.B. DigEin
etc.
Blockschaltbild für die R65XX-Familie
Datenbus bi-direktional
(1 byte)
Adressbusuni-direktional(2 byte
: Lower
and higher
byte)
X-
und Y-registerIntel : nur Akkumulator
CPU des 6502•
Speicheradressen 2 byte⇒ Befehlszähler
2 byte
zero - page $00xx Schneller Zugriff , wird bei indirekterAdressierung benutzt
one – page $01xx für Stapel (stack) reserviert
•
Stapelzeiger 1 byte
, da „01“ als Seite 1fest vorgegeben
•
Zustandsregister 1 byte•
Akkumulator 1 byte
•
X -
Register 1 byte•
Y -
Register 1 byte
3.3 Arbeitsschritte
Erste Schritte●
login
: user
: Praktikant
PSW: Praktikum●
Shell starten (desktop)
●
Informationen unter HILFE→ Eingebundener Microrechner
Moses
•
Befehlssatz (Assembler Mnemokode)◦
Katagorische
Ordnung
◦
Alphabetische Ordnung•
Betriebssystem des MOSES (Blos)◦
z.B. Unterprogrammaufrufe : DigEin
, DigAus
●
I/O am MOSESI : 4 Kippschalter für Eingabe einer Tetrade
(DigEin)
O : 7 Segmentanzeige für Ausg. von 15 Zeichen (DigAus)
Prinzipielle Arbeitsweise•
Programm wird auf dem Host im Mnemokode
geschrieben (i.a. in der Shell auf dem PC).Es können auch Vorarbeiten am Simulator zuhause durchgeführt werden), aber Vorsicht, beim Überspielen auf den PC können schwer auffindbare Fehler entstehen.
•
„Assemblieren“
(erzeugt eine .obj-
und eine .lst-Datei)
•
Auf den Prozessor übertragen : „herunterladen“•
Programm auf dem Prozessor laufen lassen : → „starten“
(Normalmodus)
→ „starten warten“
Ausgabe über DSchreibgewünscht
•
Gegebenenfalls „Speicher auslesen“
II.
Assembler
INHALT
1.
Grundlagen2.
Dateneingabe
3.
Strukturelemente3.1 allgemeine Programmstruktur3.2 Assembler Direktiven3.3 Unterprogramme und Macros
1. Grundlagen
Befehlskategorien1.
Datentransfer
•
LDA lade in den Akkumulator•
TAX kopiere Akkumulatorinhalt ins x-Register
•
PHA Akkumulatorinhalt auf den Stapel legen2.
Arithmetische und logische Operationen
•
ADC Addiere zum akkumulator
mit Übertrag•
DEY Dekrementiere
Inhalt des Y-Registers um 1
•
AND bitweise konj. Verknüpfung mit Akku-Inhalt•
CMP virtuelle Subtraktion vom Akku mit
Entleihung•
ROL um ein Bit nach links rotieren über Carry-Bit
3.
Programmablaufsteuerung•
BCC Verzweigung, falls C = 0 (Carry-Bit)
•
JMP Sprung zu angegebener Adresse•
JSR Sprung in Unterprogramm
•
RTS Rücksprung aus Unterprogramm•
CLC Carry-Bit
löschen
4.
Assembler –
Anweisungen (Direktiven)werden zur Übersetzungszeit ausgeführt
•
.if
Operand ab hier erfolgt Assemblierung nur, wenn Operand ≠
0
•
.cend
beendet Block, auf den sich .ifbezieht
•
.word
definiert Wort-Format für Variable als Operand
OperandeneingabeDen Operanden werden Definitionszeichen vorangestellt
# Wert wird explizit eingelesen ; steht dieses Zeichen nicht , wird eine Adresse angegeben.
$ Operand wird hexadezimal eingegeben.% Operand wird dual eingegeben.
Beispiele :LDA # 92
; dezimale explizite
LDA #%01011100
; duale Eingabe LDA # $5C
; hexadezimale von 92
LDA $ 5010
; hexadezimale Angabe der Speicheradresse
SpeicherplatzreservierungProgramm :
.org
$4000 legt Beginn
des Speicherbereichs
für den Programmkode
fest.
Ab Seite $40 für den Programmkode und Datenspeicherist sinnvoll, da vorherige Seiten zum Teil intern belegtwerden:
$02 : intern (z.B. Init. von IRQ-Vektoren)$20 -
$2F : Sendepuffer (4kb)
$30 -
$3F : Empfangspuffer (4kb)
$F7 -
$FF : BLOS ( Bus Link Operating
System )
2. Dateneingabe
(1)
Explizit für Variable A : A = $ 5001
(2)
mit Längenfestlegung und gleichzeitiger Eingabehierbei wird Nummer der Speicherzelle durch die Position im Programmkode automatisch festgelegt.A: .byte
$FA
; hexadezimale Werteingabe
B: .byte
%11111010
; duale Eingabe derselben ZahlC: .dbyte
$FA14
; Eingabe der 2-byte Zahl FA14
im doublebyte-FormatD: .word
$FA14
; oder im word-Format
Speicherbelegung im
dbyte
and
word
formatC C+1
D D+1
FA 14 14 FA
Tab: .byte
$04, $FA , … , $A8; Eingabe von Tabellenwerten
E: .byte
$00
; Initialisierung der Variablen E
Eingabe von DatenFALSCH :
S1 = $5000•••••
S1: .byte
$AC
; Für S1 werden zwei verschiedeneSpeicherzellen definiert.
Soll die Speicherzelle für die Eingangsvariable fest vorgegeben werden, ist folgendes möglich :
.org
$4000••
Programmkode••
.org
$5000
; AC wird als Variable S1 inS1: .byte
$AC
Speicherzelle $5000 abgelegt
Anderes Beispiel für falsche Dateneingabe.org
$4000
Tab: .byte
$AC, $0F, $7AStart: LDA …..
•••
Die .byte
Anweisung gehört nicht zum Programmkode,sondern ist eine „Directive“, die erst bei der Über-setzung
umgesetzt wird. Die Speicherzelle wird daher
zweimal beschrieben : mit $AC und mit dem Kode für den LDA-Befehl
besser : .org
$4000 Tab: .byte
$AC, $0F, $7A
.org
$4003
oder Start = $4003 Start: LDA …..
•••
Alternative Eingabemöglichkeit (oft für einfache Parameter eingesetzt)
N1 = $8F ; nur hier, ob hexadezimal, dual o. dezimalLDA #N1
; der Wert 8F wird in den Akku geladen
LDA N1
; der Inhalt der Speicherzelle $008F(zero-page) wird in den Akku geladen.
Beachte !A = 1
(dezimal) oder A = $5010
(hexadezimal)
sind keine Befehle des Assemblers, sondern nureinfache Gleichsetzungen,so auch auf voriger Folie Start = $4003Marken wie Start:
sind synonym zu Adressen des
Programmkodes
Vorsicht bei zero-Page
Adressierung
nachträgliche Korrektur des Programmspeichers aufgrund Zero-page
Benutzung
3. Strukturelemente
3.1 Allgemeine Programmstruktur•
R6502 hat Neumannstruktur, daher Daten-
und
Programmspeicher vermischt.•
Festlegung der Speicheradresse, ab der das Programm gespeichert werden soll.zwei Möglichkeiten :
.org
$4000 Start = $4000Start: clc
•
Es gibt Unterprogramme , z.B. DigEin
oder DigAus
, deren Adressen in einer Bibliothek gegeben sind. Die entsprechende Bibliothek wird durch
.lib
“konst.lib“eingebunden.
•
Macros
(Einzelheiten siehe später) sollte man an den Anfang des Programmkodes setzen
•
Da das Assemblerprogramm aus dem Betriebssystem Blos
als Unterprogramm aufgerufen wird, muss auch
das Hauptprogramm mitrts
abgeschlossen werden.Das Fehlen kann zu fatalen Fehlern führen.
•
Es ist sinnvoll Unterprogramme hinter das Haupt- programm
zu setzen.
•
Für die Dateneingabe werden Anweisungen der ArtTabelle: .word
$12FB, $A35D, ……
empfohlen.Da die Speicheradressen automatisch durch Weiterzählen festgelegt werden, sollten diese Datenanweisungen an das Ende des Programmkodes gesetzt werden, um Speicherplatzkonflikte zu vermeiden.
Daraus ergibt sich folgende Programmstruktur :
.org
$4000.lib
“konst.lib“
MacrosHauptprogrammrts
;
Abschluss des Hauptprogramms
UnterprogrammeTabelle: .word
$12FB, $A35D, ……
; Dateneingabe
.end
; Abschluss des Programmkodes
Korrektur zum studentischem SkriptSeite 17 unter „3.2. hello
World“
Das Beispielprogramm enthält einige
Fehler
:
.org
$4000.lib
„konst.lib“ ; so
wird am Moses eine
Bibliothek eingebundeloop: jsr
DigEin
; DigEin
ist wie im PA-Plan
jsr
DigAus
; korrekt gezeichnet eineSubroutine, daher jsr-Aufruf
cmp
#$0F ; Akku-Inhalt wird mit F durchvirtuelle Subtraktion verglichen,falls gleich, Zero-Bit = 1
bne
loop
; Sprung zu loop, falls Z = 0rts
; Main wird vom Blos
als
Subroutine angesprochen
Wie kann man Maschinenkode und Zuordnung von Befehl zu Speicheradresse nachschauen ?
Welche Information erhält man aus der lst-Datei
●
Befehlstypeni.
0-Adress-Befehle, z.B. clc
, asl
, rol
ii.
1-Adress-Befehle , z.B. lda
#Wert
(1 byte
Operand)lda
Adresse
(2 byte
Operand)
iii.
RMW (read
modify
write) ; teilweise0-Adress-Befehle : asl
; Akkumulator
dex
; X-Registerund / oder 1-Adress-Befehle : asl
$5000
dec
$5010
●
ZuordnungBefehl ↔
Speicheradresse
z.B. werden bei 1-Adress Befehlen, in denen der Operand aus 2 byte
besteht, 3 Speicheradressen
benötigt.
●
ZuordnungMnemokode
↔
Maschinenkode
3.2 Assembler DirektivenMit if-Direktiven
, die einen Parameter A ansprechen,
kann gesteuert werden, welche Passagen desMnemotechnischen Kodes assembliert werden.
wird assembliert , wenn● .if
A : A ≠
0
● .ifne
A : A ≠
0● .ifeq
A : A = 0
● .ifmi
A : A < 0● .ifpl
A : A > 0
Diese if-Direktiven
können mit „ .else“ verknüpft werdenund werden mit „ .cend“ beendet (siehe folgendes Beispiel).
Beispiel :
Anmerkungen :•
Da die if-Direktiven
bereits Einfluss auf das
Assemblieren nehmen, können die Steuer-Parameter natürlich nicht durch den Ablauf des Programms bzw. dessen Rechenergebnissebestimmt werden, d.h. ,
Für den Steuerparameter kann nicht der Inhalt einer Speicherzelle oder eines Registers verwendet werden.
•
WICHTIG :Hinter den if-Direktiven
dürfen keine Kommentare
stehen
3.3 Unterprogramme und
Makros
Unterprogramme :
Beispiel :•••
$4010 JSR Potenz$4013 Befehl_cont
•••
$wxyz
Potenz•••
rts
; $4012 wird als Rücksprungadresse ρauf den Stapel gebracht
; Speicheradresse $4012 wird vomStapel genommen und in den Programmzähler geschrieben, der dann um „1“
inkrementiert wird,
also auf $4013 gesetzt wird.
Unterprogramme werden durch Sprünge angesprochen, d.h. ,Programmzähler muss neu beschrieben werden.
Makro–Anweisungen
gehören zu den Assembler Direktiven, d.h. auch hier geschieht das Wesentlichebeim Assemblieren:
Die Befehle des Makros werden andie Stelle des Aufrufes kopiert.
●
Bei n Aufrufen wird das Makro im Maschinenkoden-mal
aufgeführt.
●
Makros können ineinander geschachtelt werden.●
Makros sind parametrierbar (Parameter können übergeben werden.
Makros :
Zwei Typen von Makros :
●
Beginn durch Name.macro
ParamVerhalten wie Blöcke, d.h. , dort definierte Marken gelten nur lokal im Makro
●
Beginn durch Name.segm
Parambeim R6502 nicht möglichDefinierte Marken gelten global, d.h. , Doppelbenennung beachten oder Marken vermeiden.
Beide Typen werden mit .mend
abgeschlossen.
Der Aufruf eines Makros erfolgt durch Name
Makro
Unter-programm
Vorteile
●
Schneller Zugriff
●
Parameterübergabe
●
Kode wird nur einmal abgelegt, geringerer Speicherplatz
Nachteile
●
Kode wird mehrmals abgelegt, Speicherplatz-
expansion
●
keine Parameterübergabe
●
Langsamer wegen Sprünge
⇒ Makros klein haltenund / oder
Nicht oft aufrufen