home *** CD-ROM | disk | FTP | other *** search
- 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
-
-