Schlagwort-Liste: 8086 16-Bit-Rechner - Programme: Assembler, Beispiele, Verzögerungsschleife, Makros

Assembler-Beispiel 5


MACROS

Dieses Thema soll nur kurz behandelt werden, es ist eine besondere Leistung des Assemblers und kann die Programmierarbeit vereinfachen, es ist keine weitere Leistung des Prozessors.

Was leisten Macros?


Der Vorteil dieser Arbeitsweise ist, dass man sich für wiederholt auftretende Programmteile eine Bibliothek (Datei) anlegen kann und aus dieser nur durch nennen des Namens die entsprechende Befehlsfolge sucht und ins Programm einsetzen läßt.
Der Nachteil ist natürlich, dass das Programm schnell wächst und man schnell die Segmentgrößen erreicht. Das passiert auch dadurch, dass Macros ähnlich wie Unterprogramm genutzt werden und außerdem viel variabler sind, z.B. können Parameter mit übergeben werden. Es sind auch bedingte Textersetzungen möglich. Das ähnelt dann schon den Möglichkeiten der höheren Programmiersprache C.

Und so funktionieren MACROS:

    Im Programm (links) wird ein Name für die Befehlsgruppe an der Stelle, wo sie eingesetzt werden soll, angegeben.
In der Bibliotheks-Datei wird nach dem Namen gesucht. Danach muss dann die Bezeichnung "MACRO" stehen und es können Parameter folgen.
In den nächsten Zeilen folgen dann die Befehle, die ins Programm eingesetzt werden sollen. Das geht solange bis die Endekennung "ENDM" gefunden wird.

So könnte dann ein Macro aussehen:

    Der Name des Macros ist "TAST_ECHO_AL". Danach wird dieser Name als "MACRO" definiert. Der Macro-Name wird nicht durch ":" beendet. Die Befehlsfolge, die zu diesem Macro gehört, wird mit "ENDM" beendet. Im Gegensatz zum UP steht davor nicht noch einmal der Macro-Name!
Die Befehlsfolge wird in eine Datei geschrieben, hier MACRO.BIB, dort wird die Folge dann bei Bedarf unter dem vereinbarten NNamen gefunden.
Der Name der Datei ist beliebig, er wird im Basis-Programm ohnehin vereinbart, aber "BIB" deutet schon mal auf Bibliothek hin.

Das Macro organisiert über die DOS-Funktion eine Tastatureingabe, der ASCII-Code des Tastaturzeichens landet im AL-Register und wird gleichfalls auf Bildschirm ausgegeben.

Oben wurde bereits darauf hingewiesen, dass Macros auch Entscheidungen treffen können, besser, das Textverarbeitungssystem kann anhand von Bedingungen unterschiedliche Texte einbinden.
Solche Bedingungen gibt es:



IFBedingung
Befehl 1.1
...
Befehl 1.n
[ELSE
Befehl 2.1
...
Befehl 2.m]
ENDIF

Können auch mit ELSEIF
geschachtelt werden (Bedingung2).
    Bedingungen können sein:

EQ    =
NE    !=
LT    <
LE    <=
GT    >
GE    >=




So könnte schematisch solche bedingte Einsetzung aussehen:

MAC_X    MACRO vergl
    IF (vergl EQ AL) OR (vergl EQ AH)
    ...
    ELSE
    ...
    ENDIF
    ENDM

Wenn "vergl" mit AL oder AH übereinstimmt wird gleich der folgende Teil eingesetzt, anderenfalls der hinter "ELSE".


Nun aber wieder zu unserem Beispiel:

    wir wollen die Textausgabe und die Warteschleife als Macro mit ins Programm einbeziehen.
TXT_AUS ist der Name fürs Macro der Textausgabe, WARTE der für die Warteschleife.
Und gleich gibt es wieder sehr gute Unterstützung, denn hinter dem Namen WARTE steht ein Wert, der soll als Anzahl der Durchläufe für die äußere Warteschleife genutzt werden.
Und hinter TXT_AUS wird als Parameter der Bezug zum Text (text) angegeben - solche Möglichkeiten bieten Macros.

Wichtig ist nun aber, dass dem Programm bekannt gegeben werden muss, wo die Macros zu finden sind.
Das geschiht als erstes noch vor der Festlegung des Modells mit:
    INCLUDE MACRO.BIB
Hier kann man natürlich auch einen anderen Namen verwenden.

    Links ist ein Ausschnitt der von Wolfgang Link im Buch "Wolfgang Link; Assemblerprogrammierung; Franzis Verlag 2000" erarbeiteten und beschriebenen Datei "MACRO.BIB" dargestellt. Die gesamte ist im pdf-Format durch Anklicken des Ausschnittes zu erreichen.

Es gibt aber noch einige Dinge zu bemerken.
In die fertige Datei habe ich einfach an beliebiger Stelle das Macro TXT_AUS eingefügt, der Text-Editor findet diesen Teil auch.
Am Anfang der Datei gibt es eine weitere Assembler-Direktive: .XLINK. Die Eigenart des Text-Editors besteht darin, dass in der LST-Datei am Anfang erst einmal die gesamte Macro-Datei ausgelistet wird. Das ist nicht unbedingt notwendig, deshalb wird das mit .XLINK verhindert!
Als weitere Leisung kann man auch Konstantenvereinbarungen in diese Datei aufnehmen, im Beispiel wurde für CR eben der Wert 0Dh vereinbart usw.

    Die LST-Datei zum Beispiel zeigt die Änderungen.
Überall wo die Zeilen aus einem Macro eingefügt wurden, steht noch vor der Zeilennumerierung eine 1. Oben hinter INCLUDE folgt auch eine 1, hier würde ohne .XLIST die gesamte Macro-Datei ausgelistet werden (da können dann auch andere Zahlen stehen).
Zeile 21 bis 27 wurde die Textausgabe eingefügt, das wurde wieder mit der 1 gekennzeichnet.
Ab Zeile 30 folgt dann das Einfügen der Warteschleife. Der Parameter wird ordnungsgemäß dem Register BX zugeordnet. Dann gibt es aber etwas Besonderes, die Marken werden sehr eigenartig geschrieben. Das kann man am Macro besser klären.

    Um sicher zu gehen, dass die Marken auch nur in dem Macro verwendet werden dürfen, gibt es im Macro die Anweisung
    LOCAL M0,M1
Beim Einsetzen der Textfolge vergibt der Editor nun neue Marken, die garantiert nur hier vorkommen. Damit kann man ohne große Überlegung jede beliebige Marke verwenden!

Im letzten Beispiel sollen nun alle bisherigen Beschreibungen zusammen in einem Beispiel angewendet werden

zurück zur Start-Seite (Beispiele)   /   weiter Beispiel 6
zurück zur Start-Seite