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.