1 WH Zwickau (FH) FB PT/Informatik Fachgr. Informatik Prof. Dr.-Ing. L.Krauß Praktikum Informationstechnik für STG Informatik Compi16w.doc word 2000 09.10.2003 Computersimulation COMPI16W Das Praktikum soll dazu dienen, das Verständnis für die prinzipielle Arbeitsweise von Digitalrechnern zu vertiefen. Hauptinhalt ist die Demonstration interner Arbeitsabläufe in einem Computer. Dazu gehören das Zusammenwirken von Prozessor, Speicher und Peripherie und vor allem der Mechanismus der zyklischen Befehlsabarbeitung (zentrale Steuerschleife). Auf dem Monitor des Praktikumsrechners wird dazu eine Computerarchitektur nachgebildet. Einzelne grafische Gestaltungsmittel erlauben es, die notwendigen Abläufe bei der Abarbeitung eines mit Assembler erstellten Programms zu verfolgen. Die Programmierung des Modellcomputers ist zwar für die Darstellung und Verständnis der Abläufe notwendig, jedoch nicht Schwerpunkt des Praktikums. Das Programm besteht aus den Dateien compi16.bat (Start des Programms) und dem Java-Programm compi16.jar. Erforderlich ist die installierte JAVA-Virtual Machine. Inhalt: 1 Der Simulator 2 1.1 Allgemeine Informationen ............................................................................................... 2 1.2 Bildschirmaufbau ............................................................................................................. 2 1.3 Bedienung des Simulators ................................................................................................ 3 Allgemeine Funktionen ...................................................................................................... 3 Funktionen zur Ablaufsteuerung ........................................................................................ 4 Funktionen zur Manipulation des Modellcomputers ......................................................... 4 2 Befehle und Befehlsausführung .......................................................................................... 5 2.1 Adressierungsarten ........................................................................................................... 5 2.2 Befehlsformat ................................................................................................................... 5 2.3 Datenformat ...................................................................................................................... 5 2.4 Befehlsübersicht ............................................................................................................... 6 2.4.1 Sprungbefehle, Steuerbefehle.................................................................................... 6 2.4.2 Arithmetische, logische, Transportbefehle, Ein-/Ausgabebefehle ............................ 7 3 Der Assembler 8 3.1 Format von Assembleranweisungen ................................................................................ 8 3.2 Pseudobefehle................................................................................................................... 9 3.3 Hinweise zu Daten ........................................................................................................... 9 3.4 Beispielprogramm .......................................................................................................... 10 3.4 Bedienung des Assemblers............................................................................................. 10 Allgemeine Funktionen .................................................................................................... 11 Funktionen zur Ablaufsteuerung ...................................................................................... 11 4 Der Linker ......................................................................................................................... 11 4.1 Bedienung des Linkers ................................................................................................... 12 Allgemeine Funktionen .................................................................................................... 12 Funktionen zur Ablaufsteuerung ...................................................................................... 13 5 Schema zur Programmerstellung für COMPI16 13 6 Aufgabenstellung und Praktikumsdurchführung 13 7 Protokoll 17 2 1 Der Simulator 1.1 Allgemeine Informationen Unter der Karteikarte Rechner ist der Simulator des Compi16 zu finden, er stellt alle inneren Bestandteile und einige Ein- und Ausgabe-Geräte des Modellcomputers dar. Mit ihm werden die entwickelten Programme, die assembliert und verlinkt als *.lad Dateien vorliegen, ausgeführt und getestet. Während der Ausführung der Anweisungen eines Programms werden die Vorgänge im Rechner durch Animationen visualisiert. 1.2 Bildschirmaufbau Die folgende Abbildung zeigt den Bildschirmaufbau des Rechners. Die Komponenten des Modellcomputers haben folgende Bedeutung: Hauptspeicher Der Hauptspeicher des Modellcomputers ist ausschnittsweise dargestellt. Der Speicher des Compi16 ist wortweise organisiert und umfasst 512 Speicherstellen. Adressregister Dieses Register enthält die Adresse der aktuellen Speicherzelle, auf die sich Speicherzugriffe beziehen. 3 Ablaufsteuerung Dies sind die durch Linien dargestellten Verbindungen zwischen den Komponenten, auf ihnen wird die komplexe Ablaufsteuerung aller Prozesse stilisiert als Pfeil-Animation im Modellcomputer dargestellt. Tastaturpuffer Dieses Pufferregister speichert die über Tastatur eingegebenen Zeichen (im ASCII-Code), bis sie vom Programm gelesen werden. Der Puffer umfasst maximal 128 Zeichen. Akkumulator Das Akkumulatorregister des Prozessors kann maximal 15 Bit breite Daten aufnehmen. Das 16. Bit wird zur Unterscheidung von Befehlen (1) und Daten (0) verwendet. Operandenregister Dient bei entsprechenden Operationen als Zwischenspeicher für den zweiten Operanden. Ergebnisregister Dient bei entsprechenden Operationen als Zwischenspeicher für das Resultat, das dann in den Akkumulator übertragen wird (Ausnahme CMP-Befehl). Ergebnis- und Operandenregister sind sonst im Prozessor transparent. Befehlsregister Es nimmt den abzuarbeitenden Befehl auf. BZ Befehlszähler ALU Arithmetisch-logische Einheit, arithmetic-logic unit Flags Diese Komponente stellt die Flags des Prozessors dar. <=>: Wenn das entsprechende Bit auf "1" gesetzt ist, so war das Ergebnis der letzten arithmetischen Operation bzw. des CMP-Befehls kleiner, gleich oder größer Null. E: Extension-Flag für Verschiebeoperationen Stack und SP Kellerspeicher mit entsprechendem Kellerzeiger, das Fassungsvermögen des Stacks beträgt maximal 4 Worte. Bildschirm Display des Modellcomputers. Es umfasst 22x7 Zeichen. Der Ausgabebefehl wandelt den ASCII-Code in das entsprechende Zeichen um. Mode Anzeige des aktuellen Arbeitszustandes des Modellcomputers. 1.3 Bedienung des Simulators Die Bedienung des Simulators unterteilt sich in die Bereiche Allgemeine Funktionen, Funktionen zur Ablaufsteuerung und Funktionen zur Manipulation des Modellcomputers. Allgemeine Funktionen Diese Funktionen sind über das Menü oder die Werkzeugleiste im oberen Teil des Fensters erreichbar. Sie stellen die elementaren Funktionen zur Bedienung bereit. Öffnen Öffnen bzw. Laden von assemblierten und verlinkten Programmen als *.lad Datei in den Arbeitsspeicher des Modellcomputers. Zurücksetzen Setzt den Modellcomputer in den Ursprungszustand zurück, d.h. es werden alle Speicherstellen und Register auf Null gesetzt und Bildschirm und Tastaturpuffer gelöscht. 4 Mn / Bn Ändert den Anzeigemodus des Modellcomputers, er wechselt zwischen den Modi Binär (alles in 0 und 1 dargestellt) und Mnemonisch (Befehle werden als Wörter und Zahlen als Zahlen dargestellt). Hex / Dec Wechselt im Modus Mnemonisch zwischen Dezimaler und Hexadezimaler Darstellung von Zahlen. Funktionen zur Ablaufsteuerung Diese Funktionen sind im unteren Teil des Fensters zu finden und dienen der Abarbeitung des Hauptspeichers, also geladener Programme des Modellcomputers. RUN Arbeitet das gesamte Programm kontinuierlich ab und beginnt dabei mit dem Befehl auf den der Befehlszähler zeigt. STEP Führt einen Schritt im Programm aus, d. h. es wird das Kommando ausgeführt auf das der Befehlszähler zeigt. BREAK Unterbricht die Abarbeitung eines Programms im Run-Modus, die Abarbeitung des aktuellen Kommandos wird aber noch beendet. SPEED Ändert die Abarbeitungsgeschwindigkeit des Modellcomputers. Mögliche Zustände sind: SLOW – Animationen laufen langsam ab, zur genauen Verfolgung der Abarbeitung MIDDLE – Animation laufen schneller ab, sind aber noch verfolgbar. FAST – Es werden keine Animationen in der Abarbeitung dargestellt, die Abarbeitung erfolgt in einem Schritt. Funktionen zur Manipulation des Modellcomputers Der Simulator bietet unterschiedliche Funktionen zur Manipulation des Modellcomputers. Die erste Möglichkeit zur Manipulation ist die Änderung des Inhalts von Speicherstellen, dies erfolgt durch Auswählen der Speicherstelle und Ändern. So ist es möglich, komplette Programme direkt in den Hauptspeicher einzugeben. Aus didaktischen Gründen wird die Änderung des Hauptspeichers nur im Binär-Modus erlaubt. Ermöglicht die Änderung des jeweiligen Registers (Akkumulator oder Befehlszähler) neben dem sich der Button befindet. Dazu wird ein separates Fenster geöffnet in dem ebenfalls aus didaktischen Gründen das Register nur im Binärmodus geändert werden kann. Die simulierten Ein- und Ausgabegeräte können ebenfalls manipuliert werden. Die Verwendung des Tastaturpuffers erfolgt in dem ASCII-Zeichen direkt in das Textfeld eingegeben werden. Der Tastaturpuffer wird von links abgearbeitet nach dem FIFO Prinzip 5 (First in First out). Er kann auch manipuliert werden z.B. durch Löschen von Zeichen in der Mitte des Puffers. CLEAR Dieser Button löscht den Inhalt des jeweiligen Gerätes unter dem es sich befindet. 2 Befehle und Befehlsausführung Der simulierte Prozessor kann verschiedene Befehle ausführen, die sich in folgende Befehlsgruppen untergliedern lassen: - Sprungbefehle - Transportbefehle - Ein-/Ausgabebefehle - arithmetische und logische Befehle - Steuerbefehle Jeder Befehl belegt genau ein Speicherwort mit 16 Bit, wobei zur Unterscheidung von Daten und Adressen das höchstwertige Bit (Bit 15) 1 ist. 2.1 Adressierungsarten Der Prozessor unterscheidet zwei Adressierungsarten; direkte und indirekte Adressierung. Bei der direkten Adressierung steht die Operandenadresse im Befehlswort und bei der indirekten (im engeren Sinne) steht im Befehlswort die Adresse einer Speicherzelle, in der die Operandenadresse zu finden ist. 2.2 Befehlsformat 15 14 1 13 12 11 10 Operationscode 9 8 7 6 In 5 4 3 2 1 0 Operandenadresse Bit15 = 1 ist Kennzeichen für einen Befehl. Bit 9 kennzeichnet die Adressierungsart. (0) direkt, (1) indirekt Bei Operationen mit zwei Operanden befindet sich ein Operand im Akkumulator und der andere im Speicher. COMPI16 ist also eine typische Einadressmaschine. Bei Befehlen ohne notwendiger Adressangabe sind die Bits 0-8 bedeutungslos. 2.3 Datenformat 15 0 14 13 12 11 10 9 8 7 6 5 4 3 2 1 Datum Bit15 = 0 ist Kennzeichen für ein Datum. Für Daten stehen 15 Bit zur Verfügung, wobei das höchste Datenbit (Bit 14) das Vorzeichen darstellt. Ist Bit 14 gesetzt handelt es sich um eine negative Zahl. (siehe 3.3 Hinweise zu Daten) 0 6 2.4 Befehlsübersicht 2.4.1 Sprungbefehle, Steuerbefehle Operationsname Operationsbeschreibung Flags <=> Flags <=> Kodierung Sprungbefehle JMP unbed. Sprung zur angegeb. Adresse 00111 JGT Sprung, wenn Größer-Flag gesetzt 001 00001 JEQ Sprung, wenn Gleich-Flag 010 00010 JGE Sprung, wenn Größer- od. Gleich-Flag 001 JLT Sprung, wenn Kleiner-Flag 100 JNE Sprung, wenn Nicht-Gleich 001 oder 100 00101 JLE Sprung, wenn Kleiner- od. Gleich-Flag 100 oder 010 00110 oder 010 00011 00100 Unterprogrammsprünge JSB Sprung zum UP mit Adresse 01000 RET Rücksprung 01001 Steuerbefehle HLT Halt 01011 NOP No Operation 00000 7 2.4.2 Arithmetische, logische, Transportbefehle, Ein-/Ausgabebefehle Operationsname Operationsbeschreibung Kodierung Operation mit 2 Operanden ADD Addieren des Operanden zum Inhalt des Akkumulators mit Flag-Beeinflussung 10000 SUB Subtrahieren des Operanden vom Inhalt des Akkumulators mit Flag-Beeinflussung 10001 AND Bitweise UND-Verknüpfung des Operanden mit dem Inhalt vom Akku ohne Flag-Beeinflussung 10010 IOR Bitweise ODER-Verknüpfung des Operanden mit dem Inhalt vom Akku ohne Flag-Beeinflussung 10011 XOR Bitweise Exclusive-ODER-Verknüpfung ohne Flag-Beeinflussung 11000 CMP Vergleich zwischen Operand und Akku nur Flag-Beeinflussung 01010 Operation mit dem Akkumulator SHR Rechtsverschiebung um eine Stelle ohne Flag-Beeinflussung 10100 SRE Rechtsverschiebung um eine Stelle durch das Extension-Flag sonst ohne Flag-Beeinflussung 10101 SHL Linksverschiebung um eine Stelle ohne Flag-Beeinflussung 10110 SLE Linksverschiebung um eine Stelle durch das Extension-Flag sonst ohne Flag-Beeinflussung 10111 Transportbefehle LDA Lade den Akku mit dem Inhalt der Adresse 01100 STA Speichere den Inhalt des Akkus auf die angegebene Adresse 01101 Ein-/Ausgabebefehle RDA Lies von der Tastatur ein ASCII-Zeichen ein 01110 WRA Schreibe auf den Bildschirm ein ASCII-Zeichen 01111 8 3 Der Assembler Der Assembler ist ein Übersetzungsprogramm für maschinenorientierte Programmiersprachen. Er liefert ein relativ adressiertes (noch verschiebliches) Objektprogramm. Die Übersetzung erfolgt in zwei Arbeitsgängen (Pässen). Während im ersten Pass im Wesentlichen das Adressbuch erstellt wird, ist die Aufgabe des zweiten Passes die eigentliche Überführung des symbolischen OPC (Operationscode) und der Adressen in den Maschinencode. Das Objektprogramm muss noch mit dem Linker in ein abarbeitbares Programm (Lademodul) überführt werden. 3.1 Format von Assembleranweisungen Jede Anweisung gliedert sich in vier Felder: [Label] Mnemocode[,I] [Operandenadresse] [;Kommentar] Im Label- und Operandenadressfeld stehen symbolische (keine absoluten) Adressen, die maximal sieben Zeichen lang sein dürfen. Ein Label ist dadurch gekennzeichnet, dass es in der ersten Spalte der Zeile beginnt. Steht in der ersten Spalte ein Leerzeichen, so nimmt der Assembler ein leeres Labelfeld an, d. h. ein einzelner Befehl ohne Label beginnt mindestens in der zweiten Spalte. Die Felder sind durch wenigstens ein Leerzeichen zu trennen. Der Zusatz ",I" zum mnemonischen Operationscode wird ohne Zwischenraum angefügt und kennzeichnet indirekte Adressierung. Label, Mnemocode und Operandenadresse können in Groß- und in Kleinbuchstaben geschrieben werden, wobei der Assembler keinen Unterschied zwischen Groß- und Kleinschreibung macht. Für ihn ist z.B. das Label ZYKLUS das Gleiche wie Zyklus oder zyklus. Zur besseren Formatierung des Quelltextes können Tabs verwendet werden. Beispiel: ENDE ADR1 HLT SUB,I ADR2 ;das ist ein Kommentar Das Assemblerprogramm wird mit dem integrierten Editor geschrieben kann aber auch mit einem üblichen Editor (UltraEdit, EDIT o.ä) erstellt werden. Die Bedienung des Editors gestaltet sich wie mit jedem üblichen Editor und muss nicht näher erläutert werden. Die folgende Abbildung zeigt den Editor in Aktion. 9 3.2 Pseudobefehle Reservierung von Speicherplatz Ein Speicherplatz besteht aus 16 Bit (ein Wort) [Label] DEC n [;Kommentar] Anlegen eines Speicherplatzes, der die Dezimalzahl n enthält. [Label] HEX h [;Kommentar] Anlegen eines Speicherplatzes, der die Hexadezimalzahl h enthält. [Label] RST n [;Kommentar] Es werden n aufeinander folgende Speicherplätze mit dem Inhalt Null angelegt und reserviert. [Label1] DEF Label2 [;Kommentar] Es wird ein Speicherplatz angelegt, der den Wert der angegebenen symbolischen Adresse Label2 enthält. Externe Bezüge: EXT Label Dem Assembler wird mitgeteilt, dass die symbolische Adresse Label in einem anderen Quellmodul definiert ist. ENT Label Dem Assembler wird mitgeteilt, dass die in diesem Quellmodul definierte symbolische Adresse auch für andere Module zur Verfügung gestellt werden soll (Pedant zu EXT). Die Anweisungen EXT und ENT müssen am Anfang des Quellmoduls angegeben werden. 3.3 Hinweise zu Daten Wie bereits in Kapitel 2.3 erwähnt, stehen für Daten 15 Bit zur Verfügung. Aufgrund der Tatsache, dass das höchste Bit (Bit 14) als Vorzeichen dient, ergibt sich folgender Wertebereich für die Daten: DEC HEX DUAL -16384 4000 100000000000000 -16383 4001 100000000000001 . . . . . . . . . -2 7FFE 111111111111110 -1 7FFF 111111111111111 --------------------------------------0 0000 000000000000000 1 0001 000000000000001 2 0002 000000000000010 . . . . . . . . . 16382 3FFE 011111111111110 16383 3FFF 011111111111111 10 Bei der Eingabe von Hex-Zahlen im Quelltext können führende Nullen weggelassen werden 3.4 Beispielprogramm ; Dieses Programm schreibt die Buchstaben A bis F auf den Schirm. LDA ACODE ; ASCII-Code für "A" laden LOOP WRA ; Zeichen auf Schirm ausgeben CMP ECODE ; Mit Endcode vergleichen JEQ ENDE ; wenn Endcode, dann Sprung zu ENDE ADD EINS ; Zeichencode um eins erhöhen JMP LOOP ; alles wiederholen ENDE HLT ; alles paletti ACODE DEC 65 ; ASCII-Code für "A" (dezimal) ECODE HEX 46 ; ASCII-Code für "F" (hexadezimal) EINS DEC 1 ; dezimale Eins zum inkrementieren 3.5 Bedienung des Assemblers Die folgende Abbildung zeigt den Bildschirmaufbau des Assemblers. In der Mitte wird der Quellcode des zu übersetzenden Programms angezeigt. Das Adressbuch wird beim ersten Lauf und der Relative Code beim zweiten Lauf des Assemblers gefüllt. 11 Die Bedienung des Assemblers gestaltet sich intuitiv. Allgemeine Funktionen Die Funktionen sind über das Menü oder die Werkzeugleisten erreichbar. Öffnen Öffnen einer Quellcodedatei. Speichern Speichern der assemblierten Datei (*.rel) und der Listeningdatei (*.lst) unter dem Namen und im Pfad der Quelldatei. Speichern unter Speichern der assemblierten Datei (*.rel) und der Listeningdatei (*.lst) unter neuem Namen. Drucken Drucken des Dokuments Listingdatei (*.lst) nach erfolgreicher Assemblierung. Neu Assembler zurücksetzen (Zustand ohne geöffnete Dateien). Rückgängig Rückgängig machen des Assemblierungsvorgangs (Zustand nach öffnen der Dateien). Funktionen zur Ablaufsteuerung Diese Funktionen sind im unteren Teil des Fensters zu finden und dienen der Abarbeitung der Assemblierung. RUN Starten des Assemblerlaufes der im Statusfenster (rechts unten) angezeigt wird. STEP Schrittweise Abarbeitung des Assemblerlaufes. SPEED Festlegen der Assemblergeschwindigkeit in 3 Stufen: SLOW, MIDDLE, FAST (angezeigt im Statusfenster). 4 Der Linker Die vom Assembler erzeugten Files werden mit dem Linker in .LAD Files umgewandelt, die vom Modellcomputer COMPI16 abgearbeitet werden können. Dazu löst der Linker externe Bezüge auf und trägt absolute Adressen ein. Beim Linken sind 3 Läufe notwendig, wobei die Bedienung ähnlich dem Assembler gestaltet ist. Im ersten Lauf wird das Adressbuch für die externen Label aller Module erstellt, danach werden die externen Bezüge aufgelöst und die Adressen für die externen Label in das Adressbuch eingetragen. Beim dritten Lauf wird schließlich der LAD-Code erzeugt, wobei alle relativen Adressen durch absolute Adressen ersetzt werden. 12 4.1 Bedienung des Linkers Die folgende Abbildung zeigt den Bildschirmaufbau des Linkers. Im Fenster werden die Geladenen Rel-Code-Dateien links unten dargestellt, in der Mitte wird der Relative Code des zu verlinkenden Programms angezeigt. Das Adressbuch und der LAD Code werden beim Linken gefüllt. Die Bedienung des Linker gestaltet sich intuitiv und ähnelt der des Assemblers. Allgemeine Funktionen Die Funktionen sind über das Menü oder die Werkzeugleisten erreichbar. Öffnen Öffnen einer oder mehrerer zu linkenden Rel-Code-Dateien (*.rel). Speichern Speichern der gelinkten Datei (*.lad) unter dem Namen und im Pfad der Quelldatei. Speichern unter Speichern der Assemblierten Datei (*.lad) unter neuem Namen. 13 Neu Linker zurücksetzen (Zustand ohne geöffnete Dateien). Rückgängig Rückgängig machen des Linkvorgangs (Zustand nach öffnen der Dateien). Funktionen zur Ablaufsteuerung Diese Funktionen sind im unteren Teil des Fensters zu finden und dienen der Abarbeitung des Linker. RUN Starten des Linkerlaufes der im Statusfenster (rechts unten) angezeigt wird. STEP Schrittweise Abarbeitung des Linkerlaufes. SPEED Festlegen der Linkergeschwindigkeit in 3 Stufen: SLOW, MIDDLE, FAST (angezeigt im Statusfenster). 5 Schema zur Programmerstellung für COMPI16 eigenes Quellmodul Assembler *.txt *.REL Linker ASSEM.EXE Modellcomputer LINKER.EXE AUS.TXT COMPI16.EXE ASSEM.EXE AUS.REL vorgegebenes Quellmodul Lademodul *.LAD 6 Aufgabenstellung und Praktikumsdurchführung Alle Struktogramme und Programme sind in Vorbereitung des Praktikums zumindest handschriftlich zu entwerfen. Während des Praktikums sind die Programme einzugeben, zu testen, zu verbessern und nach Aufgabenstellung zu ergänzen. 6.1 Erstellen Sie ein Struktogramm für das Beispielprogramm (siehe 3.4) 6.2 Test des Beispielprogramms, Anwendung des Assemblers und Linkers Schreiben Sie das Beispielprogramm in Assembler und testen Sie alle erforderlichen Bearbeitungsschritte zur Erzeugung des Maschinencodes. Achten Sie besonders auf die Arbeitsweise des Assemblers bei der Erstellung des Adressbuches und der Maschinenbefehle. Verändern Sie das Programm so, dass die Buchstaben R bis Z bzw. die Ziffern 0 bis 9 ausgegeben werden. Dem Protokoll ist das übersetzte Assemblerprogramm (*.lst) anzufügen. 14 6.3 Programmierung im Maschinencode Entwerfen Sie ein Struktogramm zur Eingabe einer Ziffer von der Tastatur in den Hauptspeicher. Kontrollieren Sie durch das Programm, ob es wirklich eine Ziffer ist! Erstellen Sie zum vorgegebenen Programm den Maschinencode (ohne Nutzung des Assemblers), tragen Sie ihn direkt in den Hauptspeicher des Modellcomputers ein und testen Sie das Programm. Führen Sie das Programm schrittweise aus. Überlegen Sie vorher, welche Aktionen (Datentransport, arithmetische und logische Operationen, Veränderungen in den Registern) bei der Realisierung des einzelnen Befehls auftreten (Abfolge der „roten Linien). Ordnen Sie die Vorgänge den Bestandteilen der zentralen Steuerschleife (Befehlszyklus) zu. Protokollieren Sie einige interessante Befehle (siehe 7.1). 6.4 Eingabe und Ausgabe einer Ziffer (1. Baustein für das Multiplikationsprogramm) Schreiben Sie das unter 6.3 geforderte Programm in Assembler (Dateiname: eingzif.txt). Ergänzen Sie Ihr Struktogramm und Programm zur Ausgabe dieser Ziffer (einaus.txt) auf den COMPI16 Bildschirm. Dem Protokoll ist das übersetzte Assemblerprogramm (einaus.lst) anzufügen. 6.5 Kontrollfragen und Testauswertung Geben Sie die Lösungen der folgenden Aufgaben im Protokoll an. Leiten Sie die Aufgaben eines Assemblers aus den Versuchen 6.2 bis 6.4 ab. Beobachten Sie, wie der Mustercomputer einen Sprung realisiert. Entwickeln Sie eine logische Schaltung (AND, OR, Negation), die diesen Vorgang für den Befehl JMP LOOP realisiert. Wie würde sich die Schaltung für den Befehl JEQ ENDE ändern? 6.6 Addition zweier Konstanten (2. Baustein für das Multiplikationsprogramm) Entwerfen Sie ein Struktogramm zur Addition zweier im Hauptspeicher vorhandener Konstanten. Schreiben Sie das Programm ( Dateiname: add.txt) und testen Sie es. Erweitern Sie das Programm durch die Eingabe und die Ausgabe von Ziffern (addok.txt) falls das Ergebnis nur eine einstellige Zahl ist. Nutzen Sie dazu Ihre Programme eingzif.txt und einaus.txt. Dem Protokoll sind die übersetzte Assemblerprogramme (*.lst) anzufügen. 6.7 Multiplikation zweier Konstanten (3. Baustein für das Multiplikationsprogramm) Entwerfen Sie ein Struktogramm zur Multiplikation zweier im Hauptspeicher vorhandener Konstanten. Schreiben Sie das Programm ( Dateiname: mult.txt) und testen Sie es. Dem Protokoll ist das übersetzte Assemblerprogramm (*.lst) anzufügen. 6.8 Multiplikation und Addition Für die folgende Aufgabe sind Struktogramm und Programm (praufg.txt) zu erarbeiten. Dabei sind die bisher erarbeiteten Struktogramme und Programmbausteine zu nutzen und möglichst wenig neu zu schreiben. Es sind zwei Ziffern (A und B) von Tastatur einzulesen und über die Operation x*A+y*B arithmetisch zu verknüpfen. X und Y sind ganze Zahlen und werden nach Fertigstellung des Programms zum Test jeder Gruppe vom Betreuer genannt. Das Ergebnis liegt im Intervall von 0 bis 99. Die Aufgabenlösung umfaßt zwei Quellmodule, wovon eins vorgegeben ist und den Programmteil Ergebnisausgabe beinhaltet. Der Quelltext dieses Moduls ist unten angeführt. Die Ausgaberoutine für die zweistellige Zahl ist ein Unterprogramm mit dem Namen UPAUS, das im Modul AUS.TXT definiert ist. Die auszugebende Zahl ist im Akkumulatorregister zu übergeben. Der 15 Akkumulator-inhalt wird im Unterprogramm verändert. Das Quellmodul, das die Eingabe und die arithmetische Operation umfaßt, ist von jeder Praktikumsgruppe selbst zu erstellen. Anschließend sind beide Module zu assemblieren und zu linken. Beim Linken ist darauf zu achten, daß der Modul AUS.REL als zweiter eingebunden wird. Das Ausgabefile trägt dann den Namen des selbst geschriebenen Moduls. Dem Protokoll ist das übersetzte Assemblerprogramm (*.lst) anzufügen. Testen Sie das Programm. Quelltext des Moduls AUS.TXT ENT AUS1 LDA,I TAB WRA LDA TABMERK ADD Zahl STA TAB LDA,I TAB WRA RET ;symb. Adresse UPAUS auch in anderen Modulen bekannt ;machen ;Akkumulator speichern ;Anfangsadresse der Tabelle holen ;und zur weiteren Berechnung ablegen ;auszugebende Zahl im Akkumulator laden ;Test ob Zahl kleiner als Zehn ist ;ja, also Sprung zum Ausgeben ;nein noch größer als Zehn, also zykl. Zehn abziehen ;dabei Tabellenzeiger erhöhen ;Tabellenzeiger holen ;Zeiger auf nächste Ziffer setzen ;veränderten Zeiger wieder abspeichern ;Zahl holen ;Zehn abziehen ;und wieder abspeichern ;diesen Zyklus solange ausführen, bis Zahl kleiner als Zehn ist ;Ausgabe ;über Tabellenzeiger auszugebenden ASCII-Code holen ;ASCII-Code der Zehnerstelle ausgeben ;Anfangsadresse der Tabelle holen ;Tabellenzeiger um Wert der Einerstelle erhöhen ;Tabellenzeiger für indir. Adressierung speichern ;über Tabellenzeiger auszugebendes Zeichen (ASCII) holen ;ASCII-Code der Einerstelle ausgeben ;Finales Return Zahl EINS ZEHN TAB TABMERK TABANF RST 1 DEC 1 DEC 10 RS 1 DEF TABANF HEX 30 HEX 31 HEX 32 HEX 33 HEX 34 HEX 35 HEX 36 HEX 37 ;Definitionen ;Speicher für auszugebende Zahl ;dezimale Eins für Zeigerrechnungen ;dezimale Zehn für Abtrennung der Zehnerstelle von Zahl ;Speicherzelle für Tabellenzeiger ;Ablage für Tabellenanfangsadresse ;Tabelle der ASCII-Codes der Ziffern von Null bis Neun ;ASCII-Code von Eins ;ASCII-Code von Zwei ;ASCII-Code von Drei ;ASCII-Code von Vier ;ASCII-Code von Fünf ;ASCII-Code von Sechs ;ASCII-Code von Sieben UPAUS ZYKL1 UPAUS STA ZAHL LDA TABMERK STA TAB LDA ZAHL CMP ZEHN JLT AUS1 und LDA ADD STA LDA SUB STA JMP TAB EINS TAB ZAHL ZEHN ZAHL ZYKL1 16 HEX HEX 38 39 ;ASCII-Code von Acht ;ASCII-Code von Neun 6.9 Kontrollfragen und Testauswertung Geben Sie die Lösung der folgenden Aufgabe im Protokoll an. Leiten Sie die Aufgaben eines Linkers aus dem Versuchen 6.8 ab. 6.10 Zusatzaufgabe: Ausgabe dreistelliger Zahlen Erweitern Sie das Programm AUS.TXT zur Ausgabe dreistelliger Zahlen und testen Sie das Programm. Dem Protokoll ist das übersetzte Assemblerprogramm (*.lst) anzufügen. 6.11 Zusatzaufgabe: Unterprogrammtechnik Realisieren Sie die Aufgabe 6.8 mittels Unterprogrammen. Dem Protokoll ist das übersetzte Assemblerprogramm (*.lst) anzufügen. 17 7 Protokoll 7.1 Protokollierung eines Programm-Bausteins Je Praktikumsgruppe ist ein Protokoll nach folgendem Muster zu erstellen. Der Programmlauf des Quellmoduls einaus.txt ist im Schrittbetrieb zu protokollieren und zu diskutieren. Es ist darauf zu achten, daß bei der Eingabeschleife jeder mögliche Programmzweig zu durchlaufen ist! Erarbeiten Sie sich eine Prüfstrategie! Wieviel verschiedene Eingaben sind dazu mindestens erforderlich? Beim Protokollieren des Akkumulatorinhalts brauchen führende Nullen nicht notiert werden. Die Bemerkungen sollen das Problem kommentieren und nicht den vorn stehenden Befehl! prokopf.doc Ablaufprotokoll Anfangsbedingungen: z.B.: Inhalt des Tastaturpuffers, Konstanten im Hauptspeicher usw. <BZ>alt | <BR>neu | <BZ>neu | <A>dez | <F>bin | Bemerkungen | mnemonisch | | | <=>E | dez | dez | dez | nach Abarb.von BZalt | ----------------------------------------------------------------------------------------------------Bsp. | | | | | 19 | SUB 012 | 20 | 34 | 0011 |Korr. Wert2 20 | JMP 15 | 15 | 19 | 0010 |Eing. Schleife 7.2 Protokollierung der indirekten Adressierung Im vorgegebenen Quellmodul (AUS.TXT) der die Ausgabe enthält, ist ein Befehl mit indirekter Adressierung vorhanden. Dieser Befehl ist im Langsamlauf abzuarbeiten. Der detaillierte Ablauf dieses Befehls ist im Protokoll festzuhalten und zu beschreiben. Die Unterschiede zu Befehlen mit direkter Adressierung sind vorzuheben. Beschreiben Sie in wenigen Sätzen den Grundgedanken des Algorithmuses des Programms AUS.TXT. Erarbeiten Sie sich das Struktogramm für das Programm AUS.TXT. 7.3 Zusatzaufgabe Unterprogrammtechnik Der Programmablauf des unter Punkt 6.11 erstellten Programms ist bei einem Sprung in das Unterprogramm und bei einem Rücksprung zum Hauptprogramm zu protokollieren. Ergänzen Sie dabei Ihr Protokoll mit Angaben zu Stack-Pointer und dem Stackspeicher. 18 Ablaufprotokoll Anfangsbedingungen: <BZ>alt | <BR>neu | <BZ>neu | <A>dez | <F>bin | Bemerkungen |mnemonisch| | | <=>E | dez | dez | dez | nach Abarb.von BZalt | ----------------------------------------------------------------------------------------------------------------| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |