Thema dieser Übung ist die Programmierung einfacher Assemblerprogramme, deren
Lösung auf einer Fallunterscheidungen beruht. Zu diesem Zweck werden wir erneut die
Assemblerentwicklungsumgebung Jasmin
benutzen.
Für die Simulation technischer Steuerungen verfügt Jasmin
über ein 7-Segment-Display mit vier Stellen, welches im
Programmfenster unten mit dem
Reiter Display aktiviert wird.
Das Display wird mit
Hilfe der ersten vier Speicherworte mit den Adressen 0-3
angesprochen. Dabei ist die Speicherzelle 0 der ganz
rechten Stelle zugeordnet. Das Display könnte z. B. die
Temperaturanzeige einer Waschmaschine repräsentieren.
Die sieben Segmente werden durch die sieben niederwertigsten Bits
eines Bytes entsprechend der Abb. 1 gesteuert.
Abb 1: Ansteuerung des 7-Segment-Displays
Daraus ergibt sich für die Ziffern 0..9 folgender Code:
Hauptspeicheradressen werden durch eckige Klammern
adressiert.
Beispiel: mov [0],1011011b schreibt
eine zwei in die Stelle geringster Wertigkeit des Displays.
Aufgabe 1: Waschmaschinentemperatur
Als Entwickler/-in sollen Sie ein Assemblerprogramm für eine
Waschmaschine schreiben, welches gewählte Waschtemperaturen
auf deren vierstelligen 7-Segment-Display anzeigt. Die
Waschmaschine verfügt über einen 16-Bit-Intel-Prozessor und kann
folglich mit Intel-Assemblerbefehlen programmiert werden.
Die Waschmaschine verfügt über die folgenden
Waschprogramme:
Programmnr.
Programm
Temperatur
1
Feinwäsche
30
2
Feinwäsche
40
3
Buntwäsche
40
4
Buntwäsche
60
5
Kochwäsche
95
Abb 2: Ausgabebeispiele der Waschmaschine
Eingestellt wird das jeweilige Waschprogramm durch
Schreiben der Programmnummer in
das AX-Register.
Schreiben Sie ein Assemblerprogramm, welches den
im AX-Register stehenden Wert ausliest und das
gewählte Programm im 7-Segment-Display, wie in der Abb. 2
dargestellt, durch das zugehörende Programmkürzel und die
zugehörende Temperaturangabe
visualisiert (F: Fine (Feinwäsche), C: Color
(Buntwäsche), H: Hot (Kochwäsche)). Wird ein Wert außerhalb
des Bereichs 1-5 eingegeben, so signalisiert die
Waschmaschine dies durch Ausgeben der Fehlermeldung Err.
Beschreiben Sie die Bytes des 7-Segment-Displays immer von kleinen
hin zu größeren Adressen. Da Jasmin immer 32-Bit-Werte schreibt,
würden Sie anderenfalls schon geschriebene Bytes und damit
Anzeigewerte überschreiben.
Aufgabe 2: Portogebühren
Das Briefporto ist abhängig vom Gewicht und Zusatzleistungen, wie
z. B. die Einschreibegebühr. Schreiben Sie ein
Intel-Assemblerprogramm für eine elektronische Waage, die für
gewogene Briefe das Porto in Cent anzeigt. Das Gewicht des gewogenen
Briefs wird aus
dem DX-Register gelesen. Zusätzlich besitzt die Waage
einen Schalter, mit dem ein Einschreibebrief gewählt werden
kann. Ist dieser gesetzt, so schreibt die Waage eine 1
in das AX-Register, anderenfalls steht dieses
auf 0. Ihr Programm wertet entsprechend
das DX- und AX-Register aus.
Abb 3: Anzeige für einen Einschreibebrief mit einem
Gewicht unter 20g.
Schreiben Sie ein Assemblerprogramm, das
im AX-Register stehende Zahlen im Bereich [0;9999] auf
das 7-Segment-Display von Jasmin ausgibt.
Abb 4: Beispielausgabe für die Zahl 5824
Bisher wurden nur die Hauptspeicherzellen 0-3, die in direktem
Bezug zu dem Display stehen, eingesetzt. Für diese Aufgabe ist es
sinnvoll, die Binärwörter für die Ziffern 0-9 in einen geeigneten
Abschnitt des Hauptspeichers zu schreiben und von dort bei Bedarf in
die Hauptspeicherzellen 0-3 zu kopieren. Geeignet ist ein
Hauptspeicherbereich, wenn
sich die Adressen, unter denen die Ziffern stehen, aus den Ziffern
der im AX-Register gespeicherten Zahl berechnen
lassen. Dies trifft z. B. für die Adressen 10-19 zu, wenn das
Binärwort der 0 in der Adresse 10 und das der 9 in der Adresse 19
steht. Ist die Ziffer z. B. 9, so wird das Binärwort jeweils aus der Adresse
10 = 19 - 9 gelesen und in die Adresse der zugehörenden Ziffer des
7-Segment-Displays von Jasmin geschrieben. Aus der berechneten
Ziffer lässt sich also recht einfach die Adresse des
zugehörenden Binärworts im Speicher
berechnen. Derartige Adressrechnungen werden uns noch
häufiger begegnen. Insbesondere, wenn Zahlenfolgen im Hauptspeicher
zu verarbeiten sind.
Bestimmen Sie die Ziffern der im AX-Register
gespeicherten Zahl durch fortgesetztes ganzzahliges
Teilen. Beachten Sie dabei folgendes:
Schreiben und Lesen in den Hauptspeicher erfolgt mit Hilfe
eckiger Klammern.
Beispiel:
mov [10],0111111b: Schreibt das
Binärwort 0111111b als 32-Bit-Wert
in die 4 Bytes beginnend mit Adresse 10. Jasmin schreibt
Konstanten immer als 32-Bit-Werte.
Hauptspeicherzugriffe unter Verwendung eckiger Klammern sind bei
heutigen Intel-Prozessoren für alle Allzweckregister möglich und nicht nur
für das BX-Register.
Umkopieren im Hauptspeicher ist nicht erlaubt. D. h. folgender
Befehl ist nicht möglich: mov [0],[dl]. Bei diesem
Befehl soll das untere Byte des DX-Registers als
Adresse interpretiert und der unter dieser Adresse im Hauptspeicher
liegende Wert in die Adresse 0 kopiert
werden. Allerdings ist dabei keine Information darüber verfügbar,
wie viele Bytes ab dieser Adresse zu kopieren sind.
Das Umkopieren muss deswegen immer über ein "Vermittlungsregister"
stattfinden, welches durch seine Größe die Anzahl der zu
kopierenden Bytes festlegt.
Beispiel:
mov bl,[dl]
mov [0],bl
Schreibt den Speicherinhalt
zunächst in das untere Byte
des BX-Registers. Damit ist klar, dass
im nächsten Schritt genau ein Byte in die
Adresse 0 kopiert werden soll.
Beim Teilen muss stets darauf geachtet werden, dass
das DX-Register nur einen Wert enthält, wenn dieser
Teil des Dividenden sein soll. Ansonsten muss es vor dem Teilen
auf 0 gesetzt sein.