Hinweise zur Bearbeitung der Einsendeaufgaben zu KE1-7 Einsendeaufgaben zur Kurseinheit 2

Einsendeaufgaben zur Kurseinheit 1


 

Aufgabe 1-1: (10 Punkte)

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

a) Eingabe (1 Punkt)

Beantworten Sie kurz folgende Fragen:

b) Kontrolle (1 Punkt)

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:

  1. Benutzen Sie die Address- oder Data-Funktion und gehen Sie mit den Tasten "+" und/oder "-" das Listing byteweise durch.
  2. Benutzen Sie die Dump-Funktion und gehen Sie mit den Tasten "+" und/oder "-" das Listing in vier-Byte-Schritten durch.

Beantworten Sie kurz folgende Fragen:

c) Testlauf (1 Punkt)

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:

d) Fehler lokalisieren - erster Versuch (2 Punkte)

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:

e) Fehler lokalisieren - Taste "+" (2 Punkte)

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:

f) Fehler lokalisieren - Taste "-" (2 Punkte)

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:

g) Fehleranalyse und -berichtigung (1 Punkt)

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:

 

Aufgabe 1-2: (25 Punkte)

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

a) (10 Punkte, Vorgabedatei: 2A_VORL.ASM, Lösungsdatei: 2A_EA.ASM)

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

b) (4 Punkte, keine Lösungsdatei)

Zeichnen Sie das Flußdiagramm!

c) (5 Punkte, keine Lösungsdatei)

Was leistet das Programm? Wie funktioniert es?

d) (6 Punkte, Lösungsdatei: 2D_EA.ASM)

Verbessern Sie dieses Programm so weit wie möglich und geben Sie die verbesserte Form an! Verwenden Sie dabei keine Hilfsroutinen des Monitorprogramms!  

Aufgabe 1-3: (10 Punkte)

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:

  1. Anzeige löschen
  2. Eine achtstellige Dezimalzahl soll ziffernweise eingelesen und, mit S7 beginnend, in der Siebensegmentanzeige dargestellt werden. Alle Funktionstasten und die Datentasten A..F sollen dabei unberücksichtigt bleiben.
  3. Dann wird die Tastatur abgefragt:
  4. Weiter mit Punkt 3)

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
 

Aufgabe 1-4: (20 Punkte)

Hinweis: In dieser Aufgabe dürfen nur bestimmte Monitorroutinen benutzt werden. Entsprechend verkürzt sind die Definitionsteile der Vorlagedateien.

a) (10 Punkte, Vorlagedatei 4A_VORL.ASM, Lösungsdatei: 4A_EA.ASM)

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.

b) (10 Punkte, Vorlagedatei 4B_VORL.ASM, Lösungsdatei: 4B_EA.ASM)

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.  

Aufgabe 1-5: (30 Punkte)

(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

  1. die Anzeige löscht,
  2. die Kennung "dA" ins Operationsfeld der Anzeige schreibt und danach ein Byte (das Suchdatum) über die Tastatur einliest und im Datenfeld anzeigt,
  3. die Anzeige löscht,
  4. die Kennung "AA" ins Operationsfeld schreibt und eine (Anfangs-)Adresse einliest und im Adreßfeld darstellt,
  5. den Speicherbereich von der Anfangsadresse bis zur Adresse $FFFF nach dem Auftreten des in 2) eingegebenen Bytes durchsucht,
  6. die Kennung "FO" (bzw. "F0") ins Operationsfeld, die Fund-Adresse im Adreßfeld und das zu suchende Byte im Datenfeld anzeigt und auf Drücken der Taste "+" wartet, um dann ab der Fundstelle weiterzusuchen,
  7. "FF FFFF FF" anzeigt, falls das zu suchende Byte nirgends im Speicherbereich gefunden werden kann, bzw. die Weiter-Suche ab einer Fundstelle keine weitere Fundstelle mehr liefert.

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