| Hinweise zur Bearbeitung der Einsendeaufgaben zu KE1-7 | Einsendeaufgaben zur Kurseinheit 2 |
Hinweis: In dieser Aufgabe sollen Sie den Umgang mit dem Praktikumsrechner üben. (Diese Aufgabe ist als einführende Selbstaufgabe gedacht. Sie können Sie ohne weiteres auslassen, wenn Sie sich mit der Bediengung des Praktikumsrechners hinreichend vertraut fühlen.) Dazu geben wir ein kleines Programm vor, welches Sie eingeben sollen, um dann ein paar Untersuchungen durchzuführen. Da Sie den Umgang mit dem Praktikumsrechner und nicht mit dem Simulator oder Terminalprogramm üben sollen, werden sie auf der beigefügten Diskette keine Vorlagedatei finden.
Geben Sie das folgende Programm ein und zwar genau so, wie es abgedruckt ist. Es enthält einen Fehler, den Sie im folgenden herausfinden sollen.
Bei der Bearbeitung der Aufgabe werden Sie vielleicht den Fehler viel früher finden oder auch den vorgegebenen Weg zur Fehlersuche für nicht besonders gelungen halten - Sie könnten sogar mit einer gewissen Berechtigung sagen, daß niemand diesen Fehler machen würde. Doch in dieser Aufgabe geht es um die Bedienung des Praktikumrechners und darum, aus den im folgenden erzielten Ergebnissen gewisse Rückschlüsse zu ziehen. Es geht weniger darum, eine effiziente Methode zum Auffinden von Fehlern darzustellen.
Aufgabe: Schreiben Sie ein Programm, welches eine achtstellige Zahl einliest, darstellt und diese mit den Tasten "+" und "-" nach rechts bzw. links durch die Anzeige rollt. Die Taste "S" soll das Programm beenden.
Gegeben sei das folgende Programm (Musterlösung: 1_ML.ASM):
0001 0400 ORG $0400 ;Beginn des Programmbereichs 0002 0003 0400 bd f1 10 JSR CLRDIS ;Anzeige loeschen 0004 0403 10 8e 05 08 LDY #DATAEND ;Y mit Zeiger auf Ende des Datenbereichs laden 0005 0407 8e 00 07 LDX #7 ;X mit Anzeigeposition und Anzahl laden 0006 040a bd f1 43 WEITER JSR HALTKEY ;Zeichen lesen... 0007 040d bd f1 1c JSR SHOWT7SG ;ausgeben... 0008 0410 bd f1 00 JSR T7SG ;in Siebensegmentcode wandeln... 0009 0413 a7 a2 STA ,-Y ;und schliesslich speichern 0010 0415 30 82 LEAX ,-X ;Zaehler in X dekrementieren 0011 0417 10 8c 05 00 CMPY #DATAANF ;am Pufferanfang angekommen? 0012 041b 26 ed BNE WEITER ;nein, also noch ein Schleifendurchlauf 0013 0014 041d 8e 05 00 LDX #DATAANF ;Zeiger auf Pufferanfang 0015 0420 bd f1 33 TASTE JSR SHOWDBU ;Puffer anzeigen 0016 0423 bd f1 43 JSR HALTKEY ;auf Tastendruck warten 0017 0426 c1 80 CMPB #$80 ;"+" gedrueckt? 0018 0428 26 03 BNE N_PLUS ;nein, weitersuchen 0019 042a bd f1 39 JSR RLDBUF ;ja, Puffer nach links rotieren 0020 042d c1 81 N_PLUS CMPB #$81 ;"-" gedrueckt? 0021 042f 27 03 BEQ N_MINUS ;nein, weitersuchen 0022 0431 bd f1 36 JSR RRDBUF ;ja, Puffer nach rechts rotieren 0023 0434 c1 86 N_MINUS CMPB #$86 ;"S" gedrueckt? 0024 0436 26 e8 BNE TASTE ;nein, weiter auf Taste warten 0025 0438 3f SWI ;ja, Programmende 0026 0027 0500 DATAANF EQU $0500 0028 0508 DATAEND EQU $0508 0029 0030 0439 U_END ORG * ;Ende des Programmbereichs
Beantworten Sie kurz folgende Fragen:
Kontrollieren Sie Ihr Programm auf Eingabefehler und berichtigen Sie diese. Verwenden Sie dazu zwei verschiedene Möglichkeiten, um das Listing mit den eingegebenen Daten zu vergleichen:
Beantworten Sie kurz folgende Fragen:
Nachdem das Programm nun entsprechend dem obigen Listing im Speicher des Praktikumsrechner vorliegt, starten Sie einen Testlauf. Benutzen Sie dazu die Go-Funktion und starten Sie das Programm an der Adresse $0400.
Zuerst können Sie nun acht Tasten drücken, worauf jeweils eine Ziffer in der Anzeige erscheint. Danach sollten die oben beschriebenen Funktionen mit den Tasten "+"- und "-" ausgeführt werden können und der Programmabbruch mit der Taste "S" funktionieren.
Beantworten Sie folgende Fragen zum Testlauf:
Da in der Programmbeschreibung die einzugebenden acht Zeichen nicht ausdrücklich auf den Bereich der Ziffern oder Hex.-Ziffern eingeschränkt wurde, können Sie das Verhalten des Programms in dieser Beziehung als korrekt auffassen.
Das Verhalten aller anderen Tasten bis auf die Taste "S" ist jedoch als fehlerhaft zu bezeichnen.
Denken Sie bitte daran, daß beim Anzeigen des Puffers die niedrigste Speicherstelle rechts angezeigt wird und die höchste links. Ein Rollen des Puffers nach rechts bewirkt also ein Rollen der Anzeige nach links und umgekehrt.
Als "naiven" Ansatz zur Fehlersuche versuchen Sie nun bitte, das Programm mittels der Trace-Funktion Schritt für Schritt durchzugehen: Drücken Sie die Taste "G", um den Programmzähler zu kontrollieren und ggf. auf $0400 zu setzen. Starten Sie nun die Trace-Funktion, indem Sie die Taste "T" drücken und beobachten Sie die Anzeige. Beantworten Sie folgende Fragen:
Nun versuchen Sie bitte, mit Breakpoints zu arbeiten. Als erstes sollen Sie die Wirkung der Taste "+"untersuchen. Dazu setzen Sie einen Breakpoint auf die Adresse $042A, da das Programm dorthin verzweigt, wenn die Taste "+" gedrückt ist. Gehen Sie dabei wie folgt vor: Zuerst drücken Sie die Taste "G", um in den Go-Modus zu gelangen. Kontrollieren Sie die Anfangsadresse und geben Sie ggf. $0400 ein. Dann drücken Sie die Taste "+", um einen Breakpoint eingeben zu können. Geben Sie als Adresse $042A ein. Nun drücken Sie die Taste "G", um das Programm zu starten. Im Programm geben Sie wie gewohnt die acht Zeichen ein, dann drücken Sie die Taste "+".
Beantworten Sie nun folgende Frage:
Im nächsten Trace-Schritt würde nun die Monitorroutine RLDBUF in Einzelschritten abgearbeitet werden. Das sollen Sie vermeiden. Sie sollen direkt mit dem Folgebefehl an Adresse $042D fortfahren. Beantworten Sie dazu folgende Fragen:
Bevor Sie mit der Fehlerberichtigung beginnen, sollen Sie jedoch die anderen Fehler auch noch genauer betrachten. Dazu setzen Sie bitte einen Breakpoint auf die Adresse $0431, um das Verhalten der Taste "-" zu untersuchen.
Beantworten Sie folgende Frage:
Setzen Sie nun zur Untersuchung dieses Effekts einen Breakpoint auf die Adresse $042F. Schauen Sie sich mit der Register-Funktion den Inhalt der Prozessorregister an. Beantworten Sie folgende Fragen:
Nun sollten Sie herausgefunden haben, wo der Fehler im Programm liegt. Falls Sie noch unsicher sind, führen sie Schritt f) statt mit der Taste "-" mit einer anderen Taste - z.B. den Hex.-Zifferntasten - durch und analysieren Sie das Ergebnis.
Berichtigen Sie den Fehler und kontrollieren Sie, ob das Programm nun korrekt läuft. Beantworten Sie folgende Frage:
Hinweis: In dieser Aufgabe soll das "manuelle" Disassemblieren geübt werden. Als kleine Hilfe haben wir jeweils angegeben, welche Bytes zu einem Assemblerbefehl gehören. Falls Sie Probleme haben, schauen Sie sich wieder Abschnitt 1.4 an und versuchen Sie, nur anhand der ersten zwei Spalten (Adresse und Opcode) auf den dahinter stehenden Assemblerbefehl zu kommen.
Das folgende Programm finden Sie unter dem Dateinamen 2A_VORL.ASM auf der mitgelieferten Diskette. Dort sind Adresse und Opcode als Kommentar angegeben, Sie können Ihre Lösung davor eintragen. Z.B. wird aus (siehe wieder Abschnitt 1.4) "0500 BD F1 10" der Befehl "JSR CLRDISP". Sie würden als Zeile in der von uns beigelegten Assemblerdatei finden:
;0500 BD F1 10 ;
und sollten daraus in Ihrer Lösung machen:
LABEL1: JSR CLRDISP ;0500 BD F1 10 ;Anzeige löschen
Das folgende Programm ist im Maschinencode angegeben. In der ersten Spalte stehen die Adressen der Befehle, und in der zweiten Spalte stehen die Opcodes der Assemblerbefehle.
Disassemblieren Sie das folgende Programm, d.h. geben Sie zu jedem Befehl den Assemblercode an, und benutzen Sie symbolische Namen (Labels) für die Sprungziele! Kommentieren Sie das Programm!
Adresse Opcode
0400 8E 02 00
0403 10 8E 03 00
0407 C6 20
0409 A6 84
040B A7 A4
040D 1C FE
040F 1E 01
0411 C9 01
0413 1E 10
0415 1C FE
0417 1E 02
0419 C9 01
041B 1E 20
041D 1C FE
041F C0 01
0421 C1 00
0423 26 E4
0425 3F
Zeichnen Sie das Flußdiagramm!
Was leistet das Programm? Wie funktioniert es?
Verbessern Sie dieses Programm so weit wie möglich und geben Sie die verbesserte Form an! Verwenden Sie dabei keine Hilfsroutinen des Monitorprogramms!
Hinweis: Wir geben Ihnen eine Aufgabe und die dazugehörige Lösung an, in der aber die Adressen und Namen der Monitorroutinen, ein paar Werte sowie Kommentare fehlen. Ihre Aufgabe ist es, die Lösung zu vervollständigen.
(Vorlagedatei: 3_VORL.ASM, Lösungsdatei: 3_EA.ASM)
Es war ein Programm zu schreiben, das eine 8stellige Dezimalzahl zyklisch nach rechts durch die Anzeige rotiert (, so daß die rechts "herausfallende" Ziffer links wieder erscheint). Die Rotation soll wahlweise stellenweise auf Anforderung oder aber kontinuierlich geschehen. In jedem Zustand soll ein Rücksetzen in die Ausgangslage möglich sein.
Im einzelnen:
Die (unvollständige) Lösung, in der alle Auslassungen durch "?" ersetzt sind, lautet:
Label Befehl Kommentar
EINGABE JSR ?
LDA #
L1 TFR A,B
TFR D,X
JSR ?
CMPB #?
BHS L1
JSR ?
PSHS A
LDX #$0500 ;X mit Zeiger auf Pufferspeicher laden
JSR T7SG
PULS B
STA B,X
TFR B,A
DECA ;Index dekrementieren
BPL L1 ;Rücksprung, falls noch nicht fertig
LDX #$0510
LDY #$0500
JSR ?
EXG X,Y
WEITER JSR ?
JSR ?
CMPB #$80
BNE N_PLUS ;Sprung, falls nicht "+" gedrückt
JSR ?
BRA WEITER
N_PLUS CMPB #?
BNE N_RESET
LDY #$0510
JSR ?
BRA WEITER
N_RESET CMPB #?
BNE WEITER ;keine der Tasten, also Rücksprung
LDY #500
L2 JSR ?
JSR ?
JSR ?
JSR ?
CMPB #$86
BNE L2
BRA WEITER
Hinweis: In dieser Aufgabe dürfen nur bestimmte Monitorroutinen benutzt werden. Entsprechend verkürzt sind die Definitionsteile der Vorlagedateien.
Schreiben Sie ein Programm, welches zunächst die Anzeige löscht und danach über die Tastatur eine zweistellige Hex.-Zahl einliest und diese Zahl im Datenfeld der Anzeige darstellt. Nach Ausführung des Programms soll die Zahl im Akkumulator B weiterhin zur Verfügung stehen.
Außer den Routinen CLRDISP, HALTKEY und SHOWB7SG sollen Sie keine anderen Hilfsroutinen benutzen.
Erweitern Sie das Programm aus Teil a) nun derart, daß nach Drücken der Taste "+" die eingegebene Zahl als Dualzahl, also als 8-stellige 0-1-Kette in der Anzeige dargestellt wird.
Sie dürfen zusätzlich die Hilfsroutine SHOWT7SG benutzen.
(Lösungsdatei: 5_EA.ASM)
In dieser Aufgabe sollen Sie ein recht komplexes Programm entwickeln, welches etwa Klausurniveau hat. Um Ihnen dabei etwas zu helfen, ist die Aufgabenstellung an die Aufgabe angelehnt, für die in Abschnitt 1.4 eine Beispiellösung vorgestellt wurde. So können Sie sich bei der Lösung der Aufgabe an diesem Abschnitt orientieren.
Der Speicher soll fortlaufend ab einer einzugebenden Anfangsadresse nach einem einzugebenden Datum durchsucht werden. Bei jedem Fund soll die Funstelle ausgegeben und auf einen Tastendruck gewartet werden. Das Programm soll bis zur Adresse $FFFF weitersuchen.
Im einzelnen: Schreiben Sie ein Programm, welches der Reihe nach
Hinweis: Die formale Gestaltung dieser Aufgabenstellung wird Ihnen im weiteren Verlauf des Praktikums immer wieder begegnen: Zunächst wird, in knappen Worten durch Kursivschrift gekennzeichnet, die geforderte Funktionalität des Programms beschrieben, dann folgt in "algorithmischer" Schreibweise eine genaue Beschreibung der geforderten Programmschritte.
| Hinweise zur Bearbeitung der Einsendeaufgaben zu KE1-7 | Einsendeaufgaben zur Kurseinheit 2 |