Schlagwort-Liste: 8086 16-Bit-Rechner - Programme: Assembler, Beispiele, Verzögerungsschleife, Makros, UP, BIOS- und DOS-Funktionen

Assembler-Beispiel 6


    Die Aufgabe ist, eine Taste auf der Tastatur zu betätigen und die Bitfolge des Wertes auszugeben!

Nach Ausgabe der Bitfolge soll das Programm erneut durchlaufen werden.
Da die Bitfolge aller Tasten dargestellt werden soll, hat das Programm kein Ende. Das Programm kann nur durch Abbruch mit "Strg C" beendet werden!

Die Darstellung soll wie bei unserem 4Bit-Prozessor "ERNA" im Beispiel vom Simulator durch farbige "Balken" erfolgen (1 - rot; 0 - keine Darstellung). Die Bits sollen in einem entsprechenden Rahmen auf dem Bildschirm an genau einer festgelegten Stelle ausgegeben werden.
Im Gegensatz zum Beispiel in "ERNA" müssen wir uns nun um alle Dinge der Ausgabe selbst kümmern. Und da wir schon wissen, dass Farbe nur mit BIOS-Funktionen geht, werden wir uns nun auch damit beschäftigen.


Betätigt man die Tastatur, wird aus dem Tastatur-Code der ASCII-Code erzeugt, dieser steht dann als 8Bit Code auf dem AL-Register zur Verfügung (sofern man die DOS-Funktion nutzt). ASCII bedeutet: American Standard Code for Information Interchange.
Zu beachten ist, das diese Festlegung aus der Zeit stammt, als es noch Lochbänder als Datenträger gab. Auf Grund von Sicherheitsproblemen wurden zur Codierung nur 7 Bit genutzt, das oberste 8.Bit war Kontroll-Bit, zumeist für die Parität. Bestand eine Kodierung aus einer ungeraden Anzahl von Bits, so wurde das Paritätsbit dazu gesetzt. Der Empfänger konnte nun kontrollieren, ob Parität bestand, wenn nicht, gab es auf dem Weg einen Fehler, man konnte darauf reagieren.
Mit zunehmender Entwicklung wurde die Übertragung so sicher, dass man die Paritätsprüfung nicht mehr brauchte, damit konnte man nun das oberste Bit auch verwenden. Der ASCII-Code bezieht sich auf die unteren 128 Bitkombinationen (0 bis 127), nun konnte man auch die Kombinationen 128 bis 255 vergeben, dafür gibt es jedoch keine einheitliche Festlegung, hier können die Länderspezifischen Zeichen untergebracht werden, z.B. Deutsch: ä - 132, Ä - 143, ö - 148 usw.
Aber es wurden komplett andere Zeichen erstellt, z.B. ist der DOS-Zeichensatz komplett anders als der Windows-Zeichensats, in DOS musste man Grafikzeichen unterbringen, Windows betreibt eine Grafik-Karte, da braucht man keine Grafikzeichen


Wenn man also das Grafikzeichen für die Ecke unten links haben will, findet man dieses in der Zeile 192 + 0, also 192 ist unter DOS eine Ecke, unter Windows ist das ein A mit einem Zeichen drauf (À).

Das soll uns im Moment nicht weiter interessieren, wir wollen zunächst einen Algorithmus aufstellen, der in dem ASCII-Zeichen die 1 und 0 findet?

Mit der DOS-Funktion 8 wartet das System auf eine Eingabe und legt das Ergebnis als Bitfolge ins AL-Register. Diese Bitfolge entspricht dem ASCII-Code des Zeichens. Nun muss Bit für Bit ermittelt werden, ob eine 1 oder 0 auf den Plätzen steht.
Im Beispiel unter "ERNA" wurde ein ähnliches Problem behandelt. Wir wollen auch hier nach diesem Schema verfahren.
Es wird eine Maske definiert, das ist eine Bitfolge, in diesem Fall 8 Bit, die an genau einer Stelle eine 1 und an allen anderen eine 0 hat. Unter Anwendung der logischen AND-Funktion von Bitfolge und Maske kann nun genau auf diese Stelle bezogen eine Aussage getroffen werden. Denn steht an dieser Stelle in der Bitfolge eine 0 wird nun, da alle anderen Bitoperationen auch 0 sind, das Zero-Flag gesetzt und das kann man auswerten. Im Folgenden noch einmal das Schema:


