Praktikum 7 Informatik-Infrastruktur zum Fach TIn

Werbung
Praktikum 7
Informatik-Infrastruktur zum Fach TIn
Für die Informatik-Basisdienste ist das Rechenzentrum verantwortlich. Basisdienste sind im speziellen
das Netzwerk mit den Anschlüssen nach aussen und die allgemeinen PC-Räume.
Die departements- und fachspezifische Infrastruktur wird von den entsprechenden Assistenten und Dozenten des Departements Informatik, Kommunikation und Elektrotechnik“ betreut. Dazu gehören die
”
TIn-Räume E602 und E606 mit den PCs und den Druckern.
R a u m
P e n tiu m
E 6 0 6 :
III-4 5 0 m
R a u m
it Z ie ls y s te m
e n
P e n tiu m
E 6 0 2 :
III-4 5 0 m
it Z ie ls y s te m
L a s e r -P r in te r
L a s e r -P r in te r
E 6 0 6 _ L J
E 6 0 2 _ L J
e n
Die Druckerdienste werden vom Server calamari“ zu Verfügung gestellt.
”
7.1 PCs der technischen Informatik
Für die Labor-Lektionen stehen (entsprechend dem Stundenplan) die Räume E602 oder E606 zur
Verfügung. Im Raum E606 sind in den hinteren Reihen 6 Arbeitsplätze für das Selbststudium eingerichtet. (Rahmen) Die PCs in den TIn-Laboren sind mit dem Prozessor Pentium III-450 ausgestattet. Sie
werden mit Windows XP betrieben. Sie booten und laden die meisten Programme vom lokalen Harddisk.
Bei technischen Problemen ist unbedingt der anwesende Dozent zu informieren, damit
er das Problem beheben oder bei Bedarf weiterleiten kann.
Die privaten Daten werden mit Hilfe von File-Services wahlweise auf dem File-Server des Rechenzentrums mustang oder auf dem File-Server des Departements Informatik, Kommunikation und Elektro”
technik“ kermit gespeichert.
2
Informatik-Infrastruktur zum Fach TIn
File-Server
lokaler
Disk
Betriebssystem,
Programme
Daten
Daten-Disk
Die Arbeitsplätze sind ausgerüstet mit je:
• einer Experimentierplatte mit dem notwendigen Zusatzmaterial (ICs, IC-Sockel, Kabel etc.)
• einem Prozessor-Board (TIn-Board) mit Speisung, Trace-Logik und einfacher Peripherie
Neben dem Betriebssystem XP werden folgende Werkzeuge zur Verfügung gestellt:
• Turbo-Borland-C Entwicklungsumgebung
• Turbo-Assembler Entwicklungsumgebung mit TASM, TLINK, TD, TLIB
• Text-Editor EDIT oder EditPad Lite
• Monitor-Programm ED86 (Eigenentwicklung) für das TIn-Board
7.2 Allgemeine PCs
Viele TIn-Übungen (solche ohne Hardware) können auch auf private PCs oder in allgemeinen PC-Räume
durchgeführt werden.
Diese PCs besitzen ebenfalls einen lokalen Harddisk, von dem sie booten und auf dem auch die Programme gespeichert sind. Sie sind aber gleich vernetzt wie die TIn-PCs und können auf alle PC-Services (z.B.
File-Services zur Speicherung der privaten Daten) zugreifen.
Die Programme Assembler-Entwicklungsumgebung (TASM, TLINK, TD, TLIB) sind unter
\\kermit\tin\prakt\tin_sw\ zu finden.
Diese Räume werden vom Rechenzentrum betreut. Bei technischen Problemen ist ein
Problemzettel auszufüllen und am RZ-Schalter (E320) abzugeben.
Druckerprobleme können im allgemeinen sofort gelöst werden. Bei PC-Problemen ist oft eine längere
Reparatur notwendig.
Allgemeine PCs
3
7.2.1 Public-Service der Dozenten
Die DOZ-Accounts sind im Prinzip gleich aufgebaut, wie ein Studenten-Account.
• Die User-Namen sind die Kurzzeichen der Besitzer.
• Der Gruppen-Name ist staff“.
”
• Die Directories sind normalerweise für Studenten nicht lesbar. Eine Ausnahme ist das Unterverzeichnis public, in dem die Dozenten vorbereitete Programme und Daten zur Verfügung stellen.
Der Zugriff auf die public-Daten eines Dozenten erfolgt am einfachsten mit Hilfe des N-Drives.
N :\
\u s e rs
s ta ff
g b l
p u b lic
tin
w w w
4
Informatik-Infrastruktur zum Fach TIn
7.2.2 TIn-Beispiele
Für das Fach TIn ist auf dem Server kermit ein Public-Service \\kermit\tin eingerichtet. Der Service ist standardmässig mit dem T-Drive verknüpft. In den Subdirectories
V:\public\tin_1\praktikum\pxx\ werden allfällige vorbereitete Files mit Daten, Übungen etc.
zur Verfügung gestellt.
V :\
\\k e r m it\tin
w w w
p u b lic
T In _ 1
p r a k tik u m
p 0 1
a)
p 0 2
p 0 3
Zusammenstellung der Service-Zuordnungen im TIn-Labor (unvollständig)
Gerät Netzwerk-Service
M:
\\mustang\user
N:
\\zhwin\data
V:
\\kermit\tin
\\calamari\e60x_lj
Beschreibung
User-Directory auf mustang“
”
Top-Level-Verzeichnis aller Gruppen
TIn-Beispiele und Programme
Postscript-Drucker im Raum E60x
Unter MS-DOS werden File-Services mit dem folgenden Befehl aktiviert:
NET USE d: \\server\fileservice
Praktikum 8
Transferbefehle
8.1 Einführung in die Laborumgebung
8.1.1 Zielsystem
Für die folgenden Hardware-Versuche verwenden wir ein Zielsystem mit dem CMOS-Prozessor 80C186.
Der PC wird nur als Entwicklungssystem (Editieren, Assemblieren etc.) und als Bediengerät (Terminal)
verwendet. Das Zielsystem besteht aus dem Prozessorboard (TIn-Board) mit Trace-Logik und einer Experimentierplatte für Versuchsschaltungen.
E x p e r im e n tie r p la tte
In d ig e l A - T P 2 0 0 2
A (1 5 ..0 )
A d d r. (1 9 ..1 6 )
A d d r. (1 5 ..0 )
+ 5 V
D (1 5 ..0 )
C o n tro l
D a ta (1 5 ..0 )
C o n tro l
IN (7 ..0 )
O U T (7 ..0 )
O u tp u t 7 0 3 H
In p u t 7 0 7 H
G N D
A d d re s s
G N D
P o rt 7 0 2 H
P o rt 7 0 1 H
P o rt 7 0 0 H
P o rt 7 0 5 H
P o rt 7 0 4 H
D a ta
P O W E R
R E S E T
IO R D #
IO W R #
H A L T
F E T C H
M E M R D #
M E M W R #
N O B U S
7 0 9 H
R U N
T R A C E
P o rt
| 7 0 8 H
S T E P
P o rt 7 0 6 H
6
Transferbefehle
8.1.2 Zusatz Peripherie
Auf der rechten Seite enthält die Zusatz-Hardware einfache Peripherie- Geräte“, welche für die Übungen
”
verwendet werden.
a)
16 stellige LED-Anzeige (Port 700h und 701h)
B 7
b)
Die LEDs sind über (nichtinvertierende) Treiber gegen die Speisespannung angeschlossen, was bewirkt, dass eine LED leuchtet, wenn Null am Port-Ausgang anliegt.
P o rt 7 0 0 H
P o rt 7 0 1 H
B 0
B 7
B 0
Siebensegmentanzeige (Port 702h)
B 0
B 5
B 7
B 3
16 Schiebeschalter (Port 704h und 705h)
P o rt 7 0 5 H
B 7
d)
Eine LED leuchtet, wenn Null am PortAusgang anliegt.
B 2
B 4
c)
P o rt 7 0 2 H
B 1
B 6
P o rt 7 0 4 H
B 0
B 7
B 0
Ein Schalter legt eine Eins ans Input-Port, wenn er oben ist.
Drucktasten und Hex-Codier-Schalter (Port 706h)
P o rt 7 0 6 H
B 7 ..B 4
B 3
B 2
B 1
B 0
Die vier Tasten sind am tieferwertigen Nibble (Bit 0 bis 3)
angeschlossen. Eine gedrückte Taste liefert eine Null.
Der Hex-Codier-Schalter ist am höherwertigen Nibble (Bit
4 = LSB bis Bit 7 = MSB) angeschlossen.
Einführung in die Laborumgebung
e)
7
Adressraum des Zielsystems
Der Memory und I/O-Adressraum des TIn-Boards ist wie folgt aufgeteilt:
M e m o ry A d d re s s S p a c e
0 0 0 0 0 h
0 3 F F F h
2 0 0 0 0 h
3 F
4 0
7 F
8 0
F F
0 0
F F
0 0
F h
0 h
F h
0 h
8 F F F F h
F C 0 0 0 h
F F F F F h
S ta tic - R A M
( M o n ito r )
S ta tic - R A M
( E x p a n s io n )
u n u se d
( E x p e r im e n ta l )
I/O
A d d re s s S p a c e
0 0 0 0 h
4 8 0 h
4 8 F h
( O n -B o a rd )
0 6 0 0 h
u n u se d
( E x p e r im e n ta l )
0 7 0 0 h
0 7 0 9 h
( O n -B o a rd )
F F F 0 h
F F F F h
( P ro c e s s o r )
0 4 8 8 h O u t: 8 L E D
0 7 0
0 7 0
0 7 0
0 7 0
0 7 0
0 7 0
0 7 0
0 7 0
0 7 0
0 7 0
0 h O
1 h O
2 h O
3 h O
4 h In
5 h In
6 h In
7 h In
8 h O
9 h O
u t:
u t:
u t:
u t:
: 8
: 8
: H
: 8
u t:
u t:
8 L E D
8 L E D
N u m D is p
8 L in e s
S w itc h
S w itc h
e x - S w itc h
L in e s
R ig h t 2 D
L e ft 2 D ig
la y 7 - S e g
, 4 B u tto n
ig it o f D a ta - 7 - S e g
it o f D a ta - 7 - S e g
R O M
( M o n ito r )
Wie ersichtlich, sind einige Bereiche schon mit Speicher oder Ports belegt. Programme werden generell
in den mit ”Static-RAM (Expansion)” bezeichneten Bereich ab 20000h geladen. Für Hardware-Experimente können nur die als ”unused (Experimental)” bezeichneten Bereiche verwendet werden.
8
Transferbefehle
8.1.3 Arbeiten mit dem Zielsystem
Der Monitor für das TIn-Board (mit 80C186 CPU) wurde als Diplomarbeit des Vertiefungsfachs Software Engineering entwickelt und basiert auf der Bedienungsphilosopie des Turbo-Debuggers TD von
Borland. Für die Verbindung zum Zielsystem über eine serielle Leitung wird eine Betriens-Software
(EPROM des Zielsystems) verwendet (ECM = Embedded Controller Monitor), die über einfache Kommandos angesprochen werden kann.
Z ie ls y s te m
P C
E th e rn e t
C P U
T In -B o a rd :
E C M -P ro g ra m m
s e r ie lle
S c h n itts te lle
B e fe h le
u n d D a te n
R A M
B u s
L E D - A u s g a b e
R A M
: E V -D e b u g g e r M 8 6
C O M 1
E P R O M
P o rt 7 0 0 h
S c h a lt e r - E in g a b e P o r t 7 0 4 h
E in - / A u s g a b e - T e il d e s T In - R e c h n e r s
Der Monitor wird mit M86 filename oder mit M86 aufgestartet:
• Im ersten Fall wird das zu testende Programm filename (*.EXE-File) direkt geladen und der
Cursor steht am Programmstart.
• Nach dem ersten Aufstarten mit Filename kann im folgenden auch ohne filename aufgestartet werden – das Batch-File merkt sich den Filenamen und verwendet diesen weiter.
Beachten Sie, dass die Ladeadresse (Wohin soll das Programm im Zielsystem) gewählt werdem kann. In
den meisten Fällen quittieren Sie die Default-Ladeadresse 2000h mit RETURN .
Es können nur übersetzte und gelinkte Programme (= *.EXE-Files) mit dem TIn-Monitor getestet werden. Dabei soll normalerweise auch das Quellenprogramm zur Verfügung stehen, da während des Debuggens der Programmablauf auch im Quellencode verfolgt werden kann. Das Übersetzen mit dem
Assembler und das Linken wird in einem späteren Abschnitt erläutert, da zuerst die 8086-Architektur
mit den wichtigsten Befehlen erarbeitet wird.
Einführung in die Laborumgebung
a)
9
Bildschirm:
Dieser ist in verschiedene Bereiche unterteilt.
Menuleiste (oben): Hauptmenu immer erreichbar mit der Taste F10 . Alle Hauptmenus sind immer
mit den hotkey-Tasten“ Alt-h erreichbar.
”
Disassembler-Window : Hier wird das Programm als Maschinencode dargestellt.
Modul-Window : Hier wird das Programm als Quellenprogramm dargestellt.
CPU Register-Window : Zeigt jeweils die aktuellen Registerinhalte an.
CPU Stack-Window : Zeigt den verwendeten Stackbereich an.
b)
Befehlsausführung: (trace)
Mit der Taste
F7
wird jeweils der nächste Befehl ausgeführt: Im Code-Feld wird dieser durch
F8
hat dieselbe
einen Pfeil angezeigt (Adresse von IP = Befehlszeiger). Hinweis: Die Taste
Wirkung wie
F7 , solange keine CALL-Befehle (step over) vorkommen.
c)
Abbruch eines laufenden Programmes: Run-Menu: Goto Start
Wenn das Programm in eine Endlosschlaufe gerät, so kann der Programmablauf über das Run-Menu
unterbrochen werden (z.B. mit Goto Start). Im nachfolgenden Beispiel TRANSBEF ist dies der Fall,
F9
(= Run) gestartet wird.
wenn die Befehlsfolge mit der
10
Transferbefehle
8.2 Aufgaben
8.2.1 Manipulationen mit dem TIn-Monitor
Starten Sie den Monitor und untersuchen Sie die Funktion der Ziel-Hardware:
a) Aktivieren Sie die Funktion Ansicht → Speicher.
Untersuchen Sie den Speicher ab den Adressen 2000:0h, 5000:0h und FC00:0h, indem Sie den
entsprechenden Bereich anzeigen und etwas an diese Adresse schreiben und wieder auslesen.
b) Schreiben Sie einen Wert an die Adresse 2000:200h. Setzen Sie das Speicher-Window an die
Adresse 2001:0h. An welcher Offset-Adress finden Sie den Wert eingeschriebenen Wert wieder?
c) Aktivieren Sie die Funktion Ansicht → Out−Port. Geben Sie verschiedene Byte- und Word-Werte
an den LEDs (Port 700h und 701h) aus. Bestimmen Sie aus diesen Versuchen, ob die Segmente
aktiv low oder high zum Leuchten gebracht werden. (Die Einstellung Byte und Word kann, wenn
der Cursor auf dem Out-Port Fenster ist, durch anklicken der rechten Maustaste in den Optionen
verändert werden.)
d) Aktivieren Sie die Funktion Ansicht → In − Port. Lesen Sie Byte- und Word-Werte von den Schaltern (Port 704h und 705h) ein. Bestimmen Sie die Zurodnung der Schalterstellung (oben/unten)
zu den Werten eingelesenen Werten 0/1. (Die Einstellung Byte und Word kann, wenn der Cursor
auf dem Out-Port Fenster ist, durch anklicken der rechten Maustaste in den Optionen verändert
werden.)
e) Die Siebensegmentanzeige ist wie folgt mit dem Port 702h verbunden:
P o rt 7 0 2 H
B 0
B 5
B 6
B 1
B 2
B 4
B 3
B 7
Man bestimme die auszugebenden Werte für eine Anzeige von 0. . . 9 und A. . . F.
Assembler-Beispiel TRANSBEF mit TIn-Monitor
11
8.3 Assembler-Beispiel TRANSBEF mit TIn-Monitor
Im folgenden Beispiel sollen die besprochenen Transport-Befehle (MOV, IN, OUT und XCHG) im TInMonitor gezeigt werden, und zwar zu Beginn auf der Ebene der 8086-Architektur als nackte“ Ma”
schinenbefehle im Disassembler-Window des Monitors. Diese Schritte sind ohne Assemblerkenntnisse
durchführbar. Es wird das bereits assemblierte und gelinkte Modul TRANSBEF verwendet. Als Hilfe
kann das Listing verwendet werden, das mit P86 TRANSBEF gedruckt werden kann, wobei die Assemblerdetails mit den Pseudobefehlen später betrachtet werden sollen. Mit diesem ersten Beispiel sollen
wenige Maschinenbefehle im Einzelschritt verfolgt werden, sodass Sie die Wirkung auf Registerinhalte,
Memory-Datenbereiche und Ein-/Ausgabeports sehen und nachvollziehen können. Es werden noch zwei
bisher nicht besprochene Befehle benötigt: INC (= increment 1, den Inhalt des Operanden um 1 erhöhen)
und JMP (= jump, Sprung an die angegebene Stelle).
a)
Funktion des Assemblerbeispieles
Zuerst werden die Segmentregister DS, SS und der Stackpointer SP inititalisiert. Der Assemblerbefehl
ASSUME auf Zeile 27 wird im Kapitel Assemblersprache erläutert. Das uns interessierende Programm
beginnt ab Zeile 28 mit dem Initialisieren von drei Registern: DX und DI mit den zwei Portadressen
für die Schalter und LED und das Register BX mit der Anfangsadresse der Datentabelle tabelle.
In der folgenden Endlosschlaufe werden zuerst die unteren acht Schalter S07. . . S00 eingelesen, ins
higher Byte des Accu dupliziert, in die Datentabelle mit der Registerindirekten Adressierung via [BX]
abgelegt und als 16-Bit Ausgabe auf alle 16 LED ausgegeben. Nacher werden die oberen acht Schalter
S15. . . S08 eingelesen, ebenfalls in die Tabelle abgelegt und auf beide LED-Balken dupliziert. Am
Schluss werden alle Schalter als 16-Bit Wert eingelesen, als 16-Bit Wert in den Speicher abgelegt und
wiederum als 16-Bit Wert auf die LED ausgegeben.
Das Programm soll nun im Einzelschritt durchgearbeitet werden, und die Wirkung der Befehle auf Register und Speicher beobachtet werden.
b)
Aufstarten und Manipulationen
• Kopieren des Programmbeispieles TRANSBEF in Ihr TIn-Arbeitsverzeichnis.
• Starten des Monitors und laden des Programmbeispieles:
M86
TRANSBEF
• Einzelschritt-Ausführung der ersten 8 Maschinen-Befehle mit der Taste
F7
(trace =
Einzelschritt-Ausführung). Beobachten Sie die Änderungen im Register- und im Speicher-Feld.
• Setzen Sie die Schalter S0. . . S15 (der Ports 704H und 705h) auf geeignete Werte. Durchlaufen der
folgenden 24 Befehle (Schlaufe endless).
• Nochmaliges Durchlaufen der folgenden 16 Befehle mit gleicher Schalterstellung: Was ändert sich
gegenüber dem ersten Durchlauf?
• Weitere Durchläufe mit anderen Schalterstellungen.
Praktikum 9
Maschinencode der 8086-Prozessoren
9.1 Bedienung des Turbo-Debuggers
Der Turbo-Debugger von Borland ist ein Test-Hilfsmittel. Dank seinen anschaulichen Möglichkeiten,
den Ablauf und die Wirkung von Assembler-Befehlen im CPU-Window zu beobachen, und der bequemen Bedienung mit Maus und Menu’s wird er im Fach Technische Informatik zunächst vor allem
als Lernhilfe im Sinne eines Simulators der 8086-CPU verwendet, da er auch ohne das Zielsystem
einsetzbar ist.
Normalerweise wird der Turbo-Debugger für das Testen und die Fehlersuche (debugging) von Programmen auf dem PC unter DOS für verschiedene Sprachen eingesetzt:
• Turbo-Assembler (TASM)
• Turbo-Pascal (TURBO)
• Turbo-C (TC)
In diesem Abschnitt wird die Bedienung der wichtigsten Elemente des Turbo-Debuggers (mit TD bezeichnet) erläutert, und im folgenden Abschnitt anhand eines elementaren Assemblerprogrammes mit
wenigen einfachen Befehlen die Bedienung direkt auf dem PC geübt.
Der Turbo-Debugger TD wird in unserer TIn-Umgebung mit D86 oder mit D86 filename aufgestartet (D86 = Batchfile):
• Im ersten Fall wird kein Programm geladen. Dies kann anschliessend über das File-Menu erfolgen
(z.B. mit den Tasten Alt-F).
• Im zweiten Fall wird das zu testende Programm filename (*.EXE-File) direkt geladen und
der Cursor (CS:IP) steht am Programmstart.
• Nach dem ersten Aufstarten mit dem Filenamen kann im folgenden auch ohne filename aufgestartet werden – das Batch-File setzt den Filenamen als DOS-Umgebungsvariable, die bei allen
folgenden Batch-Aufrufen wieder verwendet wird.
Es können natürlich nur übersetzte und gelinkte Programme (*.EXE-Files) mit dem TD getestet werden.
Dabei muss normalerweise auch das Quellenprogramm zur Verfügung stehen, da während des Debuggens der Programmablauf auch im Quellencode verfolgt werden kann (Source-Window). Das Übersetzen mit dem Assembler und das Linken wird in einem späteren Abschnitt erläutert, da zuerst die 8086Architektur mit den wichtigsten Befehlen erarbeitet wird.
14
a)
Maschinencode der 8086-Prozessoren
Maus-Bedienung
Mit der Maus können alle Felder aktiviert und direkt angesprochen werden: Positionieren des Cursors
und die linke Maus-Taste betätigen. Durch das Positionieren auf eine Menu- oder Befehls-Auswahl in
der Statuszeile werden die Menus direkt aktiviert bzw. die Befehle ausgeführt.
b)
Bildschirm
Der Bildschirm ist in drei Bereiche unterteilt:
Menuleiste (oben): Hauptmenu immer erreichbar mit der Taste F10. Alle Hauptmenus sind immer mit
den ”hotkey-Tasten” Alt-h erreichbar.
Window-Bereich (Mitte): Hier werden die verschiedenen Fenster dargestellt: Zu Beginn verwenden wir
das CPU-Window, später auch das Source-Window und zu Testzwecken verschiedene InspektionsFenster (View-Windows).
Statuszeile (unten): Gibt jeweils kontextbezogene Informationen über die weiteren möglichen Funktionen oder über Ein-/Ausgaben.
c)
CPU-Window
Dieses Fenster zeigt alle Details der CPU in 5 verschiedenen Feldern. Wir werden in unserem ersten
Beispiel nur die drei Felder CODE (Befehle), DATA (Speicherausschnitt) und REGISTER (alle 13 CPURegister) betrachten. Mit der TAB-Taste kann in das nächste Feld gewechselt werden oder mit der rechten
Maustaste in das zu aktivierende Feld klicken.
d)
Befehlsausführung: (trace)
Mit der Taste F7 wird jeweils der nächste Befehl ausgeführt: Im Code-Feld wird dieser durch einen
”Dreiecks-Pfeil” angezeigt (Adresse von IP = Befehlszeiger). Hinweis: Die Taste F8 (step over) hat
dieselbe Wirkung wie F7, solange keine CALL-Befehle vorkommen.
e)
Abbruch eines laufenden Programmes: Tasten Ctrl-Break
Wenn das Programm mit dem Run-Kommando in eine Endlosschlaufe gerät, so kann der Programmablauf mit der Tastenkombination Ctrl-Break abgebrochen werden. Im nachfolgenden Beispiel
OPCOD ist dies der Fall, wenn das Programm mit der Taste F9 (Run) gestartet wird.
9.1.1 Arbeiten mit dem Turbo-Debugger: Beispiel OPCOD
Kopieren Sie die folgenden Files vom Drive T:, Subdirectory p09in Ihren M-Drive:
OPCOD.*
Bedienung des Turbo-Debuggers
a)
15
Funktion des Assemblerbeispieles
Dieses einfache Beispiel dient zur Erlernung des Turbo-Debuggers und zur Anwendung verschiedener
Adressierungsarten: In einer Programmschlaufe werden die 26 Gross-Buchstaben des Alphabetes aus
einer Tabelle im Speicher gelesen, auf Kleinschreibung umgewandelt und in eine zweite Tabelle in den
Speicher geschrieben. Dabei werden verschiedene indirekte Adressierungsarten verwendet, und es kann
auch der Zeichencode des IBM-PC studiert werden. Zudem soll die Fähigkeit des Turbo-Debuggers
gezeigt werden, direkt Assemblerbefehle zu übersetzen (Erzeugung von Opcode).
b)
Aufstarten und Programmtest
• Starten Sie den Debugger und laden das Programmbeispiel OPCOD mit dem Kommando
D86 OPCOD. Quittieren Sie die Meldung ”Program has no symbol-table” mit der Taste RETURN.
• Initialisierung des Programmes: Zu Beginn jedes Programmes muss das DS-Register initialisiert
werden und das Datenfeld im CPU-Window auf den richtigen Bereich gestellt werden. Dies wird
folgendermassen bewerkstelligt: mit Taste F7 (trace) werden die ersten zwei MOV-Befehle abgearbeitet, und nachher im Data-Window mit der Maus (rechte Taste) die Funktion ”Go to” angeklickt,
und anschliessend der gewünschte Wert DS:0 eingegeben. Später werden wir sehen, dass für
Zielsysteme auch der Stackpointer und das Stacksegmentregister durch das Programm initialisiert
werden müssen.
• Initialisieren der Adress- und Index-Register mit den folgenden drei Befehlen im Einzelschritt:
Taste F7 (Trace). Beobachten Sie die Änderungen im Register-Feld.
• ”Steppen” Sie das Programm mit der Taste F7 durch die folgenden sieben Befehle (Schleife 000E)
durch und beobachten Sie die Änderungen im Datenfeld und im Registerfeld: Welche Register
werden verändert? Was geschieht im Datenfeld?
• Setzen Sie einen Breakpoint am Schluss der Schleife (auf Befehl JMP 000E und lassen Sie
das Programm mit der Taste F9 (Run) jeweils einen Schleifendurchlauf ausführen.
• Warum entsteht nach 26 Durchläufen das Zeichen @ (AT-sign)? Was geschieht bei mehr als 32
Durchläufen?
• Löschen Sie den Breakpoint wieder und starten Sie das Programm mit F9 (Run). Die Endlosschlaufe bewirkt, dass der Rechner ”blockiert” ist (keine Ein-/Ausgaben mehr möglich!). Mit der
Tastenkombination Ctrl-""Break können sie das Programm unterbrechen und wieder im
Debugger arbeiten. Betrachten sie nun den gesamten Datenbereich DS:0000 . . . DS:FFFF und
interpretieren Sie den Inhalt.
c)
Manipulationen in Daten- und Befehls-Feld
• Modifikationen in den CPU-Registern: Ändern Sie das BX-Register auf einen passenden Wert (mit
Maus auf BX klicken und einfach mit neuem Wert überschreiben). Mit Taste F7 die Befehlsfolge
nochmals durcharbeiten und die Auswirkungen im Datenfeld beobachten.
16
Maschinencode der 8086-Prozessoren
• Beobachtungen im Datenfeld: Setzen Sie das Daten-Segment-Register DS auf denselben Wert wie
das Code-Segment-Register. Welche Daten beobachten Sie ab der Adresse DS:0000? An welcher
Offset-Adresse finden Sie die Daten ”ABCDEFG . . . ” wieder? Wenn Sie das DS-Register wieder
auf den ursprünglichen Wert setzen, und im Datenfenster unter die Adresse 0000 gehen (z.B.
auf FFE0), so sollten Sie wie vorher den Opcode des Codesegementes sehen: Warum ist dies
nicht der Fall? Stichwort ”segment wrap around”: Betrachten Sie die Anordnung von Code- und
Datensegment aufgrund der Linker-Map (Listing OPCOD Seite 2 unten).
• Vor dem JMP-Befehl sind zwei NOP-Befehle (No Operation) zum ”Füllen” vorhanden. Gehen
sie mit dem Cursor auf die Adresse 0016, und überschreiben Sie den NOP-Befehl mit dem Befehl
MOV DX,AX – kontrollieren sie den entstehenden Opcode. Ersetzen Sie nun diesen MOV-Befehl an
Adresse 0016 wieder mit einem NOP-Befehl – Wirkung auf die nachfolgenden Befehle? Erklären
Sie, warum anstelle des JMP-Befehls zwei neue Befehle SHR BL,1 und HLT entstanden
sind. Wie kann der JMP-Befehl wieder gerettet werden?
• Modifikationen bei den Befehlen: Ändern Sie den Befehl ADD AL,20h auf den Befehl
SUB AL,20h und durchlaufen Sie die Programmschlaufe mit sinnvollen Werten in BX und DI.
• Weitere Manipulationen nach Bedarf und Phantasie! Am Schluss der Debug-Sitzung verlassen Sie
den Debugger mit Alt-X.
Praktikum 10
Arithmetische Operationen
10.1 Software-Erstellung für die Ziel-Hardware
In den folgenden Praktika, haben Sie Gelegenheit diverse Befehle direkt zu erproben. Dazu muss jeweils
ein Assembler-Programm abgeändert werden. In diesem Abschnitt solle eine minimale Einführung in
die Assembler-Programmierung gegeben werden, welche in den folgenden Kapiteln noch ausführlich
behandelt werden wird.
Die Software-Erstellung ist für die Ziel-Hardware und für den PC praktisch identisch (siehe auch nächste
Seite):
1. Mit dem Editor wird ein neues Source-File erstellt oder ein schon bestehendes geändert.
Als einfacher Editor steht
Edit Pad Lite
zur Verfügung. Dieser ist über ein Symbol auf dem Desktop zu erreichen. (Oder unter Start Programme - Werkzeuge - Edit Pad Lite - Edit Pad Lite). Es könnte aber auch mit einem anderen
Editor gearbeitet werden.
Das File ist unter
[name].A86
zu speichern.
2. Das Source-File enthält die 8086-Assembler-Befehle im Textformat. Das File darf keine Steuerzeichen enthalten.
3. Mit dem Assembler wird das Source-File übersetzt. Es entsteht ein Object-File und ein Listing mit
gleichen Namen wie die Source.
A86 [name]
4. Das Object-File enthält binäre Informationen für den Linker: Programm-Code und DebuggingInformationen.
Achtung: Object-Files (name.OBJ) nie ausdrucken! Wegen der nichtdruckbaren Zeichen erhält man nur viele unlesbare Seiten.
5. Im Gegensatz zum Object-File ist das Listing für den Menschen bestimmt und darum im Textformat. Es enthält die formatierte Source-Information mit den berechneten Modul-Adressen und dem
Befehlscode, sowie alle gefundenen (Syntax-)Fehlermeldungen.
6. Für die Fehlersuche und Korrektur, sowie die Programmdokumentation wird das Listing (nicht
die Source) ausgedruckt. [name].LST mit Edit Pad Lite öffnen und aus diesem Editor auf dem
Default-Drucker ausdrucken.
18
Arithmetische Operationen
7. Nachdem die Übersetzung fehlerfrei verlaufen ist, kann das Object-File zu einem ausführbaren
File gelinkt werden:
L86 [name]
8. Das Executable-File enthält den ausführbaren Programm-Code im PC-Format. Das Programm
könnte also auch auf einem PC gestartet werden; allerdings mit ungewissem Ausgang (i.A. neu
booten).
9. Mit dem Monitor wird das Programm ins Zielsystem geladen und getestet. Dieser Schritt ist anders
als bei einem eigenständigen Zielsysten oder auf einem PC:
• Bei einem eigenständigen Zielsysten wird das Programm mit dem Locater an die vorbestimmte Adresse geschoben und ins ROM gebrannt. Beim Systemstart steht es sofort zur
Verfügung.
• Auf dem PC muss ein aufgerufenes Programm von Command-Line-Interpreter (COMMAND.COM) in einen freien Memory-Bereich geladen werden, bevor es ausgeführt werden
kann.
• Beim EVA-Board wird das Programm durch den Monitor (PC-Programm) ins RAM des Zielsystems (nicht des PCs) geladen. Die Ladeadresse kann angegeben werden. Falls keine speziellen Gründe vorliegen, soll die Ladeadresse von 2000:0H beibehalten werden.
M86 [name]
Achtung: Für das Laden des Programms muss die Trace-Logik ausgeschaltet sein. Das
heisst
RUN
TRACE
ist eingerastet und die grüne LED muss brennen.
Software-Erstellung für die Ziel-Hardware
10.1.1 Software-Entwicklungsprozess
1. Editor
2. Source-File: name.A86
3. Assembler
4. Object-File: name.OBJ
5. Listing: name.LST
7. Linker
6. Spooler
8. Executable: name.EXE
9. Loader / Debugger
Zielsystem
19
20
Arithmetische Operationen
10.1.2 Minimal Einführung in den Aufbau eines Assembler-Programms
Abgesehen von der unterschiedlichen Mächtigkeit der Befehle, gelten für Assembler-Programme etwas
andere Regeln als für Pascal-Programme:
Pascal
Assembler
Befehlsabgrenzung
durch Semikolon
durch Zeilenende
Kommentarbegrenzung
von ”{” bis ”}”
von Semikolon bis zum Zeilenende
Programmstart
immer nach BEGIN des
Hauptprogramms
durch Definition eines Labels und
END Label Anweisung
Zeilenaufteilung
Einrückung entspricht der
Schachtelungstiefe
Feste Kolonnen für Label/Symbole,
Befehle und Operanden
Symbolreferenzen
Symbole müssen vor der Verwendung definiert sein (keine Vorwärtsreferenzen)
Symbole können vor oder nach der
Verwendung definiert sein
Label-Syntax
Es sind nur Zahlen erlaubt
Es sind nur Symbole erlaubt. Diese müssen mit einem Buchstaben beginnen.
Das folgende Bild soll die erwähnten Unterschiede verdeutlichen:
␣␣ ␣
␣PROGRAM␣Beispiel;␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣NAME␣␣␣␣Beispiel␣␣␣␣␣␣␣␣␣␣␣
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣{␣Kommentar␣bis␣zur␣␣␣␣␣␣␣␣␣␣␣␣␣;␣Kommentar␣bis␣zum␣Zeilenende␣␣␣␣␣␣␣␣␣
␣␣␣schliessenden␣Klammer␣}␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣CONST␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣;Definition␣von␣Symbolen␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣x␣=␣1;␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣x␣␣␣␣␣␣␣␣␣␣␣EQU␣␣␣␣␣1␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣y␣=␣0;␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣y␣␣␣␣␣␣␣␣␣␣␣EQU␣␣␣␣␣0␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣LABEL␣99;␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣Code_Seg␣␣␣␣SEGMENT␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣BEGIN␣{des␣Hauptprogramms}␣␣␣␣␣␣Start:␣␣␣␣␣;␣des␣Hauptprogramms␣␣␣␣␣␣␣␣
␣␣␣...␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣...␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣Anweisung;␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣Befehl␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣Anweisung;␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣Befehl␣␣Operand␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣Anweisung;␣Anweisung;␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣Befehl␣␣Operand,␣Operand␣␣␣
␣␣␣...␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣...␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣GOTO␣99;␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣JMP␣␣␣␣␣Weiter␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣...␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣...␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣99:␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣Weiter:␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣Code_Seg␣␣␣␣ENDS␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣END.␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣␣END␣␣␣␣␣Start␣␣␣␣␣␣␣␣␣␣␣␣␣␣
␣␣␣
Software-Erstellung für die Ziel-Hardware
21
10.1.3 Hinweise zum EVA-Monitor
a)
Allgemeines und Aufruf
Der EVA-Monitor wurde im Rahmen einer Diplomarbeit am TWI entwickelt, um den EV80C186-SingleBoard-Computer von einem PC aus über eine mausunterstützte Benutzeroberfläche, einfach und ohne
grosses Auswendiglernen von Monitorbefehlen, bedienen zu können. Mit dem EVA-Monitor können
die mit DOS-Entwicklungswerkzeugen (Assembler, Linker) erzeugten Programme ins EVA-Board geladen und dann unter Kontrolle des Monitors abgearbeitet werden. Die Aufbau, die Bedienung und die
Darstellungen sind praktisch gleich wie beim Turbo-Debugger.
Der EVA-Monitor wird aufgerufen mit dem Befehl:
M86 [programmname]
b)
Programmtechnische Voraussetzungen
Damit das Programm richtig geladen werden kann, müssen gewisse Voraussetzungen erfüllt sein. Die
Erklärung der einzelnen Anweisungen folgt schrittweise in den folgenden Kapiteln.
1. Das Programm muss eine Startadresse aufweisen.
Das heisst, hinter der END-Anweisung muss ein (definiertes) Label stehen, welches die ProgrammStartadresse angibt.
Code_Seg
SEGMENT
...
Start:
;Programm-Startadresse
...
Code_Seg
ENDS
END
Start
;Startadresse bestimmen
Beim Laden eines Programms setzt der Monitor das Code-Segment-Register und den InstructionPointer automatisch auf diese Startadresse. Programme können also innerhalb des Code-Segments
an einer beliebigen Stelle beginnen.
2. Es muss ein Stack-Segment vorhanden sein, das genau so zu definieren ist:
Stack_Seg
Stack_Seg
SEGMENT STACK ’STACK’
DW
256 DUP (?)
ENDS
Beim Laden eines Programms setzt der Monitor das Stack-Segment-Register und den Stack-Pointer automatisch auf dieses. Ohne das Stack-Segment kann der Monitor nicht arbeiten und bricht
ab.
22
Arithmetische Operationen
10.2 Praktikumsanleitung
10.2.1 Entwicklungsumgebeung
Der am Hex-Codierschalter anstehende Wert soll eingelesen und an den LEDs als Balken von entsprechender Länge angezeigt werden.
Port 706H
14
0
2
12
4
10
8
6
Word-Port 700H
A : B4
B : B5
C : B6
D : B7
Leuchtbalken
B15
B8
B7
B0
Im Programm wird der Befehl SHR reg,CL benutzt, der eigentlich erst später im Stoff behandelt
wird. Er wird hier darum kurz erklärt: Im Register (reg) werden von links Nullen eingeschoben und
zwar soviele, wie im Register CL steht. Jedes Mal wenn eine Null eingeschoben wird, rutschen die
vorherigen Bits um eine Stelle nach Rechts. Das LSB fällt“ rechts aus dem Register.
”
Den entsprechenden Befehle gibt es auch für die andere Richtung: SHL reg,CL
a) Das vorbereitete Programm leuchtb.a86 soll assembliert werden. Kontrollieren Sie, ob dabei
Fehler auftreten und korrigieren Sie diese.
b) Drucken Sie das Listing aus und studieren Sie es sorgfältig.
c) Linken Sie das Programm.
d) Laden Sie das Programm ins Zielsystem und testen Sie aus.
e) Entfernen Sie den Befehl JMP FOREVER aus dem Programm und durchlaufen Sie es im Einzelschritt. Was geschieht, wenn Sie bei Programmende ankommen? Wie verhält sich das System von
aussen betrachtet, wenn Sie das Programm starten?
f) Ändern Sie das ursprüngliche, korrigierte Programm, so dass nur bei jeder zweiten Schalterstellung
eine Änderung an der Anzeige eintritt.
g) Ändern Sie das Programm weiter, so dass von beiden Seiten ein Leuchtbalken erscheint.
Anmerkung: Falls der Stack-Pointer oder Stack-Segment-Register auf einen anderen Adressbereich
gesetzt werden, stürzt“ das Zielsystem mit grosser Wahrscheinlichkeit ab −→ Es muss rückgesetzt und
”
das Programm neu geladen werden.
Praktikumsanleitung
23
.................................................................................................................
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
;**************************************************************************
; (C) Technikum Winterthur Ingenieurschule -- Technische Informatik TIn
;**************************************************************************
NAME
LEUCHTBALKEN
;**************************************************************************
; PROGRAMM :
LEUCHTB.A86
; ZWECK
:
Einführungsbeispiel für das Zielsystem EV80C186:
;
Vom Codierschalter gesteuerte Leuchtbalkenanzeige.
;**************************************************************************
; AUTOR:
DATUM:
AENDERUNG:
;
;**************************************************************************
Dunkel
Schalter
LED_Anzeige
EQU
EQU
EQU
Stack_Seg
SEGMENT STACK ’STACK’
DW
256 DUP (?)
ENDS
Stack_Seg
Code_Seg
0FFFFh
0706h
0700h
; Bitmuster für alle LED aus
; Port-Adr. vom Codierschalter
; Port-Adr. der LED-Anzeige
SEGMENT
ASSUME CS: Code_Seg
ASSUME SS: Stack_Seg
; CS wird vom Monitor gesetzt
; SS wird vom Monitor gesetzt
IN
AL, Schalter
; Codierschalter einlesen
MOV
SHR
MOV
CL, 4
AL, CL
CL, AL
; Register CL gleich dem Wert des
; höherwertigen Nibbles vom
; Register AL setzen
MOV
AX, Dunkel
; AX mit Einsen (=dunkel) füllen
SHR
AX, CL
; Variable Anzahl Nullen (=hell) von
; links ins Register AX schieben
MOV
OUT
JMP
ENDS
DX, LED_Anzeige ; Bitmuster an LED ausgeben
AX, DX
Forever
END
Forever
Forever:
Code_Seg
..............................................
Programm 10.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
24
Arithmetische Operationen
10.2.2 Arithmetische Befehle
• Laden Sie das für Sie vorbereitete Programm ex 12p1.exe, in den Monitor und lassen Sie es
Befehl für Befehl ablaufen. Beobachten und begreifen Sie dabei die Veränderungen bei Resultat
und Flags.
• Auf dem EVA-Board sehen Sie 16 DIP-Schalter und 16 LED, welche jeweils auf zwei Blöcke
zu 8 Stück verteilt sind. Schreiben Sie ein Programm, welches die Zahlen an den beiden Schalterblöcken einliest und die Summe auf dem linken und die Differenz auf dem rechten der beiden
LED-Blöcke angezeigt. In der Datei ex 12p2.a86 finden Sie den vorbereiteten Rahmen für Ihr
Programm.
• Setzen Sie nach dem ADD- und nach dem SUB-Befehl einen Breakpoint und vergleichen Sie den
Zustand der Flags mit dem von Ihnen berechneten Zustand. Sie können so auf einfache Art und
Weise die Resultate der von Ihnen gelösten Übungen kontrollieren.
Praktikum 11
Logische- und Shift-/Rotate-Befehle
11.1 Beobachten der Befehlsabl äufe
Laden sie im Turbo Debugger die Datei logrot.exe und beobachten sie, was beim Ablauf der einzelnen Befehle passiert.
11.1.1
Erstellen eines eigenen Programmes
Das folgende Beispiel soll im Editor geschrieben, mit dem Assembler übersetzt, mit dem Linker gelinkt
und mit dem Monitor auf dem Zielsystem getestet werden.
Über die Schiebeschalter Bit 0. . . 3 und Bit 8. . . 11 werden die Einer- und die Zehner-Stelle einer BCDZahl eingelesen. Die zwei Ziffern sollen so kombiniert werden, dass die BCD-Zahl an den LED-Bits
0. . . 7 und der entsprechende Binärwert an den LED-Bits 8. . . 15 angezeigt wird. Es sollen nur gültige
BCD-Ziffern (0. . . 9) eingestellt werden. (Das Programm macht keine Überprüfung.)
L E D
B it
L E D
1 5 1 4 1 3 1 2 1 1 1 0
9
8
7
6
5
4
B it
3
2
1
0
7 0 1 h
7 0 0 h
B in ä r - W e r t
S c h a lte r
1 5 1 4 1 3 1 2 1 1 1 0
A u s g a b e = 0
L E D le u c h te t
B C D - Z e h n e r B C D - E in e r
B it
9
S c h a lte r
8
7
6
5
4
3
2
B it
1
S c h a lte r
0
7 0 5 h
7 0 4 h
B C D -Z e h n e r
B C D - E in e r
1
0
26
Logische- und Shift-/Rotate-Befehle
Beispiel:
7 0 1 h
Eingabe der BCD-Ziffern Zehner = 4 und Einer = 3
1 5 1 4 1 3 1 2
0 0 1 0
1 1 1 0
1 0
9
8
1
1
B in ä r - W e r t
1 5 1 4 1 3 1 2
7 0 5 h
1 1 1 0
0 1
6
0
5
4
0
1
3
0
2
1
0
0
1
0
1
7 0 0 h
L E D
7 0 4 h
S c h a lte r
B C D - Z e h n e r B C D - E in e r
0
9
8
0
B C D -Z e h n e r
Vorbereitungen:
7
7
6
5
4
3
0
2
0
1
1
0
1
B C D - E in e r
Das Struktogramm und ein Programm-Entwurf sind in das Labor mitzubringen.
Praktikum 12
Assemblersprache 8086
12.1 Programm
Übersetzen Sie das in der Theorie verwendete Beispielprogramm Zahlenio.a86. Es enthält noch
einige Syntaxfehler, die Sie mit Hilfe des Listfiles Zahlenio.lst zuerst beheben sollen (natürlich
ohne in den Theorieblättern auf das Original zurückzugreiffen !). Anschliessend ist das Programm zu
linken und auf dem Zielsystem zu testen. Betrachten Sie auch die verschiedenen dabei entstehenden
Files mit einem Editor.
12.2 Anzeige der Drehschalter-Position
Gesucht ist ein Programm Drehscha.a86 für das EV186-Board, das die Stellung des Drehschalters
auf der 16-stelligen Balkenanzeige (von links nach rechts ansteigend) wahlweise auf vier verschiedene Arten darstellt: Säulenanzeige oder Punktanzeige, jeweils leuchtend oder dunkel. Die Auswahl der
Darstellung soll mit den zwei rechten Schiebeschaltern SW1 SW0 erfolgen:
Drehschalter
Schiebeschalter
0
SW1 SW0
12
4
LED - Balkenanzeige
15 14 13 12 11 10 9 8
7
6
5
4
3
2
1
0
0
8
1
2
PHEXDISP.DS4 / 25.7.96 / K
3
Vorbereitung: Erstellen Sie eine Programmdokumentation mit Analyse, Lösungsidee und Struktogramm in Ihrem Laborheft. Bringen Sie das vollständig geschriebene Quellenprogramm (auf FloppyDisk mit Programmkopf und Kommentaren) mit ins Praktikum.
Übersetzten und linken Sie das Zuhause geschriebene Assemblerprogramm Drehscha.a86 auf dem
PC und testen es auf dem Zielsystem. Drucken Sie auch ein Listing Ihres übersetzten und lauffähigen
Programmes aus.
Praktikum 13
Vergleichs- und Sprungbefehle
13.1 Beobachten von Befehlsabl äufen
Laden sie im Turbo Debugger die Datei cmpjmp.exe und beobachten sie, was beim Ablauf der einzelnen Befehle passiert.
13.2
Erstellen eines eigenen Programmes
Die folgenden Beispiele sollen im Editor geschrieben, mit dem Assembler übersetzt, mit dem Linker
gelinkt und mit dem Monitor auf dem Zielsystem getestet werden.
a) Über die Schiebeschalter Bit 0. . . 3 und Bit 8. . . 11 werden die Einer- und die Zehner-Stelle einer BCD-Zahl eingelesen. Die zwei Ziffern sollen so kombiniert werden, dass die BCD-Zahl an
den LED-Bits 0. . . 7 und der entsprechende Binärwert an den LED-Bits 8. . . 15 angezeigt wird.
Im Unterschied zu der bis zu dieser Stelle gleichlautenden Aufgabe des Praktikums zu Logische”
Befehle und Shift-/Rotate-Befehle“ dürfen auch ungültige, also Nicht-BCD-Ziffern (A. . . F), eingestellt werden. In diesem Falle soll die Anzeige des Binär-Wertes dunkel gesteuert werden und
die Anzeige der entsprechenden BCD-Ziffer abwechslungsweise in einem durch Sie bestimmten
Rhythmus mit den Werten 0h und 0Fh angesteuert werden.
b) Über die Schiebeschalter 0. . . 15 wird ein Wert eingegeben. Zählen sie die Anzahl Einsen (”1”)
und stellen sie diese Anzahl in Form eines Leuchtbalkens an den LED dar (es leuchten so viele
LED, wie Einsen im Wert enthalten waren).
c) Voraussetzung ist die Aufgabenstellung Praktikum zu Arithmetische Befehle“, Aufgabe 2.
”
Ergänzend zu der erwähnten Aufgabenstellung soll der Zustand der beiden Flags CF und OF sichtbar gemacht werden. Dazu werden die senkrechten Balken der 7-Segment-Anzeige verwendet. Die
oberen Balken zeigen das CF und die unteren Balken das OF jeweils von Summe und Differenz.
Die Flagzustände aus den Summen sollen links, die Flagzustände aus der Differenz sollen rechts
dargestellt werden.
P o rt 7 0 2 H
B 5
C F a u s S u m m e
O F a u s S u m m e
B 4
B 1
C F a u s D iffe r e n z
B 2
O F a u s D iffe r e n z
Praktikum 14
Strukturierte Codierung in Assembler
Das folgende Beispiel soll im Editor geschrieben, mit dem Assembler übersetzt, mit dem Linker gelinkt
und mit dem Monitor auf dem Zielsystem getestet werden.
• Es soll geprüft werden, ob die Taste 0 gedrückt ist oder nicht. Ist sie gedrückt, so soll an der 7Segmentanzeige das Zeichen ’E’ für Ein, ist sie nicht gedrückt das Zeichen ’A’ für Aus angezeigt
werden.
• Im Zustand Taste Ein wird der Wert der Schiebeschalter Bit 0. . . 7 gelesen und auf einen gültigen
3 aus 8 Code (genau drei Einsen in acht Bit) geprüft. Ist der Wert ein gültiger Code, wird er an den
LED Bit 0. . . 7 angezeigt. Ist er ungültig, werden die Anzahl Einsen an den LED angezeigt. Die
LED Bit 8. . . 15 sind dunkel.
• Im Zustand Taste Aus wird der Wert der Schiebeschalter Bit 8. . . 15 gelesen und geprüft, ob es
sich um eine gültige BCD-Ziffer (0. . . 9) handelt. Ist der Wert ein gültiger Code, wird er in den
entsprechenden ASCII-Code umgewandelt und an den LED Bit 8. . . 15 angezeigt, ist er ungültig,
bleibt die Anzeige dunkel. Die LED Bit 0. . . 7 sind dunkel.
T a s te n
2
1
3
7 0 6 h
T 3
T 2
7 - S e g m e n t- A n z e ig e
0
T 1
B 0
B it
B 5
T 0
B 4
B 2
B 7
B 3
L E D
B it
1 5 1 4 1 3 1 2 1 1 1 0
L E D
9
8
7
6
5
4
7 0 2 h
B 1
B 6
3
B it
2
1
0
7 0 1 h
7 0 0 h
A S C II-C o d e
S c h a lte r B it
1 5 1 4 1 3 1 2 1 1 1 0 9
8
A n z a h l- E in e r
7
6
S c h a lte r B it
5 4 3 2 1
7 0 5 h
S c h a lte r
0
7 0 4 h
B C D
Vorbereitungen:
A u s g a b e = 0
L E D le u c h te t
3 a u s 8 -C o d e
1
0
Das Struktogramm und ein Programm-Entwurf sind in das Labor mitzubringen.
Praktikum 15
Datentypen
15.1 Bildschirm ansteuern
15.1.1 Ziele des Versuchs
In diesem Versuch sollen beliebige Elemente in einem zweidimensionalen Array adressiert werden.
Aufgabenstellung
a) Es soll ein Programm erstellt werden, das den Bildschirm des PCs mit einer bestimmten (vom
Ihnen wählbaren) Farbe löscht (neu überschreibt).
b) Im einem Bildschirmfeld von 16*16-Zeichen sollen alle möglichen Zeichen dargestellt werden.
c) Daneben soll das Zeichen ’*’ mit allen möglichen Attributen dargestellt werden.
d) Rund herum soll einem beliebiger Rahmen gezeichnet werden.
15.1.2 Kleine Einführung in die Bildschirmansteuerung des PCs
Bekanntlich stellen PCs unter DOS den Applikationen maximal 640 KByte Speicher zur Verfügung,
wobei die Prozessoren 80x86 aber (mindestens) 1 MByte adressieren können. Der Grund für diese Einschränkung liegt darin, dass auf dem PC der restliche Adressbereich für andere Zwecke reserviert ist.
So wird der Adressbereich ab der physikalischen Adresse B8000h als Bildspeicher verwendet. Das
heisst, der Video-Controller (Hardware!) liest den Speicher ab dieser Adresse regelmässig aus und zeigt
die entsprechenden Zeichen am Bildschirm an.
0 0 0 0 0
B ild s p e ic h e r
B 8 0 0 0
F F F F F
V id e o C o n tr o lle r
2 5
8 0
34
Datentypen
Bildschimspeicher-Layout: Das erste Zeichen (Word an der Adresse B8000h) wird von VideoController auf dem Bildschirm oben links dargestellt; das folgende Word (Adresse B8002h) entspricht
dem Zeichen rechts vom ersten u.s.w.. Das letzte Zeichen (Word an der höchsten Adresse B8FCEh) wird
also auf dem Bildschirm ganz unten rechts dargestellt.
Zeichencodierung: Im Text-Modus (Standard nach dem Einschalten) wird jedes Bildschirmzeichen
durch ein Word (zwei Bytes) dargestellt. Das erste Byte beinhaltet den ASCII-Code des darzustellenden
Zeichens; das folgende Byte definiert die Attribute:
Z e ic h e n a u fb a u ( 2 B y te s p r o Z e ic h e n ) :
6
1 . B y te ( lo w e r ) :
7
2 . B y te ( h ig h e r ) :
5
4
3
2
1
0
2
1
0
A S C II-C o d e
7
6
5
4
3
F a rb e
B o ld
F a rb e
Z e ic h e n fa r b e
H in te r g r u n d fa r b e
B lin k e n
B la u
G rü n
R o t
Die folgenden Tabelle zeigt alle möglichen Farbkombinationen, wobei die rechte Spalte mit I=1 für den
Hintergrund nicht zur Verfügung steht:
I R
0 0
0 0
0 0
0 0
0 1
0 1
0 1
0 1
G
0
0
1
1
0
0
1
1
B
0
1
0
1
0
1
0
1
Farbe
schwarz
blau
grün
türkis
rot
violett
braun
hell-grau
colour
black
blue
green
cyan
red
magenta
brown
light-gray
I
1
1
1
1
1
1
1
1
R
0
0
0
0
1
1
1
1
G
0
0
1
1
0
0
1
1
B
0
1
0
1
0
1
0
1
Farbe
dunkel-grau
hell-blau
hell-grün
hell-türkis
hell-rot
hell-violett
gelb
weiss
colour
dark-grey
light-blue
light-green
light-cyan
light-red
light-magenta
yellow
white
Anmerkung: Solche technischen Details, wie zum Beispiel die obige Adresse B8000h sind allgemein
bekannt. Oft sind sie jedoch nicht spezifiziert und hängen von diversen Faktoren ab, wie zum Beispiel
dem eingestellten Modus der Grafik-Karte oder im schlimmeren Fall auch vom Hersteller derselben.
Es ist schlicht unprofessionell Programme auf Internals“ aufzubauen, auch wenn in Zeitschriften und
”
Fachbücher häufig das Gegenteil behauptet wird.
Bildschirm ansteuern
35
15.1.3 Daten- und Programmstruktur
Logisch betrachten wir den Bildspeicher (im folgenden mit BS bezeichnet) als zweidimensionales Array
mit den Dimensionen Zeile (0..24) und Kolonne (0..79) → BS : ARRAY[0..24,0..79]
B S [0 ,0 ]
B S [0 ,7 9 ]
B S [Z e ile ,K o lo n n e ]
B S [2 4 ,7 9 ]
Wir verwenden Index-Bereiche, die bei Null beginnen, weil die Codierung so einfacher wird. Zudem
legen wir fest, dass das Array-Element BS[0,0] oben links und BS[24,79] unten rechts angezeigt werden
soll.
Zum Löschen des Bildschirms könnte man also folgendes Struktogramm verwenden:
In itia lis ie r u n g
Z e ile := 0
W H IL E Z e ile < = 2 4
K o lo n n e := 0
W H IL E K o lo n n e < = 7 9
B S [Z e ile , K o lo n n e ] := F a r b e
K o lo n n e := K o lo n n e + 1
Z e ile := Z e ile + 1
D O S - E x it
36
Datentypen
15.1.4 Hinweise zur Codierung
a)
Array-Zugriff
Die Codierung der WHILE-Schleifen wurde in der Theorie behandelt und wird hier nicht mehr behandelt. Wie erfolgt aber die Codierung des folgenden Statements?
BS [Zeile, Kolonne] := Farbe
Lösungsidee: Da das Programm keine anderen Daten als den Bildspeicher behandeln muss, kann das
Datensegment direkt an die Anfangsadresse des Bildspeichers (B8000h) gelegt werden. Die beiden Laufvariablen (Zeile, Kolonne) können in Registern gehalten werden.
0 0 0 0 0
B 8 0 0 0
B S [ Z e ile , K o lo n n e ]
B ild s p e ic h e r
D S
O ffs e t=
2 * ( Z e ile * 8 0 + K o lo n n e )
F F F F F
Die Array-Element werden indirekt adressiert, wobei die Offset-Adresse nach obiger Formel zu berechnen ist. Die Interpretation sei dem Leser überlassen.
b)
Programmende
Dieses Programm ist nicht für ein Zielsystem gedacht. Das heisst, es hat keine Endlosschleife und muss
am Ende die Kontrolle wieder dem Betriebssystem übergeben. Dazu muss der Code für Program Exit“
”
(siehe DOS-Handbuch) ins Register AH geladen und ein Software-Interrupt (wird später behandelt)
ausgelöst werden:
;----------------------------------------------------;
Programm beenden:
;----------------------------------------------------MOV
AH,4Ch
; Code für "Program Exit"
INT
21h
; Software Interrupt
;
Hierher kommen wir nie mehr zurück
;-----------------------------------------------------
Praktikum 16
Unterprogramme und Stack
Die folgenden drei Unterprogramme sollen zuhause als Übung geschrieben werden, und im Praktikum
in einem Rahmen-Hauptprogramm (Testbett) mit dem Turbo-Debugger getestet werden:
16.1 Unterprogramm Searchmax
Schreiben Sie ein Unterprogramm Searchmax, welches in der Tabelle z_tab (enthält 16-Bit IntegerWerte) den grössten Wert sucht und in Register AX zurückgibt.
Schnittstellen: Die Anzahl der Elemente steht in der Variablen anzahl und soll vor dem Aufruf ins
Register CL, die Adresse der Zahlentabelle z_tab ins Register BX geladen werden. Nach dem Aufruf
der Prozedur Searchmax soll der Maxiamlwert in die Variable max gespeichert werden.
16.2 Unterprogramm Fill
Schreiben Sie ein Unterprogramm Fill, welches einen Speicherbereich mit einem bestimmten Wert
füllt, welcher dem Unterprogramm im Register AX übergeben wird. Die Anfangsadresse des Speicherbereiches wird im Register DI übergeben und die Anzahl zu füllender Worte im Speicher wird als Wertparameter im Register CX überbeben.
Achtung! Adressüberlauf beachten: Wenn die Anfangsadresse der Tabelle zusammen mit der Anzahl
Worte (*2) grösser als FFFFh wird, so entsteht ein ”address-wrap-around”, d.h. die Werte werden wieder
zuunterst im Segment eingeschrieben. Dieser Fall soll abgesichert werden, indem nie auf Adressen ӟber
FFFFh” geschrieben wird.
38
Unterprogramme und Stack
16.3 Unterprogramm Stack mal 10
Ein Unterprogramm wird mit der folgenden Befehlssequenz aufgerufen:
PUSH
CALL
CX
Stack_mal_10
Im Unterprogramm soll der Wert, welcher vom CX in den Stack geladen wurde, vom Stack wieder geholt
werden und der zehnfache Wert im Register AX zurückgegeben werden. Entwerfen Sie die Befehlsfolge
des Unterprogrammes stack_mal_10.
Hinweis: Adressierung via BP geht in den Stack!
Praktikum 17
String-Operationen
In diesem Praktikum realisiere und teste man ein Unterprogramm StringCopy mit Hilfe von StringOperationen.
Aufgabe: Ein Buffer mit Länge 15, der einen NUL-terminated String“ enthält, soll in einen zweiten
”
Buffer gleicher Länge umkopiert werden, so dass allfällige führende Leerzeichen (Blanks) unterdrückt
werden. Der Rest des Buffers soll mit NUL gefüllt werden. Falls der Quellen-Buffer irrtümlicherweise
kein NUL enthält, soll im Ziel-Buffer das letzte Zeichen durch NUL ersetzt werden.
Die Buffer seien beide im Daten-Segment. Die Offset-Adressen des Quellen- und des Ziel-Buffers werden in den globalen Word-Variablen SrcPtr und DstPtr übergeben.
Lösungsidee:
• Beginnend mit dem Buffer-Anfang, sucht man das erste Zeichen, das nicht Blank ist.
• Man lässt einen Zeiger stehen und sucht weiter bis zum Buffer-Ende oder bis zu einem NUL und
setzt einen zweiten Zeiger.
• Man kopiert den Bereich zwischen dem ersten und dem zweiten Zeiger in den Ziel-Buffer.
• Man füllt den Rest des Ziel-Buffers mit NUL.
Vorbereitung:
a) Erstellen Sie eine möglichst vollständige Liste von (Test-)Fällen (Input- und Output-Daten).
b) Man entwerfe ein Unterprogramm StringCopy.
Praktikum 18
Codewandlung
Das folgende Beispiel soll im Editor geschrieben, mit dem Assembler übersetzt, mit dem Linker gelinkt
und mit dem Monitor auf dem Zielsystem getestet werden.
Es sollen zwei unterschiedliche Codwandlungen mit dem selben Unterprogramm durchgeführt werden
(mehrere Aufrufe des Unterprogrammes mit unterschiedlichen Parametern).
L E D
B it
1 5 1 4 1 3 1 2 1 1 1 0
9
L E D
8
7
6
5
4
B it
3
2
1
0
7 0 1 h
7 0 0 h
K e in A S C II- C o d e
H e x
B 0
B 5
B 6
B 4
S c h a lte r
7 0 2 h
B 1
7 - S e g m e n t- A n z e ig e
B 2
B 3
B 7
A u s g a b e = 0
L E D le u c h te t
7
6
5
4
3
B it
2
A S C II-C o d e
1
0
S c h a lte r
7 0 4 h
1
0
Über die Schiebeschalter Bit 0. . . 7 wird ein ASCII-Wert eingegeben. Ist der eingegebene Wert ein
ASCII-Code für die Zeichen 0. . . 9, a. . . f oder A. . . F, so soll an den LED Bit 0. . . 7 der entsprechende Hex-Code und an der 7-Segment-Anzeige das entsprechende Zeichen angezeigt werden. Die LED
Bit 8. . . 15 bleiben dunkel.
Ist der eingegebene Wert keines der oben genannten Zeichen, so sollen die LED Bit 0. . . 7 dunkel, die
LED Bit 8. . . 15 eingeschaltet sein.
Herunterladen