home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
assemblr
/
tutorial
/
asmlehrg
/
lehrer.doc
next >
Wrap
Text File
|
1993-07-29
|
53KB
|
765 lines
Die Assembler-Sprache - eine Fibel für Anfänger
(C) 1983 by David Whitman
Deutsche Übersetzung bei TOASTI
Inhaltsverzeichnis
Einleitung.........................................2
Der Computer als ein Bit-Muster-Manipulator........3
Einführung: Aufzeichnungs-Systeme für Bit-Muster...5
Die Adressierung des Speichers.....................7
Der Speicherinhalt: Daten und Programme............8
Die Entwicklung der Assembler-Sprache..............9
Die 8088 CPU......................................11
Syntax der Assembler-Sprache......................14
Der Stack.........................................17
Software Interrupts (Programmunterbrechungen).....19
Pseudo-Operationen (Unechte Operationen)..........21
Lehrgang..........................................23
2
>>EINLEITUNG<<
Viele Leute erwarten von CHASM Anzeigen, weil sie sich für das
Lernen der Assembler-Sprache interessieren. Sie sind Anfänger und
haben nur wenige Vorstellungen, wo sie beginnen sollen. Diese Fibel
weist jene Benutzer ein. Erfahrene Benutzer werden hier wahrscheinlich
wenig finden, was sie nicht bereits wissen.
Dieser Text wird, da er nur eine Fibel ist, nicht alles lehren, was
man über die Programmierung in Assembler wissen muß. Sein Zweck ist es,
Ihnen einiges vom Wortschatz und den Gedanken zu vermitteln, die Ihnen
beim Lernen hilfreich sein werden.
Ich muß eine kleine Einschränkung machen: Ich betrachte mich als rela-
tiver Anfänger in der Assembler-Programmierung. Ein wichtiger Grund für
das Schreiben von CHASM war der Versuch, die Assembler-Programmierung
dadurch zu erlernen. Ich glaube, ich haben einiges gelernt, aber es ist
ziemlich wahrscheinlich, daß einige meiner Vorstellungen, die ich damit
verband, mehr oder weniger falsch sind. Trotzdem habe ich seitdem eine
Menge voll funktionstüchtiger Assembler-Programme geschaffen.
3
>>DER COMPUTER ALS BIT-MUSTER-MANIPULATOR.<<
Jeder hat eine Vorstellung darüber, was ein Computer tut. Auf der
einen Seite denkt man an eine Maschine, welche BASIC-Programme aus-
führen kann. Eine andere Vorstellung ist, daß der Computer ein Zahlen-
fressendes Gerät ist. Ich verwende den Computer gerade zur Textver-
arbeitung, weil ich diese Fibel schreibe.
Ich hätte gern einen allgemeineren Begriff eingeführt als gerade den,
welche Art von Maschine ein Computer ist: ein Bit-Muster-Manipulator.
Ich bin sicher, daß jeder darüber bescheid weiß, was ein *Bit* ist
(Anmerkung: Jedes von *Sternen* eingeschlossene Wort in dieser Fibel
ist so zu lesen, als ob es KURSIV gedruckt wäre). Ein Bit kennt zwei
Zustände: ein und aus, normalerweise dargestellt mit den Symbolen
"1" und "0". Denken Sie in diesem Zusammenhang nicht an die Ziffern
1 und 0. Sie sind bloß Abkürzungen für den momentanen Zustand
eines Bit's.
Der Speicher Ihres Computers besteht aus riesigen Sammlungen von
Bit's, jedes davon kann sich entweder im Zustand 1 oder 0 (ein oder
aus) befinden.
Das Herz Ihres Computers ist normalerweise ein 8088 Microprozessor-Chip
von Intel. Dieser Chip kann alle Bit's manipulieren, die in ihrer
Gesamtheit den Speicher des Computers ausmachen.
Der 8088 behandelt Bit's in Blöcken, weshalb wir besondere Namen
für zwei Größen von Bit-Blöcken einführen werden, mit denen der 8088
gerne arbeitet. Ein *Byte* besteht aus einem Block von acht Bit's.
Ein *Word* besteht aus zwei Bytes, das entspricht also sechzehn Bit's.
Eine Sammlung von Bit's enthält ein Muster, festgelegt durch den Zustand
von seinen Bit's. Hier sehen Sie einige typische, ein Byte lange,
Muster: 10101010 11111111 00001111
Wenn Sie in Mathe gut sind, dann können sie ziemlich einfach heraus-
finden, daß ein Byte genau 256 verschiedene Muster enthalten kann.
Genauso kann ein Word 65.536 verschiedene Muster enthalten.
4
Nun zu der wichtigsten Idee der Assembler-Programmierung.
Halten Sie sich fest! Diese Bit-Muster können dazu verwendet werden,
andere Dinge darzustellen, indem jedes Muster eine bestimmte Sache
darstellt. o a member of the other set. Es hört sich seltsam an,
aber IBM hat aus dieser Idee *Billionen* gemacht.
Zum Beispiel kann man bei Verwendung aller Muster eines Word's für
ganze Zahlen alle Werte von 0 bis 65536 oder von -32768 bis 32767
darstellen. Diesen Zahlenbereich werden Sie häufig antreffen, wie
beispielsweise den Bereich der möglichen Zeilennummern oder die
möglichen Werte einer Integer-Variable in BASIC-Programmen. Das
erklärt diese etwas willkürlich erscheinenden Begrenzungen:
BASIC verwendet zum Speichern von Integer-Variablen und Zeilen-
nummern Word's.
Ein anderes Beispiel: Man kann die verschiedenen Muster eines Bytes
dazu verwenden, um eine Reihe von willkürlich ausgewählten kleinen
Bildern auf dem Bildschirm darzustellen. Wenn Sie in Ihrem BASIC-Hand-
buch im Anhang G nachsehen, werden Sie feststellen, daß es *genau* 256
verschiedene Zeichen gibt, die man auf dem Bilschirm darstellen kann.
Ihr Computer verwendet jeweils ein Byte, um ein Zeichen auf jeder
Position des Bilschirms anzuzeigen.
Ohne, daß ich zuweit vorausgreife, möchte ich doch kurz erwähnen,
daß es über 256 grundlegende Wege beim 8088 gibt, die gespeicherten
Bit-Muster zu manipulieren. Dies deutet auf eine andere Verwendung der
Bit-Muster hin, die wir später noch genauer erläutern werden.
Das Wichtigste ist, daß wir mit den Bit-Mustern alles darstellen können,
was wir wollen. Außerdem kann man die Muster auf unterschiedliche Art
und Weise manipulieren, Ergebnisse produzieren und ausgewählte Teile
davon weiterverarbeiten oder anzeigen.
5
>>EINFÜHRUNG: EIN AUFZEICHNUNGS-SYSTEM FÜR BIT-MUSTER<<
Da es sehr wichtig ist, wäre es schön, wenn wir eine passende
Möglichkeit hätten, die verschiedenen Bit-Muster darzustellen, die wir
noch besprechen werden. Eine Möglichkeit kennen wir schon, nämlich die
Auflistung der einzelnen Bit's als eine Reihe von 1'en und 0'en. Dieses
System ist ziemlich ungeschickt und fehleranfällig. Sind die folgenden
Muster identisch oder nicht?
1111111011111111 1111111101111111
Sie hatten bestimmt Probleme, den Unterschied zu erkennen. Sie sind
einfacher zu unterscheiden, wenn man sie in handlichere Stücke unter-
teilt und diese dann vergleicht. Hier sehen Sie nochmals dieselben
Muster, unterteilt in Blöcken zu vier Bit's:
1111 1110 1111 1111 1111 1111 0111 1111
Einige Clown's haben diesen vier-Bit-Blöcken den Namen *Nibble* gegeben,
wahrscheinlich weil vier Bit's ein halbes Byte sind. Ein Nibble ist
ganz einfach handzuhaben. Ein Nibble kann nur 16 verschiedene Muster
darstellen, und die meißten Leute können diese Muster sehr einfach
unterscheiden.
Jedes verschiedene Nibble-Muster hat von den Computer-Wissenschaftlern
ein einzelnes Zeichen bekommen. Den ersten zehn Mustern wurden die
Ziffern "0" bis "9" zugeordnet, für die restlichen Muster werden die
Buchstaben "A" bis "F" verwendet.
Untenstehend sehen Sie die "Nibble-Muster-Codierung":
0000 = 0 0001 = 1 0010 = 2 0011 = 3
0100 = 4 0101 = 5 0110 = 6 0111 = 7
1000 = 8 1001 = 9 1010 = A 1011 = B
1100 = C 1101 = D 1110 = E 1111 = F
Durch Verwendung der Nibble-Codierung können wir zwei ähnliche
Word-Muster in der folgenden übersichtlicheren und kürzeren Form
darstellen:
FEFF FF7F
6
Natürlich war die Zuweisung der Zeichen für die verschiedenen
Nibble-Muster nicht so willkürlich, wie es vielleicht erscheinen mag.
Ein aufmerksamer Leser, der das System der binären Zahlen erkannt hat,
wird die zugrundeliegenden Regeln der Zuweisung bemerkt haben. Falls
die 1'en und 0'en der Muster als wirkliche *Zahlen* übersetzt
werden, anstatt nur als reine Zeichen für den Bit-Zustand, dann zeigen
deren Zeichen von "0" bis "9" die entsprechenden dezimalen Ziffern
an.
Die letzten sech Muster erhalten die Bezeichnung von "A" bis "F",
und alle Zeichen von "0" bis "F" zusammen bilden die Ziffern des
*hexadezimalen* Zahlensystems. Durch diese Zeichen-Zuweisung zu
den verschiedenen Nibble-Mustern bestätigt sich das alte Vorurteil,
daß der Computer eine rein zahlenverarbeitende Maschine ist.
Obwohl diese Zeichen-Zuweisung eine wichtige Übersetzung dieser
Zeichen ist, hat man bald aufgehört, großartig darüber nachzu-
denken, wie man eine Kurzform zum Schreiben der Bit-Muster finden kann.
Weil einige Nibble-Muster wie eine Zahl aussehen, ist es meißt
notwendig, irgendwie anzuzeigen, daß man ein bestimmtes Muster
meint. In BASIC tut man dies, indem man Schriftzeichen "&H" an den
Anfang des Muster hinzufügt: &H1234. Eine häufiger vorkommende Verein-
barung ist, daß man den Buchstaben "H" ans Ende des Muster zufügt:
1234H. Bei beiden Darstellungen steht das H für "hexadezimal".
Sie sollten schließlich mehr über die Verwendung des hexadezimalen
Zahlensystems lernen, da es sehr wichtig für Sie sein wird.
Ich möchte an dieser Stelle nicht weiter darauf eingehen, warum
zahlreiche Bücher bessere Abhandlungen über dieses Thema enthalten als
diese Fibel. Sie können Wissenslücken über dieses bedeutende Thema
später "füllen".
7
>>DIE ADRESSIERUNG DES SPEICHERS<<
Wie Sie vorhin schon erfahren haben kann der 8088 Chip im Innern
Ihres Computers die Bit-Muster seines Speichers manipulieren.
So ist es z. B. möglich, Bit-Muster von einem Ort zum andern zu
kopieren, bestimmte Bit's zu setzen oder zu löschen, oder Bit-Muster
als Zahlen zu interpretieren und damit Rechenoperationen auszu-
führen. Um diese Funktionen ausführen zu können, muß der 8088 wissen,
welchen Teil des Speichers er gerade bearbeitet hat. Eine bestimmte
Stelle im Speicher wird durch seine *Adresse* markiert.
Eine Adresse ist ein Zeiger in den Speicher. Jede Adresse zeigt auf den
Anfang eines ein Byte langen Blockes im Speicher. Der 8088 hat die
Fähigkeit, 1.048.576 verschiedene Bytes des Speichers zu unterscheiden.
Es dürfte für Sie wohl keine Überaschung sein, zu hören, daß Adressen
durch Bit-Muster dargestellt werden. Man benötigt 20 Bit's, um alle
1.048.576 verschiedene Bytes unterscheiden zu können, und deshalb wer-
den die Adressen mit 5 Nibble-Zeichen dargestellt. MS-DOS zum Beispiel
speichert ein Bit-Muster, das Informationen über die installierte
Ausrüstungen Ihres IBM PC's enthält, in dem Word, welches an der
Adresse 00410 beginnt. Wenn die Adresse als hexadezimale Zahl angesehen
wird, so hat das zweite Byte von diesem Word die Adresse um eins größer
als 00410, also 00411.
Der 8088 ist nicht sehr erfreut, 20 Bit's zu bearbeiten. Der größte
Block, den er bearbeiten kann, ist ein 16 Bit Word. In Wirklichkeit
berechnet der 8088 eine 20 Bit Adresse aus einer Kombination von
zwei Word's, einem Teil-Word und ein Zusatz-Word. Der Kombinations-
Vorgang sorgt dafür, daß die zwei Word's als hexadezimale Zahlen er-
kannt und aufaddiert werden. Zwei Word's ergeben miteinander kombi-
niert ein 20 Bit Muster, indem die zwei Word's um eine Nibble-Stelle
verschoben zusammenaddiert werden:
0040 4 Teil-Nibble
0010 4 Zusatz-Nibble
--------
00410 5 Nibble Adresse
Wegen dieser Art und Weise der Adressen-Berechnung werden sie oft
in der Form "Teil:Zusatz" hingeschrieben. Deshalb könnten die
Adressen der eben vorgenommenen Berechnung auch so geschreiben werden:
0040:0010
8
>>DER SPEICHERINHALT: DATEN UND PROGRAMME<<
Den Inhalt des Speichers kann man grob einteilen in zwei Klassen.
Einerseits in *Daten*, genauergesagt in Bit-Muster zum Arbeiten für
den 8088. Die Bedeutung dieser Bit-Muster wird festgelegt durch den
Computer, den Sie gerade benutzen.
Die zweite Klasse des Speicherinhalts sind die *Anweisungen*. Der 8088
kann in seinen Speicher sehen und das Bit-Muster, das er dort sieht,
als eines seiner rund 200 grundlegenden Operationen, die er kennt,
erkennen. Diese Auflistung von Operationen in Form von Bit-Mustern nennt
man die *Maschinen-Sprache* des 8088. Ein Maschinen-Sprache *Programm*
beinhaltet eine Reihe von Bit-Mustern, die sich hintereinander im Spei-
cher befinden. Diese zusammenarbeitenden Operationen leisten einige
nützliche Dinge.
Bitte beachten Sie, daß der 8088 keine Möglichkeit hat, zu unter-
scheiden, ob ein Bit-Muster eine Anweisung oder ein Teil von Daten dar-
stellen soll. Es ist für den Chip möglich, zufällig an einer Stelle
mit dem Lesen zu beginnen und Daten als Anweisungen oder umgekehrt zu
interpretieren. Wenn dies geschieht können einige sehr bizarre Sachen
passieren. Unter Assembler-Programmierern ist dies bekannt als
"Systemabsturz".
9
>>DIE ENTWICKLUNG DER ASSEMBLER-SPRACHE<<
Die Muster, aus die ein Assemblerprogramm besteht, können ziemlich
verwirrend sein. So sieht zum Beispiel das Muster, welches dem 8088
sagt, die Bits in dem Byte der Speicheradresse 5555 umzudrehen,
folgendermaßen aus:
F6 16 55 55
Das ist nicht sehr informativ, obwohl man die darinnen die Adresse
5555 erkennen kann. Vor langer Zeit mußten die alten Vakuum-Röhren-
Computer noch mit mühsamen übersetzten Bit-Mustern programmiert
werden, welche die Folge der gewünschten Anweisungen darstellten.
Es ist wohl unnötig, zu erwähnen, das diese Arbeitsweise unglaublich
langweilig und fehleranfällig war. Schließlich kamen diese Programierer
auf die Idee, diese Aufgabe des Übersetzens in die passenden
Bit-Muster dem Computer zu übertragen, und so wurde die Assembler-
Sprache geboren.
Assembler stellt jede der vielen Operationen, die der Computer
ausführen kann, als ein *Mnemonic*, einer kurzen, leicht zu merkenden
Buchstabenfolge dar. In der Booleschen Algebra wird z. B. die logische
Operation, die den Wert eines Bits umdreht, "not" genannt, und deshalb
ist in Assembler folgendes gleichbedeutend mit dem vorhergehenden
Maschinensprache-Muster:
NOTB [5555]
Die eckigen Klammern um die 5555 meint ungefähr: "der Inhalt der
Speicheradresse". Das "B" am Ende von "NOTB" zeigt an, daß wir mit
einem Byte des Speichers, nicht mit einem Word, arbeiten wollen.
Unglücklicherweise kann der 8088 mit dem String "NOTB" nicht sehr
viel anfangen. Was man braucht, ist ein besonderes Programm, das mit
dem 8088 läuft und den String "NOTB" in das Muster F6 16 umwandelt.
Dieses Programm heißt Assembler. Einen Assembler kann man sich wie
einen Fleischwolf vorstellen, der Programme in der Assembler-Sprache
verarbeitet und Maschinen-Programme ausspuckt.
Ein Assembler ließt ein Assembler-Programm und übersetzt es Zeile
für Zeile. Heraus kommt ein Maschinensprache-Programm. Das zu über-
setzende Assembler-Programm nennt man den *Source File*, das übersetzte
Maschinensprache-Programm nennt man *Object File*. Die erzeugten
Maschinensprache-Muster nennt man *Object Code*.
10
Außerdem wird während der Assemblierung ein *Listing* erzeugt, welches
das Ergebnis der Assemblierung zusammengefaßt darstellt. Das Listing
zeigt jede Zeile des Source File, zusammen mit dem Source File und
und dem erzeugten Object Code. Wenn der Assembler irgeneine Zeile
im Source File nicht versteht, so fügt er am Ende des Listings
eine Fehlermeldung ein, die den aufgetretenen Fehler genauer
beschreibt.
Die allerersten Assembler-Programmierer mußten Ihr Assembler-
Programm in Maschinensprache schreiben, weil sie keine andere Wahl
hatten. Ich schrieb CASM in BASIC. Wenn Sie genauer darüber nachdenken,
werden Sie viele Verbindungen zwischen Assembler und BASIC finden.
Irgendein Programmierer von Mircrosoft schrieb den BASIC-Interpreter
in Assembler, und ich verwandte BASIC zum Schreiben eines Assemblers.
Ich hoffe, einestages eine neue Version von CHASM in Maschinensprache
zu programmieren, die dann ungefähr hundertmal schneller sein wird
als die augenblickliche Version.
11
>>Die 8088 CPU<<
Die vorangehenden Erörterungen haben Ihnen (so hoffe ich) einige allge-
meine Grundlagen vermittelt, die Ihnen bei der Programmierung in Assem-
bler und Maschinensprache behilflich sein werden. An diese Stelle möchte
ich nun etwas mehr ins Detail gehen, beginnend bei der Untersuchung der
inneren Struktur des 8088 Microprozessors, vom Standpunkt des Program-
mierer's aus. Die Erörterung ist eine gekürzte Fassung der Information-
en, die ich dem Buch "The 8086 Book" entnommen habe (Autoren: Russel
Rector und George Alexy; Verlag: Osborne/McGraw-Hill).
Wenn Sie dies einmal verdaut haben, würde ich empfehlen, das o. a. Buch
durchzuarbeiten. Beim Benutzen von CHASM werden Sie das Buch jedenfalls
irgendwie brauchen, damit Ihnen die unterschiedlichen Anweisungen des
8088 und deren Mnemnonics (=kurze Buchstabenfolge) klar werden.
Innerhalb des 8088 gibt es eine Anzahl von *Registern*, jedes von ihnen
kann einen 16-Bit-Wert speichern. In der Assembler-Sprache hat jedes
dieser Register einen Kurznamen, bestehend aus zwei Buchstaben. Es gibt
14 Register, ihre Kurznamen sind:
AX BX CX DX SP BP SI DI CS DS SS ES PC ST
Die Register unterscheiden sich ein wenig voneinander, sie haben ver-
schiedene Verwendungen, aber sie können in zwei grobe Klassen eingeteilt
werden. Die *Allgemein*-Register sind AX, BX, CX und DX. Ebendiese sind
Register, die Muster aus dem Speicher holen und zwischenspeichern, die
dann innerhalb des 8088 verarbeitet werden. Diese Register können Sie
verwenden, wofür Sie wollen.
Jedes der Allgemein-Register kann man in zwei 8-Bit-Register aufteilen,
welche eigene, aber ähnliche Namen besitzen. Deshalb teilt man das CX-
Register auf in das CH- und CL-Register. Das "H" und das "L" stehen für
"High" beziehungsweise "Low". respectively. Jedes Allgemein-Register
wird also in ein Paar Register eingeteilt (High und Low).
Das AX-Register, und seine 8-Bit Low-Hälfte, das AL-Register, sind
etwas besonderes. Hauptsächlich aus historischen Gründen wird dieses
Register auf den *Akkumulator* zurückgeführt. Einige Operationen des
8088 können nur mit dem Inhalt dieses *Akkumulator*-Registers ausgeführt
werden, viele andere sind um einiges schneller, wenn sie in Verbindung
mit diesem Register ausgeführt werden.
12
Eine andere Gruppe von Registern sind die *Segment*-Register (CS DS SS
ES). Diese Register enthalten Teil-Werte zur Berechnung von Speicher-
Adressen. Das CS-Register (Code-Segment-Register) wird jedesmal ver-d
wendet, wenn der 8088 auf den Speicher zugreift, um Anweisungen daraus
zu lesen. Das DS-Register (Data-Segment-Register) wird zum Lesen von
Daten-Muster benutzt. Das SS-Register wird beim Stack-Zugriff benutzt
(mehr über den Stack später). Das ES-Register ist das Extra-Segment-
Register. Die meißten Spezial-Anweisung benutzen das ES-Register beim
Speicher-Zugriff, außerdem können Sie sich über die Verwendung des DS-
Registers hinwegsetzen und damit das ES-Register ersetzen, wenn Sie zwei
seperate Daten-Zonen unterhalten wollen.
Die *Pointer* (SP BP) und *Index* (DI SI) Register dienen der Verwirk-
lichung der indirekten Adressierung, die eine sehr mächtige Technik des
Speicherzugriffs darstellt. Die Indirekte Adressierung gehört nicht zum
Thema dieser kleinen Einführung. Das SP-Register wird benötigt, um
den Stack im Speicher zu realisieren (nochmals: mehr über den Stack
später). Neben diesen besonderen Funktionen können die BP-,DI- und SI-
Register als zusätzliche Mehrzweck-Register verwendet werden. Obwohl
es möglich wäre, die Werte im SP-Register direkt zu manipulieren,
sollte man trotzdem die Finger davon lassen, weil es sonst zu einem
Durcheinander im Stack kommen kann (Systemabsturz!).
Schließlich gibt es noch zwei Register, die jedoch zum direkten Manipu-
lieren relativ uninteressant sind. Das erste ist der *Programm Counter*,
PC. Dieses Register enthält immer einen Zeiger auf die Adresse der
nächsten Anweisung, die ausgeführt werden soll. Obwohl es nicht er-
laubt ist, Werte in dieses Register zu schreiben, können Sie indirekt
Werte in dieses Register schreiben und deshalb die nächste auszuführende
Anweisung bestimmen, indem Sie ähnliche Anweisungen wie es in BASIC die
GOTO und GOSUB Befehle sind, geben. Gelegentlich werden Sie auch
auf den Begriff *IP* (Instruction Pointer) stoßen, der gleichbedeutend
mit dem PC ist.
Das letzte Register ist auch relativ uninteressant. Es ist das *Status*
Register, ST. Dieses hat zwei verschiedene Namen, nämlich FL (Flag
Register) und PSW (Programm Status Word). Letzterer ist in der
Geschichte begründet, da dieser Name einer besonderen Speicherplatz-
Adresse gegeben wurde, die eine ähnliche Funktion bei dem antikem
IBM 360 Computer inne hatte.
13
Das Status-Register besteht aus einer Reihe von Ein-Bit-*Flags*, welche
auf die Arbeit des 8088 Einfluss nehmen. Es gibt besondere Anweisungen,
die es ermöglichen, jedes dieser Flags zu setzen oder zu löschen.
Außerdem beeinflussen viele Anweisungen den Wert der Flags, und zwar
Abhängig von ihrem Ergebnis. Eines der Bits des Status-Register wird
beispielsweise Zero-Flag genannt. Andere Anweisungen setzen das Zero-
Flag automatisch auf eins, wenn das Ergebnis einer Operation null
ist.
Das Setzen der Flags erscheint anfangs als unwichtiges Detail, später
werden Sie jedoch erfahren, das es Anweisungen gibt, mit denen man an-
hand des Flag-Musters bedingte Verzweigungen realisieren kann, ähnlich
wie "IF ... THEN GOTO" in BASIC. Die einzige Möglichkeit in Assembler,
Entscheidungen zu treffen und dementsprechend zu handeln, besteht im
Lesen und Auswerten der Flags.
Obwohl einige Anweisungen stillschweigend die Flags beinflussen, gibt
es eine Reihe von Anweisungen, die als einzige Wirkung die Flags in Ab-
hängigkeit von einem Test oder Vergleich setzen. Es ist allgemein üb-
lich, diese Vergleichs-Operationen kurz vor einer bedingten Verzweigung
zu verwenden. Zusammengenommen sind diese zwei Anweisungen genau das
wie folgende Befehle in BASIC:
IF (Vergleich) THEN GOTO (Zeilennummer)
14
>>Syntax der Assembler-Sprache<<
Im allgemeinen wird jede Zeile eines Assembler-Programms in ein be-
stimmtes Bit-Muster übersetzt, das eine einzelne grundlegende Operation
des 8088 ausführt.
Jede Zeile kann aus einem oder mehreren der folgenden Teile bestehen:
Zuerst aus einem Label, der nur eine Markierung einer Stelle darstellt.
Wenn Sie von einem Teil des Programmes einen anderen Teil aufrufen
möchten, müssen Sie einen Label an die aufzurufende Stelle setzen. Beim
Aufruf beziehen Sie sich dann auf den Label. Normalerweise kann der La-
bel aus einer beliebigen Zeichenfolge bestehen. Gewöhnlich verwendet
man dafür einen Namen, der Sie später an die Funktion des Programmteils
erinnert. CHASM nimmt an, daß jede Zeichenkette, die in der ersten
Spalte einer Zeile beginnt, ein Label sein soll. Nach dem Label, oder
falls der Text nicht in der ersten Spalte, sondern weiter rechts be-
ginnt, kommt die (mnemonische) Anweisung. Diese gibt genau an, was in
dieser Zeile ausgeführt werden soll. Eine Liste von über 200 Mnemonics,
zusammen mit ihren Übersetzungen können Sie dem Buch "The 8086 Book"
entnehmen. Die meißten Anweisungen für den 8088 benötigen einen oder
mehrere *Operanden*. Operanden sind Angaben, die verarbeitet werden.
Sie werden nach der mnemonischen Anweisung aufgelistet.
Es sind eine Anzahl von Operanden möglich. Die häufigsten Operanden
sind wohl die Register, die man an ihren Kurznamen (2 Buchstaben) er-
kennt. Eine andere Form von Operanden sind die *unmittelbaren Daten*,
das sind Bit-Muster, die irgendwo gespeichert oder mit anderen Mustern
verglichen werden sollen. Gewöhnlich werden unmittelbare Daten in der
hexadezimalen Form angegeben, markiert mit einem vorgestellten "H".
Einige Assembler erlauben außerdem andere Wege, um unmittelbare Daten
anzugeben, z. B. in Form einer Berechnung. CHASM ermöglicht fünf ver-
schiedene Formen, unmittelbare Daten anzugeben.
15
Eine Speicher-Adresse kann als Operand verwendet werden, indem man
sie als Zahl und in eckige Klammern schreibt (nun wissen Sie, wofür
man die eckigen Klammern benötigt. Ohne diese könnte man nicht zwischen
einer Adresse und den unmittelbaren Daten unterscheiden). Wenn Sie
einen Teil des Speichers für Daten reserviert und mit einem Label mar-
kiert haben (mehr darüber später), dann können Sie den Label anstelle
der Speicher-Adresse als Operand verwenden. Schließlich gibt es viele
Arten der indirekten Speicher-Adressierung, genaueres hierüber können
Sie in dem Buch "The 8086 Book" lesen.
Die letzte große Gruppe von Operanden sind Label. Verzweigende Anwei-
sungen benötigen einen Operanden, der ihnen sagt, wohin sie verzweigen
sollen. In der Assembler-Sprache kann man an Stellen, an die verzweigt
werden soll, Labels davorsetzen. Der Label kann dann als Operand bei
dem Verzweigungs-Befehl angegeben werden.
Häufig sind die aufgelisteten Operanden eines Befehl von großer Wichtig-
keit. Wenn Sie z. B. ein Bit-Muster von einem Platz zu einem anderen
kopieren wollen, müssen Sie angeben, von wo es kommt und wohin es
kopiert werden soll. Es wurde vereinbart, daß normalerweise der erste
Operand den *Bestimmungsort*, der zweite Operand die *Quelle* angibt.
Um das Bit-Muster im DX-Register in das AX-Register zu kopieren, könnten
Sie deshalb folgendes schreiben:
MOV AX,DX
Den Sinn des Befehls erkennt man auch, wenn man die Anweisung von
links nach rechts liest: Lade (MOV = engl. Abkürz. v. MOVE = bewegen)
das Register AX mit (Komma heißt "mit") dem Inhalt des Registers DX.
Auch CHASM hält sich an diese Schreibweise, die übrigens vom ASSEMBLY
LANGUAGE COMMUNITY vereinbart wurde.
Der letzte Teil einer Assembler-Zeile ist der *Kommentar*. Der Kommen-
tar wird vom Assembler vollkommen ignoriert, trotzdem ist er für Men-
schen *lebensnotwendig*, die versuchen, das Programm zu verstehen.
Assembler-Programme sind sehr schwer zu verstehen, und deshalb ist es
so enorm wichtig, viele Kommentare einzufügen, damit man sich auch
später noch daran erinnern kann, was jeder Teil des Programmes tun
soll. Berufsmäßige Assembler-Programmierer kommentieren *jede* Zeile
des Programms und erklären damit, was es tut, außerdem widmen Sie
einige Zeilen nur den zusätzlichen Erklärungen. So sollten Sie z. B.
das BIOS Source-Listing durcharbeiten, daß Sie im "Technischen Referenz-
Handbuch von IBM" finden. Über die Hälfte des Listings besteht aus
Kommentaren!
16
Da der Assembler Kommentare ignoriert, kosten diese nichts in Bezug
auf den Speicherplatz oder die Ausführungs-Geschwindigkeit beim Über-
setzten Maschinenprogramm. Dies stellt einen krassen Gegensatz zu BASIC
da, wo jeder Kommentar das Programm verlangsamt und Speicherplatz
kostet. Im Allgemeinen ist ein bestimmtes Zeichen notwendig, das dem
Assembler den Anfang des Kommentars anzeigt, damit dieser überlesen
wird. CHASM verwendet für die Markierung des Kommentars den
Semikolon (";").
17
>>DER STACK<<
Ich habe einige mal den Namen *Stack* erwähnt. Der Stack ist nur ein
kleiner Teil des Speicher, der für eine besondere Aufgabe reserviert
worden ist.
Damit Sie ein Bild davon bekommen, wie der Stack arbeitet, stellen Sie
sich ein Selbstbedienungsrestaurant vor, in dem ein Gerät mit einer Fe-
der Tabletts hält. Jedes gewaschene Tablett wird oben auf den Stapel des
Gerätes gelegt. Da das Gerät am Boden eine Feder enthält, sinkt der
ganze Stapel vom Gewicht des neuen Tabletts runter, und zwar soweit,
daß die Spitze des Stapels immer auf der gleichen Höhe über den Boden
bleibt. Wenn ein Gast ein Tablett vom Stapel nimmt, so steigt das nach-
folgende Tablett an den Platz des fortgenommenen auf.
Im Computer wird der Stack zum Zwischenspeichern von Bit-Mustern verwen-
det, die z. B. von einem Programm oder Unterprogramm an ein anderes
übergeben werden sollen. Indem Werte auf den Stack gelegt werden, muß
die aufgerufene Routine keine bestimmte Adresse wissen, um die benötig-
ten Informationen zu erhalten, es braucht nur die obersten Werte vom
Stack zu holen.
Es gibt aber einen Kauderwelsch in Verbindung mit dem Stacks. Bit-Muster
werden auf den Stack *geschoben* und wieder *heruntergestoßen* (engl.
to push und to pop). Dementsprechend heißen die Befehle des 8088 eben-
falls PUSH und POP, es gibt aber noch mehr Stack-Befehle.
Weil Sie sich nicht darum kümmern müsssen, wo die Bit-Muster gespeichert
werden sollen, wird der Stack oft als Zwischenspeicher benutzt, um Bit-
Muster in einem Register, das man für andere Zwecke verwenden will, ab-
zulegen und später, wenn das Register wieder frei ist, wiederzuholen.
Es ist allgemein üblich, daß die ersten Anweisungen eines Unterprogramms
eine Reihe von PUSH-Befehlen sind, mit denen der Inhalt aller Register
gerettet wird, die vom Unterprogramm verwendet werden. Dies bezeichnet
man als *Sichern des Zustand* der Register. Am Ende des Unterprogramms
erhalten dann alle Register ihren ursprünglichen Inhalt wieder zurück
(POP-Befehl), man nennt dies das *Wiederherstellen des Zustands* der
Register. Ähnlich wie beim Tablett-Gerät ist der letzte Wert, den Sie
auf den Stack legen, der erste den Sie wieder herunterholen.
Wenn Sie einen Wert herunterholen, rutscht der vorletzte auf den Stack
gelegte Wert automatisch an die Spitze, genauso wie die Tabletts auf-
rücken, wenn ein Gast eines nimmt. Alles kommt vom Stack also in umge-
kehrter Reihenfolge wieder herunter, wie es hinaufgelegt wurde. Dies
nennt man auch die "last in, first out" Methode (*LIFO Stack*).
18
Natürlich gibt es im Speicher des Computer keine Feder. Vielmehr wird
der Stack mit Hilfe eines Register gesteuert, das immer anzeigt, an
welchem Speicherplatz sich der oberste Wert im Stack gerade befindet.
Wenn Sie etwas auf den Stack legen, so ändert ein Zeiger seinen Wert auf
die nächste verfügbare Speicher-Stelle und der Wert wird an dieser Platz
gespeichert. Wenn Sie einen Wert herunterholen, wird dieser vom ange-
zeigten Ort zurückkopiert und der Zeiger entsprechend verändert. Um den
Zeiger brauchen Sie sich nicht zu kümmern, weil all diese Schritte
automatisch mit der PUSH und POP Anweisung ausgeführt werden.
Das Register, das diesen Zähler enthält, ist der SP, das ist auch der
Grund, warum Sie nie am SP herummurksen sollten. Erinnern Sie sich? Eine
Adresse wird aus zwei Words, dem Offset und dem Segment gebildet. Das
Segment Word des Stacks befindet sich im SS-Register, darum sollten Sie
auch daß SS-Register in Ruhe lassen. Wenn Sie das von CHASM erzeugte
Maschinen-Programm starten, setzt DOS automatisch das SP und SS Register
und reserviert einen Stack, der 128 Words speichern kann.
19
>>SOFTWARE INTERRUPTS<<
Ich habe es gewissenhaft vermieden, über die verschiedenen individuellen
Anweisungen zu sprechen, die der 8088 kennt, weil sonst dieser kleine
(einführende) Lehrgang ziemlich bald zu einem großen Buch heranwachsen
würde. Es gibt jedoch eine sehr wichtige Anweisung, die, wenn Sie davon
im Buch "The 8088 Book" lesen würden, als nicht sehr nützlich erscheint.
Im folgendem Teil soll nun erläutert werden, warum der *Software Inter-
rupt* (INT) trotzdem so wichtig ist.
Der 8088 reserviert die ersten 1024 Bytes des Speichers für 256
*Interrupt-Vektoren*. Jedes der zwei Words langen Interrupt-Vektoren
wird zum Speichern einer Speicher-Adresse (Segment:Offset) verwendet.
Wenn der 8088 ein Software-Interrupt antrifft, so legt er die Adresse
der nächsten Anweisung von dem aufrufenden Programm im Stack ab, und
verzweigt dann zu der Speicheradresse, auf die der durch den Operanden
bestimmte Interrupt-Vektor zeigt.
Dies scheint ein ziemlich umständlicher Weg zu sein, um im Programm zu
verzweigen, und Sie werden diese Methode wohl nie anwenden, um von
einem Teil des Programmes zum anderen zu verzweigen. Diese Anweisung
ist deshalb so wichtig, weil IBM eine ganze Reihe von nützlichen kleinen
(und größeren) Maschinen-Sprache-Routinen in den Computer integriert
hat, und diese Interrupt-Vektoren zeigen darauf. Alle diese Routinen
sind so aufgebaut, daß sie nach ihrem Ablauf die auf dem Stack gelegte
Adresse wieder zurückholen und somit wieder an die richtige Stelle im
Programm zurückkehren.
Einige Routinen gehören zu DOS, ihre Dokumentation kann man im Anhang D
des DOS-Handbuchs finden. Der Rest von ihnen ist im ROM (Nur-Lese-
Speicher) gespeichert und umfasst das *BIOS* (das grundlegende Steuer-
system für Ein-/Ausgaben im Computer). Mehr Informationen über die
BIOS-Routinen können Sie dem Anhang A des "Technischen Referenz-Hand-
buchs" von IBM entnehmen. IBM verlangt für das Handbuch ungefähr $40,
aber alleine die Informationen im Anhang A sind ihr Geld wert.
Die Rountinen erledigen alle möglichen nützlichen arbeiten, wie z. B.
Zeichen auf dem Bildschirm auszugeben, Daten von der Tastatur zu lesen,
usw. Im Grunde genommen erweitern die Software-Interrupts den 8088 um
eine ganze Reihe von mächtigen Anweisungen.
20
Schließlich ist es sehr einfach, die Software-Interrupts "umzubiegen"
auf ein eigenes Programm, wenn Ihnen eine Routine nicht gefällt und Sie
diese verbessern wollen. Dazu müssen Sie nur Ihr eigenes Programm laden
und die Standard-Interrupt-Vektoren neu initialisieren, indem Sie auf
Ihr eigenes Programm zeigen anstatt auf die internen Routinen. Nach
diesem Prinzip arbeiten viele Ram-Disks und Printer-Spooler. Die Pro-
gramme verändern den Vektor für die Disketten- oder Druckeransteuerung
so um, daß er auf sie selbst zeigt und führen dann die Funktion in
ihrer besonderen Art und Weise aus.
Damit dies ganz einfach geht, gibt es eine DOS-Interrupt-Routine, die
den Standard-Vektor löscht und dafür die neue Zieladresse des Vektors
einfügt. Es gibt noch eine andere DOS-Interrupt-Routine, die zum In-
stallieren von Maschinen-Programmen verwendet wird, ohne daß es zufällig
andere Programme löscht oder selbst gelöscht wird. Das Ganze ist wirk-
lich einfach und Problemlos zu handhaben, wie Sie sehen.
21
>>PSEUDO-OPERATIONEN<<
Bisher könnten Sie meinen, daß jede Zeile eines Assembler-Programms
in eine Maschinensprache-Anweisung übersetzt werden kann. Tatsächlich
ist dies nicht immer so. Die meißten Assembler ermöglichen eine Reihe
von *Pseudo-Operationen*, die der Assembler zwar als erlaubten Befehl
anerkennt, die jedoch nicht in eine Maschinensprache-Anweisung umgewan-
delt werden können. Fast immer wird der Ausdruck "Pseudo-Operation"
abgekürzt und als *Pseudo-Op* bezeichnet. Manchmal werden Sie auch auf
*Assembler-Directiven* stoßen, die zwar wie eine Pseudo-Op aussehen,
jedoch nicht das Gleiche bewirken (Anm.: Directive = Befehl, der nur die
interne Arbeitsweise des Assemblers beeinflußt).
Eine weit verbreitete Pseudo-Op ist die *Gleichsetzung* mit dem *EQU*-
Befehl (von engl. to equate). Dieser erlaubt es Ihnen, einem konstanten
Wert einen Namen zu geben. Danach setzt der Assembler überall, wo er
auf diesen Namen trifft, automatisch den Wert der Konstante ein. Dadurch
sind Ihre Programme leichter zu verstehen, weil man anstelle irgendeines
bedeutungslosen Bit-Musters einen Namen sieht, der die Bedeutung des
Bit-Musters erklärt. Außerdem können Sie Ihr Programm leichter ändern,
da Sie nur dem Namen einen anderen Wert zuweisen brauchen, anstatt jede
Zeile des Programm durchzusehen und den Wert, falls er vorkommt, umzu-
ändern.
Ich möchte nur noch einen weiteren Pseudo-Op-Typ besprechen, mit dem
man Speicherplatz für Daten reservieren kann. Diese Pseudo-Op's haben
bei jedem Assembler ihre persönlichen Eigenheiten. CHASM kennt nur zwei
derartige Pseudo-Op's: DB (declare Byte) und DS (declare storage). DB
wird zum Anlegen kleiner Datenfelder verwendet, indem man ein Byte große
Werte in einer bestimmten Form angibt. DS reserviert ein relativ großes
Datenfeld, das jedoch immer mit dem gleichen Wert gefüllt wird.
Falls Sie vor einer Pseudo-Op, die Datenfelder anlegt, einen Label set-
zen, können Sie bei den meißten Assemblern den Label anstelle der wirk-
lichen Speicheradresse als Operanden verwenden. Der Assembler setzt
während des Übersetzungsvorgang automatisch die Speicheradresse anstelle
des Namens ein.
Viele Assembler haben eine große Anzahl von Pseudo-Op's. CHASM kennt
noch einige mehr als die hier besprochenen Pseudo-Op's.
22
>>LEHRGANG<<
Zum Abschluß dieser Fibel will ich Ihnen anhand eines Beispiels den
Vorgang des Schreiben, Assemblieren und Starten eines kurzen Programms
erläutern.
Unser Programm soll nur einen Text auf den Bildschirm schreiben und
dann zu DOS zurückkehren. Obwohl das Programm sehr einfach ist,
demonstriert es Ihnen eine Reihe von Punkten wie z. B. einen DOS-Funk-
tions-Aufruf, das Anlegen eines Datenfeldes und einen guten Programm-
Aufbau. Anhang D des DOS-Handbuchs erläutert die verschiedenen DOS-
Funktions- und Interrupt-Aufrufe, die einem Assembler-Programmierer zur
Verfügung stehen. Zum Ausgeben eines Textes auf den Bildschirm verwenden
wir Funktion 9. Sie sollten nun zuerst die Dokumentation dieser Funktion
in Ihrem DOS-Handbuch lesen.
Können Sie es verstehen? Diese Funktion benötigt im DX-Register die
Speicher-Adresse des Text-Strings und im AH-Register den Wert "9", da
ja die Funktion 9 aufgerufen werden soll, dann muß das Interrupt 21H
aufgerufen werden. Eigentlich übergeben wir nur Werte und lassen DOS
dann (mit Hilfe dieser Werte) für uns arbeiten.
Das Programm sieht dann folgendermaßen aus:
MOV AH, 9 ;DOS Funktion 9 auswählen
MOV DX, OFFSET(MESSAGE) ;Adresse des Text-Strings holen
INT 21H ;DOS aufrufen
Beachten Sie, daß keine der Zeilen am linken Rand beginnt (Spalte eins).
Wäre das nicht der Fall, würde CHASM die (mnemonischen) Anweisungen als
Label behandeln und somit sehr durcheinander geraten. Beachten Sie auch,
daß jede Zeile einen Kommentar enthält, der erklärt, was in der Zeile
gemacht werden soll.
Die zweite Zeile bedarf einer kleinen Erklärung. CHASM's OFFSET-Funktion
gibt die Speicher-Adresse des in den Klammern stehenden Ausdrucks zu-
rück, in unserem Fall vom Label MESSAGE. Wir wollen annehmen, daß wir
später im Programm Speicherplatz für unseren Text-String reservieren
wollen und die Speicheradresse dann mit dem Label "MESSAGE"benennen
wollen.
23
Nachdem der Text angezeigt worden ist, wollen wir zu DOS zurückkehren.
Wenn wir nicht deutlich sagen, daß wir zu DOS zurück wollen, arbeitet
der 8088 freudig weiter, indem er jeden Wert, der sich zufällig im Spei-
cher befindet, als Befehl ausführt. Erinnern Sie sich an den System-
Absturz? DOS kennt jedoch auch ein Interrupt, mit dem Sie zu DOS zurück-
gelangen. Der Befehl lautet:
INT 20H ;Zurück zu DOS
Alles, was jetzt noch fehlt, ist ein Datenfeld im Speicher, das den
auszudruckenden Text enthält. Dazu verwenden wir die Pseudo-Op DB
declare Bytes):
MESSAGE DB 'Hello, World!$' ;Auszudruckender Text
Der Speicher-Adresse wird der Name "MESSAGE" gegeben, weil die Zeile
mit dem Label "MESSAGE" in Spalte eins beginnt. Nun weiß CHASM, daß beim
vorangegangenen OFFSET-Befehl dieser Speicher-Bereich gemeint war. Sie
brauchen sich nicht darum zu sorgen, welche Adresse MESSAGE wirklich
hat, darum kümmert sich schon CHASM.
Vierzehn Bytes des Speichers enthalten nun die ASCII-Codes der Zeichen,
die sich im String "Hello, World!$" befinden. Beachten Sie, daß der
String mit dem Zeichen "$" endet. Der DOS Funktions-Aufruf Nr. 9 druckt
Zeichen aus, bis er auf ein "$" stößt, hier stoppt er dann.
Wenn Sie das "$"-Zeichen am Ende des Strings vergessen haben, werden
Sie wohl nicht gerade vergnügt erleben, wie DOS versucht, den ganzen
Speicherinhalt auf dem Bildschirm auszudrucken.
24
Wenn wir alles zusammenfassen und einige Kommentare hinzufügen, so
sieht unser Programm folgendermaßen aus:
;=====================================;
; HELLO Version 1.00 ;
; 1984 by David Whitman ;
; ;
; Beispiel-Programm für CHASM. ;
; Druckt eine Begrüßung auf den Screen;
;=====================================;
MOV AH, 9 ;DOS Funktion 9 auswählen
MOV DX, OFFSET(MESSAGE) ;Adresse des Text-Strings holen
INT 21H ;DOS aufrufen
INT 20H ;Zurück zu DOS
MESSAGE DB 'Hello, World!$' ;Auszudruckender Text
Nachdem wir dieses Programm entworfen haben, müssen wir nur noch eine
Datei anlegen, die alle Zeilen des Programms enthält. Dies erledigen wir
mit einem Editor oder einer Textverarbeitung. (Natürlich werden Sie
dazu meißtens einen Editor verwenden).
CHASM ließt nur Source-Dateien im Standard-DOS-Format, einige Textverar-
beitungen nennen dies auch "Dokument-" oder "ASCII-Modus". Die meißten
Textverarbeitungen und jeder ordentliche Text-Editor arbeitet automa-
tisch mit diesem Format. Wordstar und Easywriter (und sicherlich noch
andere) arbeiten mit besonderen Formaten, das Handbuch müßte jedoch
Auskunft darüber geben, wie Sie dies ändern können.
Erzeugen Sie nun bitte eine Standard-DOS-Datei mit dem Namen HELLO.ASM,
die diese Programmzeilen beinhaltet. Sollten Sie keine Lust oder aber
Probleme haben: Die Datei EXAMPLE.ASM auf Ihrer CHASM-Diskette enthält
bereits das vollständige Programm. Sie müssen nur EXAMPLE.ASM in eine
neue Datei mit dem Namen HELLO.ASM kopieren.
Nun ist es Zeit, das Programm zu assemblieren. Zuvor müssen Sie die
CHASM-Disk initialisieren. Wie dies geht, können Sie im "User Manual"
unter "Setting up a CHASM Work Disk" lesen, oder kopieren Sie vorläufig
nur die Datei BASIC.COM von Ihrer DOS-Disk auf Ihre CHASM-Disk (Arbeits-
kopie!). Kopieren Sie außerdem HELLO.ASM auf diese Diskette.
25
Legen Sie die CHASM-Disk in Laufwerk A und starten Sie dann CHASM,
indem Sie seinen Namen eintippen:
A> CHASM
CHASM zeigt daraufhin eine Begrüßungs-Bildschirmseite an und fordert
Sie auf, eine Taste zu drücken, wenn Sie fertig sind. Danach fragt CHASM
Sie einige Fragen:
Source code file name? [.asm]
Geben Sie HELLO.ASM oder nur HELLO ein und drücken Sie RETURN. (Wenn
Sie keine Datei-Extension angeben, nimmt CHASM ".ASM" an).
Direct listing to Printer (P), Screen (S), or Disk (D)?
CHASM möchte wissen, wohin er das Listing während der Assemblierung
ausgeben soll. Haben Sie einen Drucker, so schalten Sie diesen ein und
drücken P. Haben Sie keinen Drucker, drücken Sie S.
Die letzte Frage ist:
Name for object file? [hello.com]
CHASM fragt nach dem Dateinamen des Maschinensprache-Programms, das
nur erzeugt werden soll. Drücken Sie hier nur ENTER. CHASM nennt das
Programm dann HELLO.COM .
An dieser Stelle beginnt CHASM mit dem Zugriff auf das Diskettenlaufwerk
und ließt das Programm Zeile für Zeile. Eine Zustands-Zeile erscheint
unten am Bildschirm. Diese gibt Ihnen Auskunft darüber, wie weit die
Übersetzung schon fortgeschritten ist. Bei diesem Programm dauert der
ganze Vorgang ungefähr eine Minute.
Wenn das Listing auf den Drucker ausgegeben worden ist, kehrt CHASM
automatisch zu DOS zurück. Wurde es auf den Bildschirm ausgegeben,
wartet CHASM darauf, daß Sie eine Taste drücken als Zeichen dafür, daß
Sie es gelesen haben. Am Ende des Listings erscheint der Hinweis:
XXX Diagnostics Offered (deutsch: XXX Diagnosen angeboten)
YYY Errors Detected (deutsch: YYY Fehler entdeckt)
26
Sind beide Zahlen 0, ist alles in Ordnung. Wenn nicht, suchen Sie im
Listing nach den Fehler-Meldungen, welche die fehlerhaften Zeilen an-
zeigen. Sie brauchen sich an dieser Stelle nicht darum zu kümmern, was
die Fehler-Meldungen aussagen, vergleichen Sie nur die Programm-Datei
Zeile für Zeile mit unserem Entwurf. Wenn Sie es geschaft haben, das
Programm ohne Fehler zu assemblieren, können Sie weiterlesen.
Ihre Diskette enthält jetzt einen Maschinen-Programm mit dem Namen
HELLO.COM. Überzeugen Sie sich davon, indem Sie sich mit DIR das Direk-
tory ansehen. Dort sollte die Datei aufgelistet sein.
Zum Starten des Maschinen-Programms müssen Sie nur den Namen ohne die
Extension .COM eintippen. (Hinweis: Die Datei hat die Extension ".COM"
von DOS bekommen, damit sie immer von DOS als Maschinen-Programm er-
kannt werden kann). Versuchen Sie es nun.
Schreiben Sie beim DOS-Prompt: HELLO. Ihr Disk-Laufwerk surrt nun eine
Sekunde, danach erscheint die Meldung "Hello, World!".
Als weitere Übung könnten Sie versuchen, einen Wagenrücklauf und einen
Zeilenvorschub auszuführen, bevor Sie die Nachricht ausgeben, damit sie
am Anfang der Zeile steht. Wagenrücklauf hat des ASCII-Code 13, Zeilen-
vorschub ist 10. Lesen Sie im "CHASM User's Manual" über die DB Pseudo-
Op nach. Fügen Sie diese dann an den Anfang des Strings, indem Sie deren
Dezimalwerte eingeben.
Versuchen Sie doch einmal, ein neues Programm namens "BEEP" zu schrei-
ben, welches das Klingel-Zeichen (ASCII Nr. 7) auf dem Bildschirm
schreibt. Sie können BEEP verwenden, um Ihre Mitarbeiter zu ärgern.
Hüten Sie sich aber davor, BEEP in einer Schleife aufzurufen!
Eine vorteilhaftere Übung wäre es, wenn Sie den Bildschirm vor dem
Ausgeben des Textes löschen würden. Der einfachste Weg wäre, die BIOS-
Funktion VIDEO_IO hierfür zu verwenden (dokumentiert auf den Seiten
A-43 bis A-44 im "Technischen Handbuch"). Die Kommentare im BIOS-
Listing erklären Ihnen genau, welche Werte in welches Register geladen
werden müssen, um den Bildschirm zu beeinflussen. Setzen Sie die
Register und rufen Sie dann das Interrupt INT 10H auf, damit der Bild-
schirm gelöscht und der Cursor in die linke obere Ecke gesetzt wird.
Wenn Sie diese ganze Fibel gelesen und auch das Programm ausprobiert
haben, werden Sie es vielleicht verändern, Sie sind ja jetzt kein
Anfänger mehr. Sie sollten nun genug wissen, um das "CHASM User
Manual" und das Buch "The 8086 Book" zu verdauen. Dann können Sie
beginnen, Ihre eigenen Programme zu schreiben. VIEL GLÜCK!
Anmerkungen des Übersetzers: Sämtliche angegebene Literatur ist in
ENGLISCHER SPRACHE. Inzwischen dürfte
es jedoch sicherlich deutsche Über-
setzungen geben.
Bitte verzeihen Sie mir einige ungenaue Übersetzungen,
die Fibel wurde in amerikanischer (Umgangs-)Sprache
geschrieben.
Ich hoffe, daß Ihnen diese Fibel nützlich sein wird.
TOASTI