In Wert steht die Kodierung für die Taste 5. Links steht die 1 in der Maske auf Bit7. Das Ergebnis ist 0, also war da eine 0 im Wert.
Rechts im Schema für die Stelle von Bit5 kommt 1 heraus, das Zero-Flag wird nicht gesetzt, also war da eine 1.

    Der gesamte schematische Ablauf.

Nach der Eingabe wird der Wert zunächst einmal gerettet, denn durch die logische Operation wird der Wert eventuell verändert. Danach definieren wir die Maske für Bit7 (linkste Bit) und legen mit 8 in einem Speicher die Anzahl der Durchläufe fest.
Nun beginnt die Schleife:
Da wir diesen Teil 8 mal durchlaufen, holen wir zunächst den geretteten Wert und führen mit diesem und der Maske die logische AND Operation durch. Danach werten wir das Z-Flag aus und geben eine 0 oder 1 aus.
Um nun die weiteren Operationen durchführen zu können, brauchen wir eine neue Maske. Das erreichen wir einfach durch 1 mal Rechts-Schieben der momentanen Maske, dann muss noch die Anzahl der Durchläufe um 1 verringert und kontrolliert werden, ob sie schon 0 ist, dann ist der Algorithmus zu Ende, ansonsten geht es wieder von vorne los.


Diesen Algorithmus sollte man erst einmal als Programm erstellen, dann weiß man, dass das Verfahren so funktioniert und beginnt dann mit der grafischen Realisierung. Die Darstellung erfolgt nun anders!

    So soll das auf dem Bildschirm dargestellt werden!

Links soll zuerst der eingelesene Wert (Taste) wieder ausgegeben werden, dann folgen die Zeichen: Leerzeichen, =, > und Leerzeichen. Dann soll die Darstellung der Bitfolge als Textblöcke erfolgen.
Die Bit-Darstellung soll umrahmt werden!


Das sieht alles sehr einfach aus, wir müssen das alles im DOS-Format erstellen, das bedeutet, da ja dieses DOS nicht über eine Grafik-Karte verfügt, dass wir alles mittels Textzeichen erstellen müssen. Nun kann man aber von Glück sprechen, dass wir im DOS-System sind, denn der Zeichensatz verfügt über sehr sinvolle Textzeichen ( siehe ASCII-Tabelle ):

    Û(219) (032) ³(179) Ä(196) ¿(191) Ú(218) Ù(217) À(192) Â(194) Á(193)

Mit diesen Zeichen kann man sehr gut einen Rahmen gestalten. Links sind DOS-Zeichen dargestellt, rechts was denn daraus Windows macht. Damit ist nun auch klar, dass Assembler-Quellen mit dem Texteditor unter Windows etwas anders aussehen können, als wenn ich den System eigenen Editor benutze.
Das erste Zeichen (Tabelle links) soll zur Darstellung des Bits benutzt werden.
Und noch etwas sollte auffallen, das z.B. eine Ecke von dem Rahmen ein komplettes Textzeichen ist!

    Das Bild zeigt eine mögliche Realisierung der Aufgabe. Wir brauchen 3 Textzeilen, wobei sich bei Darstellung einer anderen Bitfolge nur die mittlere Zeile ändert.
Ein DOS-Bildschirm hat 80 Spalten und 25 Zeilen, wobei die Zählung jeweils mit 0 beginnt, aber die erste Zeile (Zeile 0) ist die oberste auf dem Bildschirm. Das Textzeichen oben links hat somit die Position 0,0.
Wenn also die drei Zeilen immer an der gleichen Stelle auf dem Bildschirm erscheinen sollen, werden wir auch Positionierungen des Ausgabe vornehmen müssen!

    Das ist das ganze Programm!?

Das kann es ja wohl nicht sein? Aber bei genauerem Hinsehen stellt man fest, dass da wohl mit
    BYTE_ANZ wert,5,10
ein Macro aufgerufen wird und in dem muss alles stecken.
Aber der Reihe nach. In der ersten Zeile wird die Macro-Datei mit "INCLUDE B_ANZ2.BIB" vereinbart. Danach folgen die Assemblerdirektiven. Was fehlt ist das Datensegment!
Wir wollen ja über Tastatur einen Wert (Tastaturcode) einlesen, den wollen wir nun aber im Speicher aufheben. Da wir das noch nicht haben, vereinbaren wir im Code-Segment einen Speicherplatz mit entsprechender Größe:
    wert DB ?
DB bedeutet etwa "Definiere Byte". Jetzt sind 8Bit reserviert und da der Wert für "wert" noch nicht bekannt ist, wird ein "?" geschrieben. Nun muss man aber dafür sorgen, dass dieser Speicherplatz nicht als Befehl interpretiert wird, deshalb zuvor der Befehl
    jmp m1
(jmp: JUMP - unbedingter Sprung zur Adresse m1)
Der weitere Ablauf ist bekannt: DOS-Funktion 8 zum Einlesen des Wertes, Darstellung des Wertes (BYTE_ANZ) und Rücksprung zu "start" (m1 hätte auch gereicht).
Obwohl die folgenden Zeilen nicht erreicht werden, muss der Rücksprung zum DOS-System (DOS Fkt 4Ch) und das "END" geschrieben werden.

Zu beachten ist, dass das Macro mit Parametern eingesetzt wird: wert wurde eingelesen und wird im Macro verarbeitet, die Zahlen 5 und 10 sind die Position der Darstellung auf dem Bildschirm (Zeile 5, Spalte 10). Das Macro soll nun auch mit anderen Werten arbeiten können, also andere Position!


Als nächstes müssen wir uns die Macro-Datei "B_ANZ2.BIB" ansehen. Da sie etwas umfangreich ist wurde daraus eine B_ANZ2.pdf" zur Anschauung erstellt. Dennoch gibt es zur Datei Einiges zu sagen:
Damit haben wir nun grob alle Teile des Programms beschrieben.

    Das Bearbeiten der Aufgabe geht wieder sehr gut mit der bekannten Bedienoberfläche.
Als Quelle 1 vereinbaren wir das kleine ASM-Programm, hier mit dem Namen:
    t_anzb2.asm
Als zweite Quelle nutzen wir die Macro-Datei:
    b_anz2.bib.
Mit "w" kann man schnell zwischen den beiden Dateien zum Editor wechseln, das geht natürlich auch mit zwei Windows-Editor-Fenster, allerdings hat man dann einen anderen Zeichensatz (siehe oben).

    Assembliert man "t_anzb2.asm", erhält man, wie bekannt, neben der Objektdatei auch die LST-Datei "t_anzb2.lst". Die ist natürlich ganz schön umfangreich, so dass sie hier nicht dargestellt werden soll es gibt sie aber als PDF-Datei: T_ANZB2_2_LST.pdf.
(die Datei wurde nachträglich etwas bearbeitet, ist so nicht das Ergebnis der Assemblierung)
Aber es soll ein kleines Stückchen aus dieser Datei dargestellt werden (links).
Wenn ein Text aus einem Macro eingesetzt wird, dann erhält bekannter Maßen die Zeile am Anfang eine Zahl, wird "BYTE_ANZ" verwendet, so steht dort eine "1". Wird nun in diesem Teil erneut Text aus einem Makro eingesetzt, so wird einfach weiter gezählt, die "2" steht nun für das Macro "BS_POS".
Steht keine Zahl vor der Zeile, so handelt es sich um eine Zeile aus der Quelldatei, in diesem Fall "T_ANZB2.ASM". Man hat so eine recht gute Übersicht, wo man bei Fehlern ansetzen muss.


    In den folgenden zwei Bildern wurden nur die Zeilen aus der Quelldatei und aus BYTE_ANZ dargestellt. Alle weiteren Macros wurden nur noch mit dem Namen vermerkt.
An den grünen und roten Unterstreichungen darf man sich nicht stören, diese entstande bei der Bearbeitung der LST-Dtai mit dem Textsystem WORD. Das meckert natürlich über viele Dinge, aber man kann mit WORD bestens formatieren und dann alles unter DOS speichern. Man sieht das auch daran, dass der Rahmen exakt dargestellt wird.

So sieht das Ergebnis aus:

zurück zur Start-Seite (Beispiele)   /   weiter Dateien zum System
zurück zur Start-Seite                   /   weiter Aufgabe zum Üben