home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / tutorial / asmlehrg / lehrer.doc next >
Text File  |  1993-07-29  |  53KB  |  765 lines

  1.                Die Assembler-Sprache - eine Fibel für Anfänger
  2.                        (C) 1983 by David Whitman
  3.                            Deutsche Übersetzung bei TOASTI
  4.                      Inhaltsverzeichnis
  5.       Einleitung.........................................2
  6.       Der Computer als ein Bit-Muster-Manipulator........3
  7.       Einführung: Aufzeichnungs-Systeme für Bit-Muster...5
  8.       Die Adressierung des Speichers.....................7
  9.       Der Speicherinhalt: Daten und Programme............8
  10.       Die Entwicklung der Assembler-Sprache..............9
  11.       Die 8088 CPU......................................11
  12.       Syntax der Assembler-Sprache......................14
  13.       Der Stack.........................................17
  14.       Software Interrupts (Programmunterbrechungen).....19
  15.       Pseudo-Operationen (Unechte Operationen)..........21
  16.       Lehrgang..........................................23
  17.                                                                       2
  18.       >>EINLEITUNG<<
  19.       Viele Leute erwarten von CHASM Anzeigen, weil sie sich für das
  20.       Lernen der Assembler-Sprache interessieren. Sie sind Anfänger und
  21.       haben nur wenige Vorstellungen, wo sie beginnen sollen. Diese Fibel
  22.       weist jene Benutzer ein. Erfahrene Benutzer werden hier wahrscheinlich
  23.       wenig finden, was sie nicht bereits wissen.
  24.       Dieser Text wird, da er nur eine Fibel ist, nicht alles lehren, was
  25.       man über die Programmierung in Assembler wissen muß. Sein Zweck ist es,
  26.       Ihnen einiges vom Wortschatz und den Gedanken zu vermitteln, die Ihnen
  27.       beim Lernen hilfreich sein werden.
  28.       Ich muß eine kleine Einschränkung machen: Ich betrachte mich als rela-
  29.       tiver Anfänger in der Assembler-Programmierung. Ein wichtiger Grund für
  30.       das Schreiben von CHASM war der Versuch, die Assembler-Programmierung
  31.       dadurch zu erlernen. Ich glaube, ich haben einiges gelernt, aber es ist
  32.       ziemlich wahrscheinlich, daß einige meiner Vorstellungen, die ich damit
  33.       verband, mehr oder weniger falsch sind. Trotzdem habe ich seitdem eine
  34.       Menge voll funktionstüchtiger Assembler-Programme geschaffen.
  35.                                                                       3
  36.       >>DER COMPUTER ALS BIT-MUSTER-MANIPULATOR.<<
  37.       Jeder hat eine Vorstellung darüber, was ein Computer tut. Auf der
  38.       einen Seite denkt man an eine Maschine, welche BASIC-Programme aus-
  39.       führen kann.  Eine andere Vorstellung ist, daß der Computer ein Zahlen-
  40.       fressendes Gerät ist. Ich verwende den Computer gerade zur Textver-
  41.       arbeitung, weil ich diese Fibel schreibe.
  42.       Ich hätte gern einen allgemeineren Begriff eingeführt als gerade den,
  43.       welche Art von Maschine ein Computer ist: ein Bit-Muster-Manipulator.
  44.       Ich bin sicher, daß jeder darüber bescheid weiß, was ein *Bit* ist
  45.       (Anmerkung: Jedes von *Sternen* eingeschlossene Wort in dieser Fibel
  46.       ist so zu lesen, als ob es KURSIV gedruckt wäre). Ein Bit kennt zwei
  47.       Zustände: ein und aus, normalerweise dargestellt mit den Symbolen
  48.       "1" und "0". Denken Sie in diesem Zusammenhang nicht an die Ziffern
  49.       1 und 0.  Sie sind bloß Abkürzungen für den momentanen Zustand
  50.       eines Bit's.
  51.       Der Speicher Ihres Computers besteht aus riesigen Sammlungen von
  52.       Bit's, jedes davon kann sich entweder im Zustand 1 oder 0 (ein oder
  53.       aus) befinden.
  54.       Das Herz Ihres Computers ist normalerweise ein 8088 Microprozessor-Chip
  55.       von Intel. Dieser Chip kann alle Bit's manipulieren, die in ihrer
  56.       Gesamtheit den Speicher des Computers ausmachen.
  57.       Der 8088 behandelt Bit's in Blöcken, weshalb wir besondere Namen
  58.       für zwei Größen von Bit-Blöcken einführen werden, mit denen der 8088
  59.       gerne arbeitet. Ein *Byte* besteht aus einem Block von acht Bit's.
  60.       Ein *Word* besteht aus zwei Bytes, das entspricht also sechzehn Bit's.
  61.       Eine Sammlung von Bit's enthält ein Muster, festgelegt durch den Zustand
  62.       von seinen Bit's. Hier sehen Sie einige typische, ein Byte lange,
  63.       Muster:        10101010         11111111         00001111
  64.       Wenn Sie in Mathe gut sind, dann können sie ziemlich einfach heraus-
  65.       finden, daß ein Byte genau 256 verschiedene Muster enthalten kann.
  66.       Genauso kann ein Word 65.536 verschiedene Muster enthalten.
  67.                                                                       4
  68.       Nun zu der wichtigsten Idee der Assembler-Programmierung.
  69.       Halten Sie sich fest! Diese Bit-Muster können dazu verwendet werden,
  70.       andere Dinge darzustellen, indem jedes Muster eine bestimmte Sache
  71.       darstellt. o a member of the other set. Es hört sich seltsam an,
  72.       aber IBM hat aus dieser Idee *Billionen* gemacht.
  73.       Zum Beispiel kann man bei Verwendung aller Muster eines Word's für
  74.       ganze Zahlen alle Werte von 0 bis 65536 oder von -32768 bis 32767
  75.       darstellen. Diesen Zahlenbereich werden Sie häufig antreffen, wie
  76.       beispielsweise den Bereich der möglichen Zeilennummern oder die
  77.       möglichen Werte einer Integer-Variable in BASIC-Programmen. Das
  78.       erklärt diese etwas willkürlich erscheinenden Begrenzungen:
  79.       BASIC verwendet zum Speichern von Integer-Variablen und Zeilen-
  80.       nummern Word's.
  81.       Ein anderes Beispiel: Man kann die verschiedenen Muster eines Bytes
  82.       dazu verwenden, um eine Reihe von willkürlich ausgewählten kleinen
  83.       Bildern auf dem Bildschirm darzustellen. Wenn Sie in Ihrem BASIC-Hand-
  84.       buch im Anhang G nachsehen, werden Sie feststellen, daß es *genau* 256
  85.       verschiedene Zeichen gibt, die man auf dem Bilschirm darstellen kann.
  86.       Ihr Computer verwendet jeweils ein Byte, um ein Zeichen auf jeder
  87.       Position des Bilschirms anzuzeigen.
  88.       Ohne, daß ich zuweit vorausgreife, möchte ich doch kurz erwähnen,
  89.       daß es über 256 grundlegende Wege beim 8088 gibt, die gespeicherten
  90.       Bit-Muster zu manipulieren. Dies deutet auf eine andere Verwendung der
  91.       Bit-Muster hin, die wir später noch genauer erläutern werden.
  92.       Das Wichtigste ist, daß wir mit den Bit-Mustern alles darstellen können,
  93.       was wir wollen. Außerdem kann man die Muster auf unterschiedliche Art
  94.       und Weise manipulieren, Ergebnisse produzieren und ausgewählte Teile
  95.       davon weiterverarbeiten oder anzeigen.
  96.                                                                       5
  97.       >>EINFÜHRUNG: EIN AUFZEICHNUNGS-SYSTEM FÜR BIT-MUSTER<<
  98.       Da es sehr wichtig ist, wäre es schön, wenn wir eine passende
  99.       Möglichkeit hätten, die verschiedenen Bit-Muster darzustellen, die wir
  100.       noch besprechen werden. Eine Möglichkeit kennen wir schon, nämlich die
  101.       Auflistung der einzelnen Bit's als eine Reihe von 1'en und 0'en. Dieses
  102.       System ist ziemlich ungeschickt und fehleranfällig. Sind die folgenden
  103.       Muster identisch oder nicht?
  104.       1111111011111111                         1111111101111111
  105.       Sie hatten bestimmt Probleme, den Unterschied zu erkennen. Sie sind
  106.       einfacher zu unterscheiden, wenn man sie in handlichere Stücke unter-
  107.       teilt und diese dann vergleicht. Hier sehen Sie nochmals dieselben
  108.       Muster, unterteilt in Blöcken zu vier Bit's:
  109.       1111 1110 1111 1111                  1111 1111 0111 1111
  110.       Einige Clown's haben diesen vier-Bit-Blöcken den Namen *Nibble* gegeben,
  111.       wahrscheinlich weil vier Bit's ein halbes Byte sind. Ein Nibble ist
  112.       ganz einfach handzuhaben. Ein Nibble kann nur 16 verschiedene Muster
  113.       darstellen, und die meißten Leute können diese Muster sehr einfach
  114.       unterscheiden.
  115.       Jedes verschiedene Nibble-Muster hat von den Computer-Wissenschaftlern
  116.       ein einzelnes Zeichen bekommen. Den ersten zehn Mustern wurden die
  117.       Ziffern "0" bis "9" zugeordnet, für die restlichen Muster werden die
  118.       Buchstaben "A" bis "F" verwendet.
  119.       Untenstehend sehen Sie die "Nibble-Muster-Codierung":
  120.       0000 = 0    0001 = 1    0010 = 2    0011 = 3
  121.       0100 = 4    0101 = 5    0110 = 6    0111 = 7
  122.       1000 = 8    1001 = 9    1010 = A    1011 = B
  123.       1100 = C    1101 = D    1110 = E    1111 = F
  124.       Durch Verwendung der Nibble-Codierung können wir zwei ähnliche
  125.       Word-Muster in der folgenden übersichtlicheren und kürzeren Form
  126.       darstellen:
  127.                      FEFF       FF7F
  128.                                                                       6
  129.       Natürlich war die Zuweisung der Zeichen für die verschiedenen
  130.       Nibble-Muster nicht so willkürlich, wie es vielleicht erscheinen mag.
  131.       Ein aufmerksamer Leser, der das System der binären Zahlen erkannt hat,
  132.       wird die zugrundeliegenden Regeln der Zuweisung bemerkt haben. Falls
  133.       die 1'en und 0'en der Muster als wirkliche *Zahlen* übersetzt
  134.       werden, anstatt nur als reine Zeichen für den Bit-Zustand, dann zeigen
  135.       deren Zeichen von "0" bis "9" die entsprechenden dezimalen Ziffern
  136.       an.
  137.       Die letzten sech Muster erhalten die Bezeichnung von "A" bis "F",
  138.       und alle Zeichen von "0" bis "F" zusammen bilden die Ziffern des
  139.       *hexadezimalen* Zahlensystems. Durch diese Zeichen-Zuweisung zu
  140.       den verschiedenen Nibble-Mustern bestätigt sich das alte Vorurteil,
  141.       daß der Computer eine rein zahlenverarbeitende Maschine ist.
  142.       Obwohl diese Zeichen-Zuweisung eine wichtige Übersetzung dieser
  143.       Zeichen ist, hat man bald aufgehört, großartig darüber nachzu-
  144.       denken, wie man eine Kurzform zum Schreiben der Bit-Muster finden kann.
  145.       Weil einige Nibble-Muster wie eine Zahl aussehen, ist es meißt
  146.       notwendig, irgendwie anzuzeigen, daß man ein bestimmtes Muster
  147.       meint. In BASIC tut man dies, indem man Schriftzeichen "&H" an den
  148.       Anfang des Muster hinzufügt: &H1234. Eine häufiger vorkommende Verein-
  149.       barung ist, daß man den Buchstaben "H" ans Ende des Muster zufügt:
  150.       1234H. Bei beiden Darstellungen steht das H für "hexadezimal".
  151.       Sie sollten schließlich mehr über die Verwendung des hexadezimalen
  152.       Zahlensystems lernen, da es sehr wichtig für Sie sein wird.
  153.       Ich möchte an dieser Stelle nicht weiter darauf eingehen, warum
  154.       zahlreiche Bücher bessere Abhandlungen über dieses Thema enthalten als
  155.       diese Fibel. Sie können Wissenslücken über dieses bedeutende Thema
  156.       später "füllen".
  157.                                                                       7
  158.       >>DIE ADRESSIERUNG DES SPEICHERS<<
  159.       Wie Sie vorhin schon erfahren haben kann der 8088 Chip im Innern
  160.       Ihres Computers die Bit-Muster seines Speichers manipulieren.
  161.       So ist es z. B. möglich, Bit-Muster von einem Ort zum andern zu
  162.       kopieren, bestimmte Bit's zu setzen oder zu löschen, oder Bit-Muster
  163.       als Zahlen zu interpretieren und damit Rechenoperationen auszu-
  164.       führen. Um diese Funktionen ausführen zu können, muß der 8088 wissen,
  165.       welchen Teil des Speichers er gerade bearbeitet hat. Eine bestimmte
  166.       Stelle im Speicher wird durch seine *Adresse* markiert.
  167.       Eine Adresse ist ein Zeiger in den Speicher. Jede Adresse zeigt auf den
  168.       Anfang eines ein Byte langen Blockes im Speicher.  Der 8088 hat die
  169.       Fähigkeit, 1.048.576 verschiedene Bytes des Speichers zu unterscheiden.
  170.       Es dürfte für Sie wohl keine Überaschung sein, zu hören, daß Adressen
  171.       durch Bit-Muster dargestellt werden. Man benötigt 20 Bit's, um alle
  172.       1.048.576 verschiedene Bytes unterscheiden zu können, und deshalb wer-
  173.       den die Adressen mit 5 Nibble-Zeichen dargestellt. MS-DOS zum Beispiel
  174.       speichert ein Bit-Muster, das Informationen über die installierte
  175.       Ausrüstungen Ihres IBM PC's enthält, in dem Word, welches an der
  176.       Adresse 00410 beginnt. Wenn die Adresse als hexadezimale Zahl angesehen
  177.       wird, so hat das zweite Byte von diesem Word die Adresse um eins größer
  178.       als 00410, also 00411.
  179.       Der 8088 ist nicht sehr erfreut, 20 Bit's zu bearbeiten. Der größte
  180.       Block, den er bearbeiten kann, ist ein 16 Bit Word. In Wirklichkeit
  181.       berechnet der 8088 eine 20 Bit Adresse aus einer Kombination von
  182.       zwei Word's, einem Teil-Word und ein Zusatz-Word. Der Kombinations-
  183.       Vorgang sorgt dafür, daß die zwei Word's als hexadezimale Zahlen er-
  184.       kannt und aufaddiert werden. Zwei Word's ergeben miteinander kombi-
  185.       niert ein 20 Bit Muster, indem die zwei Word's um eine Nibble-Stelle
  186.       verschoben zusammenaddiert werden:
  187.           0040      4 Teil-Nibble
  188.            0010     4 Zusatz-Nibble
  189.          --------
  190.           00410     5 Nibble Adresse
  191.       Wegen dieser Art und Weise der Adressen-Berechnung werden sie oft
  192.       in der Form "Teil:Zusatz" hingeschrieben. Deshalb könnten die
  193.       Adressen der eben vorgenommenen Berechnung auch so geschreiben werden:
  194.       0040:0010
  195.                                                                       8
  196.       >>DER SPEICHERINHALT: DATEN UND PROGRAMME<<
  197.       Den Inhalt des Speichers kann man grob einteilen in zwei Klassen.
  198.       Einerseits in *Daten*, genauergesagt in Bit-Muster zum Arbeiten für
  199.       den 8088. Die Bedeutung dieser Bit-Muster wird festgelegt durch den
  200.       Computer, den Sie gerade benutzen.
  201.       Die zweite Klasse des Speicherinhalts sind die *Anweisungen*. Der 8088
  202.       kann in seinen Speicher sehen und das Bit-Muster, das er dort sieht,
  203.       als eines seiner rund 200 grundlegenden Operationen, die er kennt,
  204.       erkennen. Diese Auflistung von Operationen in Form von Bit-Mustern nennt
  205.       man die *Maschinen-Sprache* des 8088. Ein Maschinen-Sprache *Programm*
  206.       beinhaltet eine Reihe von Bit-Mustern, die sich hintereinander im Spei-
  207.       cher befinden. Diese zusammenarbeitenden Operationen leisten einige
  208.       nützliche Dinge.
  209.       Bitte beachten Sie, daß der 8088 keine Möglichkeit hat, zu unter-
  210.       scheiden, ob ein Bit-Muster eine Anweisung oder ein Teil von Daten dar-
  211.       stellen soll. Es ist für den Chip möglich, zufällig an einer Stelle
  212.       mit dem Lesen zu beginnen und Daten als Anweisungen oder umgekehrt zu
  213.       interpretieren. Wenn dies geschieht können einige sehr bizarre Sachen
  214.       passieren. Unter Assembler-Programmierern ist dies bekannt als
  215.       "Systemabsturz".
  216.                                                                       9
  217.       >>DIE ENTWICKLUNG DER ASSEMBLER-SPRACHE<<
  218.       Die Muster, aus die ein Assemblerprogramm besteht, können ziemlich
  219.       verwirrend sein. So sieht zum Beispiel das Muster, welches dem 8088
  220.       sagt, die Bits in dem Byte der Speicheradresse 5555 umzudrehen,
  221.       folgendermaßen aus:
  222.       F6 16 55 55
  223.       Das ist nicht sehr informativ, obwohl man die darinnen die Adresse
  224.       5555 erkennen kann. Vor langer Zeit mußten die alten Vakuum-Röhren-
  225.       Computer noch mit mühsamen übersetzten Bit-Mustern programmiert
  226.       werden, welche die Folge der gewünschten Anweisungen darstellten.
  227.       Es ist wohl unnötig, zu erwähnen, das diese Arbeitsweise unglaublich
  228.       langweilig und fehleranfällig war. Schließlich kamen diese Programierer
  229.       auf die Idee, diese Aufgabe des Übersetzens in die passenden
  230.       Bit-Muster dem Computer zu übertragen, und so wurde die Assembler-
  231.       Sprache geboren.
  232.       Assembler stellt jede der vielen Operationen, die der Computer
  233.       ausführen kann, als ein *Mnemonic*, einer kurzen, leicht zu merkenden
  234.       Buchstabenfolge dar. In der Booleschen Algebra wird z. B. die logische
  235.       Operation, die den Wert eines Bits umdreht, "not" genannt, und deshalb
  236.       ist in Assembler folgendes gleichbedeutend mit dem vorhergehenden
  237.       Maschinensprache-Muster:
  238.           NOTB [5555]
  239.       Die eckigen Klammern um die 5555 meint ungefähr: "der Inhalt der
  240.       Speicheradresse".  Das "B" am Ende von "NOTB" zeigt an, daß wir mit
  241.       einem Byte des Speichers, nicht mit einem Word, arbeiten wollen.
  242.       Unglücklicherweise kann der 8088 mit dem String "NOTB" nicht sehr
  243.       viel anfangen. Was man braucht, ist ein besonderes Programm, das mit
  244.       dem 8088 läuft und den String "NOTB" in das Muster F6 16 umwandelt.
  245.       Dieses Programm heißt Assembler. Einen Assembler kann man sich wie
  246.       einen Fleischwolf vorstellen, der Programme in der Assembler-Sprache
  247.       verarbeitet und Maschinen-Programme ausspuckt.
  248.       Ein Assembler ließt ein Assembler-Programm und übersetzt es Zeile
  249.       für Zeile. Heraus kommt ein Maschinensprache-Programm. Das zu über-
  250.       setzende Assembler-Programm nennt man den *Source File*, das übersetzte
  251.       Maschinensprache-Programm nennt man *Object File*. Die erzeugten
  252.       Maschinensprache-Muster nennt man *Object Code*.
  253.                                                                      10
  254.       Außerdem wird während der Assemblierung ein *Listing* erzeugt, welches
  255.       das Ergebnis der Assemblierung zusammengefaßt darstellt. Das Listing
  256.       zeigt jede Zeile des Source File, zusammen mit dem Source File und
  257.       und dem erzeugten Object Code. Wenn der Assembler irgeneine Zeile
  258.       im Source File nicht versteht, so fügt er am Ende des Listings
  259.       eine Fehlermeldung ein, die den aufgetretenen Fehler genauer
  260.       beschreibt.
  261.       Die allerersten Assembler-Programmierer mußten Ihr Assembler-
  262.       Programm in Maschinensprache schreiben, weil sie keine andere Wahl
  263.       hatten. Ich schrieb CASM in BASIC. Wenn Sie genauer darüber nachdenken,
  264.       werden Sie viele Verbindungen zwischen Assembler und BASIC finden.
  265.       Irgendein Programmierer von Mircrosoft schrieb den BASIC-Interpreter
  266.       in Assembler, und ich verwandte BASIC zum Schreiben eines Assemblers.
  267.       Ich hoffe, einestages eine neue Version von CHASM in Maschinensprache
  268.       zu programmieren, die dann ungefähr hundertmal schneller sein wird
  269.       als die augenblickliche Version.
  270.                                                                      11
  271.       >>Die 8088 CPU<<
  272.       Die vorangehenden Erörterungen haben Ihnen (so hoffe ich) einige allge-
  273.       meine Grundlagen vermittelt, die Ihnen bei der Programmierung in Assem-
  274.       bler und Maschinensprache behilflich sein werden. An diese Stelle möchte
  275.       ich nun etwas mehr ins Detail gehen, beginnend bei der Untersuchung der
  276.       inneren Struktur des 8088 Microprozessors, vom Standpunkt des Program-
  277.       mierer's aus. Die Erörterung ist eine gekürzte Fassung der Information-
  278.       en, die ich dem Buch "The 8086 Book" entnommen habe (Autoren: Russel
  279.       Rector und George Alexy; Verlag: Osborne/McGraw-Hill).
  280.       Wenn Sie dies einmal verdaut haben, würde ich empfehlen, das o. a. Buch
  281.       durchzuarbeiten. Beim Benutzen von CHASM werden Sie das Buch jedenfalls
  282.       irgendwie brauchen, damit Ihnen die unterschiedlichen Anweisungen des
  283.       8088 und deren Mnemnonics (=kurze Buchstabenfolge) klar werden.
  284.       Innerhalb des 8088 gibt es eine Anzahl von *Registern*, jedes von ihnen
  285.       kann einen 16-Bit-Wert speichern. In der Assembler-Sprache hat jedes
  286.       dieser Register einen Kurznamen, bestehend aus zwei Buchstaben. Es gibt
  287.       14 Register, ihre Kurznamen sind:
  288.       AX BX CX DX     SP BP    SI DI     CS DS SS ES    PC ST
  289.       Die Register unterscheiden sich ein wenig voneinander, sie haben ver-
  290.       schiedene Verwendungen, aber sie können in zwei grobe Klassen eingeteilt
  291.       werden. Die *Allgemein*-Register sind AX, BX, CX und DX. Ebendiese sind
  292.       Register, die Muster aus dem Speicher holen und zwischenspeichern, die
  293.       dann innerhalb des 8088 verarbeitet werden. Diese Register können Sie
  294.       verwenden, wofür Sie wollen.
  295.       Jedes der Allgemein-Register kann man in zwei 8-Bit-Register aufteilen,
  296.       welche eigene, aber ähnliche Namen besitzen. Deshalb teilt man das CX-
  297.       Register auf in das CH- und CL-Register. Das "H" und das "L" stehen für
  298.       "High" beziehungsweise "Low".  respectively. Jedes Allgemein-Register
  299.       wird also in ein Paar Register eingeteilt (High und Low).
  300.       Das AX-Register, und seine 8-Bit Low-Hälfte, das AL-Register, sind
  301.       etwas besonderes. Hauptsächlich aus historischen Gründen wird dieses
  302.       Register auf den *Akkumulator* zurückgeführt. Einige Operationen des
  303.       8088 können nur mit dem Inhalt dieses *Akkumulator*-Registers ausgeführt
  304.       werden, viele andere sind um einiges schneller, wenn sie in Verbindung
  305.       mit diesem Register ausgeführt werden.
  306.                                                                      12
  307.       Eine andere Gruppe von Registern sind die *Segment*-Register (CS DS SS
  308.       ES). Diese Register enthalten Teil-Werte zur Berechnung von Speicher-
  309.       Adressen. Das CS-Register (Code-Segment-Register) wird jedesmal ver-d
  310.       wendet, wenn der 8088 auf den Speicher zugreift, um Anweisungen daraus
  311.       zu lesen. Das DS-Register (Data-Segment-Register) wird zum Lesen von
  312.       Daten-Muster benutzt. Das SS-Register wird beim Stack-Zugriff benutzt
  313.       (mehr über den Stack später). Das ES-Register ist das Extra-Segment-
  314.       Register. Die meißten Spezial-Anweisung benutzen das ES-Register beim
  315.       Speicher-Zugriff, außerdem können Sie sich über die Verwendung des DS-
  316.       Registers hinwegsetzen und damit das ES-Register ersetzen, wenn Sie zwei
  317.       seperate Daten-Zonen unterhalten wollen.
  318.       Die *Pointer* (SP BP) und *Index* (DI SI) Register dienen der Verwirk-
  319.       lichung der indirekten Adressierung, die eine sehr mächtige Technik des
  320.       Speicherzugriffs darstellt. Die Indirekte Adressierung gehört nicht zum
  321.       Thema dieser kleinen Einführung. Das SP-Register wird benötigt, um
  322.       den Stack im Speicher zu realisieren (nochmals: mehr über den Stack
  323.       später). Neben diesen besonderen Funktionen können die BP-,DI- und SI-
  324.       Register als zusätzliche Mehrzweck-Register verwendet werden. Obwohl
  325.       es möglich wäre, die Werte im SP-Register direkt zu manipulieren,
  326.       sollte man trotzdem die Finger davon lassen, weil es sonst zu einem
  327.       Durcheinander im Stack kommen kann (Systemabsturz!).
  328.       Schließlich gibt es noch zwei Register, die jedoch zum direkten Manipu-
  329.       lieren relativ uninteressant sind. Das erste ist der *Programm Counter*,
  330.       PC. Dieses Register enthält immer einen Zeiger auf die Adresse der
  331.       nächsten Anweisung, die ausgeführt werden soll. Obwohl es nicht er-
  332.       laubt ist, Werte in dieses Register zu schreiben, können Sie indirekt
  333.       Werte in dieses Register schreiben und deshalb die nächste auszuführende
  334.       Anweisung bestimmen, indem Sie ähnliche Anweisungen wie es in BASIC die
  335.       GOTO und GOSUB Befehle sind, geben. Gelegentlich werden Sie auch
  336.       auf den Begriff *IP* (Instruction Pointer) stoßen, der gleichbedeutend
  337.       mit dem PC ist.
  338.       Das letzte Register ist auch relativ uninteressant. Es ist das *Status*
  339.       Register, ST. Dieses hat zwei verschiedene Namen, nämlich FL (Flag
  340.       Register) und PSW (Programm Status Word). Letzterer ist in der
  341.       Geschichte begründet, da dieser Name einer besonderen Speicherplatz-
  342.       Adresse gegeben wurde, die eine ähnliche Funktion bei dem antikem
  343.       IBM 360 Computer inne hatte.
  344.                                                                      13
  345.       Das Status-Register besteht aus einer Reihe von Ein-Bit-*Flags*, welche
  346.       auf die Arbeit des 8088 Einfluss nehmen. Es gibt besondere Anweisungen,
  347.       die es ermöglichen, jedes dieser Flags zu setzen oder zu löschen.
  348.       Außerdem beeinflussen viele Anweisungen den Wert der Flags, und zwar
  349.       Abhängig von ihrem Ergebnis. Eines der Bits des Status-Register wird
  350.       beispielsweise Zero-Flag genannt. Andere Anweisungen setzen das Zero-
  351.       Flag automatisch auf eins, wenn das Ergebnis einer Operation null
  352.       ist.
  353.       Das Setzen der Flags erscheint anfangs als unwichtiges Detail, später
  354.       werden Sie jedoch erfahren, das es Anweisungen gibt, mit denen man an-
  355.       hand des Flag-Musters bedingte Verzweigungen realisieren kann, ähnlich
  356.       wie "IF ... THEN GOTO" in BASIC. Die einzige Möglichkeit in Assembler,
  357.       Entscheidungen zu treffen und dementsprechend zu handeln, besteht im
  358.       Lesen und Auswerten der Flags.
  359.       Obwohl einige Anweisungen stillschweigend die Flags beinflussen, gibt
  360.       es eine Reihe von Anweisungen, die als einzige Wirkung die Flags in Ab-
  361.       hängigkeit von einem Test oder Vergleich setzen. Es ist allgemein üb-
  362.       lich, diese Vergleichs-Operationen kurz vor einer bedingten Verzweigung
  363.       zu verwenden. Zusammengenommen sind diese zwei Anweisungen genau das
  364.       wie folgende Befehle in BASIC:
  365.       IF (Vergleich) THEN GOTO (Zeilennummer)
  366.                                                                      14
  367.       >>Syntax der Assembler-Sprache<<
  368.       Im allgemeinen wird jede Zeile eines Assembler-Programms in ein be-
  369.       stimmtes Bit-Muster übersetzt, das eine einzelne grundlegende Operation
  370.       des 8088 ausführt.
  371.       Jede Zeile kann aus einem oder mehreren der folgenden Teile bestehen:
  372.       Zuerst aus einem Label, der nur eine Markierung einer Stelle darstellt.
  373.       Wenn Sie von einem Teil des Programmes einen anderen Teil aufrufen
  374.       möchten, müssen Sie einen Label an die aufzurufende Stelle setzen. Beim
  375.       Aufruf beziehen Sie sich dann auf den Label. Normalerweise kann der La-
  376.       bel aus einer beliebigen Zeichenfolge bestehen. Gewöhnlich verwendet
  377.       man dafür einen Namen, der Sie später an die Funktion des Programmteils
  378.       erinnert. CHASM nimmt an, daß jede Zeichenkette, die in der ersten
  379.       Spalte einer Zeile beginnt, ein Label sein soll. Nach dem Label, oder
  380.       falls der Text nicht in der ersten Spalte, sondern weiter rechts be-
  381.       ginnt, kommt die (mnemonische) Anweisung. Diese gibt genau an, was in
  382.       dieser Zeile ausgeführt werden soll. Eine Liste von über 200 Mnemonics,
  383.       zusammen mit ihren Übersetzungen können Sie dem Buch "The 8086 Book"
  384.       entnehmen. Die meißten Anweisungen für den 8088 benötigen einen oder
  385.       mehrere *Operanden*. Operanden sind Angaben, die verarbeitet werden.
  386.       Sie werden nach der mnemonischen Anweisung aufgelistet.
  387.       Es sind eine Anzahl von Operanden möglich. Die häufigsten Operanden
  388.       sind wohl die Register, die man an ihren Kurznamen (2 Buchstaben) er-
  389.       kennt. Eine andere Form von Operanden sind die *unmittelbaren Daten*,
  390.       das sind Bit-Muster, die irgendwo gespeichert oder mit anderen Mustern
  391.       verglichen werden sollen. Gewöhnlich werden unmittelbare Daten in der
  392.       hexadezimalen Form angegeben, markiert mit einem vorgestellten "H".
  393.       Einige Assembler erlauben außerdem andere Wege, um unmittelbare Daten
  394.       anzugeben, z. B. in Form einer Berechnung. CHASM ermöglicht fünf ver-
  395.       schiedene Formen, unmittelbare Daten anzugeben.
  396.                                                                      15
  397.       Eine Speicher-Adresse kann als Operand verwendet werden, indem man
  398.       sie als Zahl und in eckige Klammern schreibt (nun wissen Sie, wofür
  399.       man die eckigen Klammern benötigt. Ohne diese könnte man nicht zwischen
  400.       einer Adresse und den unmittelbaren Daten unterscheiden). Wenn Sie
  401.       einen Teil des Speichers für Daten reserviert und mit einem Label mar-
  402.       kiert haben (mehr darüber später), dann können Sie den Label anstelle
  403.       der Speicher-Adresse als Operand verwenden. Schließlich gibt es viele
  404.       Arten der indirekten Speicher-Adressierung, genaueres hierüber können
  405.       Sie in dem Buch "The 8086 Book" lesen.
  406.       Die letzte große Gruppe von Operanden sind Label. Verzweigende Anwei-
  407.       sungen benötigen einen Operanden, der ihnen sagt, wohin sie verzweigen
  408.       sollen. In der Assembler-Sprache kann man an Stellen, an die verzweigt
  409.       werden soll, Labels davorsetzen. Der Label kann dann als Operand bei
  410.       dem Verzweigungs-Befehl angegeben werden.
  411.       Häufig sind die aufgelisteten Operanden eines Befehl von großer Wichtig-
  412.       keit. Wenn Sie z. B. ein Bit-Muster von einem Platz zu einem anderen
  413.       kopieren wollen, müssen Sie angeben, von wo es kommt und wohin es
  414.       kopiert werden soll. Es wurde vereinbart, daß normalerweise der erste
  415.       Operand den *Bestimmungsort*, der zweite Operand die *Quelle* angibt.
  416.       Um das Bit-Muster im DX-Register in das AX-Register zu kopieren, könnten
  417.       Sie deshalb folgendes schreiben:
  418.               MOV AX,DX
  419.       Den Sinn des Befehls erkennt man auch, wenn man die Anweisung von
  420.       links nach rechts liest: Lade (MOV = engl. Abkürz. v. MOVE = bewegen)
  421.       das Register AX mit (Komma heißt "mit") dem Inhalt des Registers DX.
  422.       Auch CHASM hält sich an diese Schreibweise, die übrigens vom ASSEMBLY
  423.       LANGUAGE COMMUNITY vereinbart wurde.
  424.       Der letzte Teil einer Assembler-Zeile ist der *Kommentar*. Der Kommen-
  425.       tar wird vom Assembler vollkommen ignoriert, trotzdem ist er für Men-
  426.       schen *lebensnotwendig*, die versuchen, das Programm zu verstehen.
  427.       Assembler-Programme sind sehr schwer zu verstehen, und deshalb ist es
  428.       so enorm wichtig, viele Kommentare einzufügen, damit man sich auch
  429.       später noch daran erinnern kann, was jeder Teil des Programmes tun
  430.       soll. Berufsmäßige Assembler-Programmierer kommentieren *jede* Zeile
  431.       des Programms und erklären damit, was es tut, außerdem widmen Sie
  432.       einige Zeilen nur den zusätzlichen Erklärungen. So sollten Sie z. B.
  433.       das BIOS Source-Listing durcharbeiten, daß Sie im "Technischen Referenz-
  434.       Handbuch von IBM" finden. Über die Hälfte des Listings besteht aus
  435.       Kommentaren!
  436.                                                                      16
  437.       Da der Assembler Kommentare ignoriert, kosten diese nichts in Bezug
  438.       auf den Speicherplatz oder die Ausführungs-Geschwindigkeit beim Über-
  439.       setzten Maschinenprogramm. Dies stellt einen krassen Gegensatz zu BASIC
  440.       da, wo jeder Kommentar das Programm verlangsamt und Speicherplatz
  441.       kostet. Im Allgemeinen ist ein bestimmtes Zeichen notwendig, das dem
  442.       Assembler den Anfang des Kommentars anzeigt, damit dieser überlesen
  443.       wird. CHASM verwendet für die Markierung des Kommentars den
  444.       Semikolon (";").
  445.                                                                      17
  446.       >>DER STACK<<
  447.       Ich habe einige mal den Namen *Stack* erwähnt. Der Stack ist nur ein
  448.       kleiner Teil des Speicher, der für eine besondere Aufgabe reserviert
  449.       worden ist.
  450.       Damit Sie ein Bild davon bekommen, wie der Stack arbeitet, stellen Sie
  451.       sich ein Selbstbedienungsrestaurant vor, in dem ein Gerät mit einer Fe-
  452.       der Tabletts hält. Jedes gewaschene Tablett wird oben auf den Stapel des
  453.       Gerätes gelegt. Da das Gerät am Boden eine Feder enthält, sinkt der
  454.       ganze Stapel vom Gewicht des neuen Tabletts runter, und zwar soweit,
  455.       daß die Spitze des Stapels immer auf der gleichen Höhe über den Boden
  456.       bleibt. Wenn ein Gast ein Tablett vom Stapel nimmt, so steigt das nach-
  457.       folgende Tablett an den Platz des fortgenommenen auf.
  458.       Im Computer wird der Stack zum Zwischenspeichern von Bit-Mustern verwen-
  459.       det, die z. B. von einem Programm oder Unterprogramm an ein anderes
  460.       übergeben werden sollen. Indem Werte auf den Stack gelegt werden, muß
  461.       die aufgerufene Routine keine bestimmte Adresse wissen, um die benötig-
  462.       ten Informationen zu erhalten, es braucht nur die obersten Werte vom
  463.       Stack zu holen.
  464.       Es gibt aber einen Kauderwelsch in Verbindung mit dem Stacks. Bit-Muster
  465.       werden auf den Stack *geschoben* und wieder *heruntergestoßen* (engl.
  466.       to push und to pop). Dementsprechend heißen die Befehle des 8088 eben-
  467.       falls PUSH und POP, es gibt aber noch mehr Stack-Befehle.
  468.       Weil Sie sich nicht darum kümmern müsssen, wo die Bit-Muster gespeichert
  469.       werden sollen, wird der Stack oft als Zwischenspeicher benutzt, um Bit-
  470.       Muster in einem Register, das man für andere Zwecke verwenden will, ab-
  471.       zulegen und später, wenn das Register wieder frei ist, wiederzuholen.
  472.       Es ist allgemein üblich, daß die ersten Anweisungen eines Unterprogramms
  473.       eine Reihe von PUSH-Befehlen sind, mit denen der Inhalt aller Register
  474.       gerettet wird, die vom Unterprogramm verwendet werden. Dies bezeichnet
  475.       man als *Sichern des Zustand* der Register. Am Ende des Unterprogramms
  476.       erhalten dann alle Register ihren ursprünglichen Inhalt wieder zurück
  477.       (POP-Befehl), man nennt dies das *Wiederherstellen des Zustands* der
  478.       Register. Ähnlich wie beim Tablett-Gerät ist der letzte Wert, den Sie
  479.       auf den Stack legen, der erste den Sie wieder herunterholen.
  480.       Wenn Sie einen Wert herunterholen, rutscht der vorletzte auf den Stack
  481.       gelegte Wert automatisch an die Spitze, genauso wie die Tabletts auf-
  482.       rücken, wenn ein Gast eines nimmt. Alles kommt vom Stack also in umge-
  483.       kehrter Reihenfolge wieder herunter, wie es hinaufgelegt wurde. Dies
  484.       nennt man auch die "last in, first out" Methode (*LIFO Stack*).
  485.                                                                      18
  486.       Natürlich gibt es im Speicher des Computer keine Feder. Vielmehr wird
  487.       der Stack mit Hilfe eines Register gesteuert, das immer anzeigt, an
  488.       welchem Speicherplatz sich der oberste Wert im Stack gerade befindet.
  489.       Wenn Sie etwas auf den Stack legen, so ändert ein Zeiger seinen Wert auf
  490.       die nächste verfügbare Speicher-Stelle und der Wert wird an dieser Platz
  491.       gespeichert. Wenn Sie einen Wert herunterholen, wird dieser vom ange-
  492.       zeigten Ort zurückkopiert und der Zeiger entsprechend verändert. Um den
  493.       Zeiger brauchen Sie sich nicht zu kümmern, weil all diese Schritte
  494.       automatisch mit der PUSH und POP Anweisung ausgeführt werden.
  495.       Das Register, das diesen Zähler enthält, ist der SP, das ist auch der
  496.       Grund, warum Sie nie am SP herummurksen sollten. Erinnern Sie sich? Eine
  497.       Adresse wird aus zwei Words, dem Offset und dem Segment gebildet. Das
  498.       Segment Word des Stacks befindet sich im SS-Register, darum sollten Sie
  499.       auch daß SS-Register in Ruhe lassen. Wenn Sie das von CHASM erzeugte
  500.       Maschinen-Programm starten, setzt DOS automatisch das SP und SS Register
  501.       und reserviert einen Stack, der 128 Words speichern kann.
  502.                                                                      19
  503.       >>SOFTWARE INTERRUPTS<<
  504.       Ich habe es gewissenhaft vermieden, über die verschiedenen individuellen
  505.       Anweisungen zu sprechen, die der 8088 kennt, weil sonst dieser kleine
  506.       (einführende) Lehrgang ziemlich bald zu einem großen Buch heranwachsen
  507.       würde. Es gibt jedoch eine sehr wichtige Anweisung, die, wenn Sie davon
  508.       im Buch "The 8088 Book" lesen würden, als nicht sehr nützlich erscheint.
  509.       Im folgendem Teil soll nun erläutert werden, warum der *Software Inter-
  510.       rupt* (INT) trotzdem so wichtig ist.
  511.       Der 8088 reserviert die ersten 1024 Bytes des Speichers für 256
  512.       *Interrupt-Vektoren*. Jedes der zwei Words langen Interrupt-Vektoren
  513.       wird zum Speichern einer Speicher-Adresse (Segment:Offset) verwendet.
  514.       Wenn der 8088 ein Software-Interrupt antrifft, so legt er die Adresse
  515.       der nächsten Anweisung von dem aufrufenden Programm im Stack ab, und
  516.       verzweigt dann zu der Speicheradresse, auf die der durch den Operanden
  517.       bestimmte Interrupt-Vektor zeigt.
  518.       Dies scheint ein ziemlich umständlicher Weg zu sein, um im Programm zu
  519.       verzweigen, und Sie werden diese Methode wohl nie anwenden, um von
  520.       einem Teil des Programmes zum anderen zu verzweigen. Diese Anweisung
  521.       ist deshalb so wichtig, weil IBM eine ganze Reihe von nützlichen kleinen
  522.       (und größeren) Maschinen-Sprache-Routinen in den Computer integriert
  523.       hat, und diese Interrupt-Vektoren zeigen darauf. Alle diese Routinen
  524.       sind so aufgebaut, daß sie nach ihrem Ablauf die auf dem Stack gelegte
  525.       Adresse wieder zurückholen und somit wieder an die richtige Stelle im
  526.       Programm zurückkehren.
  527.       Einige Routinen gehören zu DOS, ihre Dokumentation kann man im Anhang D
  528.       des DOS-Handbuchs finden. Der Rest von ihnen ist im ROM (Nur-Lese-
  529.       Speicher) gespeichert und umfasst das *BIOS* (das grundlegende Steuer-
  530.       system für Ein-/Ausgaben im Computer). Mehr Informationen über die
  531.       BIOS-Routinen können Sie dem Anhang A des "Technischen Referenz-Hand-
  532.       buchs" von IBM entnehmen. IBM verlangt für das Handbuch ungefähr $40,
  533.       aber alleine die Informationen im Anhang A sind ihr Geld wert.
  534.       Die Rountinen erledigen alle möglichen nützlichen arbeiten, wie z. B.
  535.       Zeichen auf dem Bildschirm auszugeben, Daten von der Tastatur zu lesen,
  536.       usw. Im Grunde genommen erweitern die Software-Interrupts den 8088 um
  537.       eine ganze Reihe von mächtigen Anweisungen.
  538.                                                                      20
  539.       Schließlich ist es sehr einfach, die Software-Interrupts "umzubiegen"
  540.       auf ein eigenes Programm, wenn Ihnen eine Routine nicht gefällt und Sie
  541.       diese verbessern wollen. Dazu müssen Sie nur Ihr eigenes Programm laden
  542.       und die Standard-Interrupt-Vektoren neu initialisieren, indem Sie auf
  543.       Ihr eigenes Programm zeigen anstatt auf die internen Routinen. Nach
  544.       diesem Prinzip arbeiten viele Ram-Disks und Printer-Spooler. Die Pro-
  545.       gramme verändern den Vektor für die Disketten- oder Druckeransteuerung
  546.       so um, daß er auf sie selbst zeigt und führen dann die Funktion in
  547.       ihrer besonderen Art und Weise aus.
  548.       Damit dies ganz einfach geht, gibt es eine DOS-Interrupt-Routine, die
  549.       den Standard-Vektor löscht und dafür die neue Zieladresse des Vektors
  550.       einfügt. Es gibt noch eine andere DOS-Interrupt-Routine, die zum In-
  551.       stallieren von Maschinen-Programmen verwendet wird, ohne daß es zufällig
  552.       andere Programme löscht oder selbst gelöscht wird. Das Ganze ist wirk-
  553.       lich einfach und Problemlos zu handhaben, wie Sie sehen.
  554.                                                                      21
  555.       >>PSEUDO-OPERATIONEN<<
  556.       Bisher könnten Sie meinen, daß jede Zeile eines Assembler-Programms
  557.       in eine Maschinensprache-Anweisung übersetzt werden kann. Tatsächlich
  558.       ist dies nicht immer so. Die meißten Assembler ermöglichen eine Reihe
  559.       von *Pseudo-Operationen*, die der Assembler zwar als erlaubten Befehl
  560.       anerkennt, die jedoch nicht in eine Maschinensprache-Anweisung umgewan-
  561.       delt werden können. Fast immer wird der Ausdruck "Pseudo-Operation"
  562.       abgekürzt und als *Pseudo-Op* bezeichnet. Manchmal werden Sie auch auf
  563.       *Assembler-Directiven* stoßen, die zwar wie eine Pseudo-Op aussehen,
  564.       jedoch nicht das Gleiche bewirken (Anm.: Directive = Befehl, der nur die
  565.       interne Arbeitsweise des Assemblers beeinflußt).
  566.       Eine weit verbreitete Pseudo-Op ist die *Gleichsetzung* mit dem *EQU*-
  567.       Befehl (von engl. to equate). Dieser erlaubt es Ihnen, einem konstanten
  568.       Wert einen Namen zu geben. Danach setzt der Assembler überall, wo er
  569.       auf diesen Namen trifft, automatisch den Wert der Konstante ein. Dadurch
  570.       sind Ihre Programme leichter zu verstehen, weil man anstelle irgendeines
  571.       bedeutungslosen Bit-Musters einen Namen sieht, der die Bedeutung des
  572.       Bit-Musters erklärt. Außerdem können Sie Ihr Programm leichter ändern,
  573.       da Sie nur dem Namen einen anderen Wert zuweisen brauchen, anstatt jede
  574.       Zeile des Programm durchzusehen und den Wert, falls er vorkommt, umzu-
  575.       ändern.
  576.       Ich möchte nur noch einen weiteren Pseudo-Op-Typ besprechen, mit dem
  577.       man Speicherplatz für Daten reservieren kann. Diese Pseudo-Op's haben
  578.       bei jedem Assembler ihre persönlichen Eigenheiten. CHASM kennt nur zwei
  579.       derartige Pseudo-Op's: DB (declare Byte) und DS (declare storage). DB
  580.       wird zum Anlegen kleiner Datenfelder verwendet, indem man ein Byte große
  581.       Werte in einer bestimmten Form angibt. DS reserviert ein relativ großes
  582.       Datenfeld, das jedoch immer mit dem gleichen Wert gefüllt wird.
  583.       Falls Sie vor einer Pseudo-Op, die Datenfelder anlegt, einen Label set-
  584.       zen, können Sie bei den meißten Assemblern den Label anstelle der wirk-
  585.       lichen Speicheradresse als Operanden verwenden. Der Assembler setzt
  586.       während des Übersetzungsvorgang automatisch die Speicheradresse anstelle
  587.       des Namens ein.
  588.       Viele Assembler haben eine große Anzahl von Pseudo-Op's. CHASM kennt
  589.       noch einige mehr als die hier besprochenen Pseudo-Op's.
  590.                                                                      22
  591.       >>LEHRGANG<<
  592.       Zum Abschluß dieser Fibel will ich Ihnen anhand eines Beispiels den
  593.       Vorgang des Schreiben, Assemblieren und Starten eines kurzen Programms
  594.       erläutern.
  595.       Unser Programm soll nur einen Text auf den Bildschirm schreiben und
  596.       dann zu DOS zurückkehren. Obwohl das Programm sehr einfach ist,
  597.       demonstriert es Ihnen eine Reihe von Punkten wie z. B. einen DOS-Funk-
  598.       tions-Aufruf, das Anlegen eines Datenfeldes und einen guten Programm-
  599.       Aufbau. Anhang D des DOS-Handbuchs erläutert die verschiedenen DOS-
  600.       Funktions- und Interrupt-Aufrufe, die einem Assembler-Programmierer zur
  601.       Verfügung stehen. Zum Ausgeben eines Textes auf den Bildschirm verwenden
  602.       wir Funktion 9. Sie sollten nun zuerst die Dokumentation dieser Funktion
  603.       in Ihrem DOS-Handbuch lesen.
  604.       Können Sie es verstehen? Diese Funktion benötigt im DX-Register die
  605.       Speicher-Adresse des Text-Strings und im AH-Register den Wert "9", da
  606.       ja die Funktion 9 aufgerufen werden soll, dann muß das Interrupt 21H
  607.       aufgerufen werden. Eigentlich übergeben wir nur Werte und lassen DOS
  608.       dann (mit Hilfe dieser Werte) für uns arbeiten.
  609.       Das Programm sieht dann folgendermaßen aus:
  610.            MOV AH, 9                 ;DOS Funktion 9 auswählen
  611.            MOV DX, OFFSET(MESSAGE)   ;Adresse des Text-Strings holen
  612.            INT 21H                   ;DOS aufrufen
  613.       Beachten Sie, daß keine der Zeilen am linken Rand beginnt (Spalte eins).
  614.       Wäre das nicht der Fall, würde CHASM die (mnemonischen) Anweisungen als
  615.       Label behandeln und somit sehr durcheinander geraten. Beachten Sie auch,
  616.       daß jede Zeile einen Kommentar enthält, der erklärt, was in der Zeile
  617.       gemacht werden soll.
  618.       Die zweite Zeile bedarf einer kleinen Erklärung. CHASM's OFFSET-Funktion
  619.       gibt die Speicher-Adresse des in den Klammern stehenden Ausdrucks zu-
  620.       rück, in unserem Fall vom Label MESSAGE. Wir wollen annehmen, daß wir
  621.       später im Programm Speicherplatz für unseren Text-String reservieren
  622.       wollen und die Speicheradresse dann mit dem Label "MESSAGE"benennen
  623.       wollen.
  624.                                                                      23
  625.       Nachdem der Text angezeigt worden ist, wollen wir zu DOS zurückkehren.
  626.       Wenn wir nicht deutlich sagen, daß wir zu DOS zurück wollen, arbeitet
  627.       der 8088 freudig weiter, indem er jeden Wert, der sich zufällig im Spei-
  628.       cher befindet, als Befehl ausführt. Erinnern Sie sich an den System-
  629.       Absturz? DOS kennt jedoch auch ein Interrupt, mit dem Sie zu DOS zurück-
  630.       gelangen. Der Befehl lautet:
  631.              INT 20H        ;Zurück zu DOS
  632.       Alles, was jetzt noch fehlt, ist ein Datenfeld im Speicher, das den
  633.       auszudruckenden Text enthält. Dazu verwenden wir die Pseudo-Op DB
  634.       declare Bytes):
  635.       MESSAGE DB  'Hello, World!$'     ;Auszudruckender Text
  636.       Der Speicher-Adresse wird der Name "MESSAGE" gegeben, weil die Zeile
  637.       mit dem Label "MESSAGE" in Spalte eins beginnt. Nun weiß CHASM, daß beim
  638.       vorangegangenen OFFSET-Befehl dieser Speicher-Bereich gemeint war. Sie
  639.       brauchen sich nicht darum zu sorgen, welche Adresse MESSAGE wirklich
  640.       hat, darum kümmert sich schon CHASM.
  641.       Vierzehn Bytes des Speichers enthalten nun die ASCII-Codes der Zeichen,
  642.       die sich im String "Hello, World!$" befinden.  Beachten Sie, daß der
  643.       String mit dem Zeichen "$" endet. Der DOS Funktions-Aufruf Nr. 9 druckt
  644.       Zeichen aus, bis er auf ein "$" stößt, hier stoppt er dann.
  645.       Wenn Sie das "$"-Zeichen am Ende des Strings vergessen haben, werden
  646.       Sie wohl nicht gerade vergnügt erleben, wie DOS versucht, den ganzen
  647.       Speicherinhalt auf dem Bildschirm auszudrucken.
  648.                                                                      24
  649.       Wenn wir alles zusammenfassen und einige Kommentare hinzufügen, so
  650.       sieht unser Programm folgendermaßen aus:
  651.       ;=====================================;
  652.       ; HELLO    Version 1.00               ;
  653.       ;          1984 by David Whitman      ;
  654.       ;                                     ;
  655.       ; Beispiel-Programm für CHASM.        ;
  656.       ; Druckt eine Begrüßung auf den Screen;
  657.       ;=====================================;
  658.               MOV AH, 9                 ;DOS Funktion 9 auswählen
  659.               MOV DX, OFFSET(MESSAGE)   ;Adresse des Text-Strings holen
  660.               INT 21H                   ;DOS aufrufen
  661.               INT 20H                   ;Zurück zu DOS
  662.       MESSAGE DB  'Hello, World!$'      ;Auszudruckender Text
  663.       Nachdem wir dieses Programm entworfen haben, müssen wir nur noch eine
  664.       Datei anlegen, die alle Zeilen des Programms enthält. Dies erledigen wir
  665.       mit einem Editor oder einer Textverarbeitung. (Natürlich werden Sie
  666.       dazu meißtens einen Editor verwenden).
  667.       CHASM ließt nur Source-Dateien im Standard-DOS-Format, einige Textverar-
  668.       beitungen nennen dies auch "Dokument-" oder "ASCII-Modus".  Die meißten
  669.       Textverarbeitungen und jeder ordentliche Text-Editor arbeitet automa-
  670.       tisch mit diesem Format. Wordstar und Easywriter (und sicherlich noch
  671.       andere) arbeiten mit besonderen Formaten, das Handbuch müßte jedoch
  672.       Auskunft darüber geben, wie Sie dies ändern können.
  673.       Erzeugen Sie nun bitte eine Standard-DOS-Datei mit dem Namen HELLO.ASM,
  674.       die diese Programmzeilen beinhaltet. Sollten Sie keine Lust oder aber
  675.       Probleme haben: Die Datei EXAMPLE.ASM auf Ihrer CHASM-Diskette enthält
  676.       bereits das vollständige Programm. Sie müssen nur EXAMPLE.ASM in eine
  677.       neue Datei mit dem Namen HELLO.ASM kopieren.
  678.       Nun ist es Zeit, das Programm zu assemblieren. Zuvor müssen Sie die
  679.       CHASM-Disk initialisieren. Wie dies geht, können Sie im "User Manual"
  680.       unter "Setting up a CHASM Work Disk" lesen, oder kopieren Sie vorläufig
  681.       nur die Datei BASIC.COM von Ihrer DOS-Disk auf Ihre CHASM-Disk (Arbeits-
  682.       kopie!). Kopieren Sie außerdem HELLO.ASM auf diese Diskette.
  683.                                                                      25
  684.       Legen Sie die CHASM-Disk in Laufwerk A und starten Sie dann CHASM,
  685.       indem Sie seinen Namen eintippen:
  686.          A> CHASM
  687.       CHASM zeigt daraufhin eine Begrüßungs-Bildschirmseite an und fordert
  688.       Sie auf, eine Taste zu drücken, wenn Sie fertig sind. Danach fragt CHASM
  689.       Sie einige Fragen:
  690.           Source code file name? [.asm]
  691.       Geben Sie HELLO.ASM oder nur HELLO ein und drücken Sie RETURN. (Wenn
  692.       Sie keine Datei-Extension angeben, nimmt CHASM ".ASM" an).
  693.           Direct listing to Printer (P), Screen (S), or Disk (D)?
  694.       CHASM möchte wissen, wohin er das Listing während der Assemblierung
  695.       ausgeben soll. Haben Sie einen Drucker, so schalten Sie diesen ein und
  696.       drücken P. Haben Sie keinen Drucker, drücken Sie S.
  697.       Die letzte Frage ist:
  698.           Name for object file? [hello.com]
  699.       CHASM fragt nach dem Dateinamen des Maschinensprache-Programms, das
  700.       nur erzeugt werden soll. Drücken Sie hier nur ENTER.  CHASM nennt das
  701.       Programm dann HELLO.COM .
  702.       An dieser Stelle beginnt CHASM mit dem Zugriff auf das Diskettenlaufwerk
  703.       und ließt das Programm Zeile für Zeile. Eine Zustands-Zeile erscheint
  704.       unten am Bildschirm. Diese gibt Ihnen Auskunft darüber, wie weit die
  705.       Übersetzung schon fortgeschritten ist. Bei diesem Programm dauert der
  706.       ganze Vorgang ungefähr eine Minute.
  707.       Wenn das Listing auf den Drucker ausgegeben worden ist, kehrt CHASM
  708.       automatisch zu DOS zurück. Wurde es auf den Bildschirm ausgegeben,
  709.       wartet CHASM darauf, daß Sie eine Taste drücken als Zeichen dafür, daß
  710.       Sie es gelesen haben. Am Ende des Listings erscheint der Hinweis:
  711.       XXX Diagnostics Offered     (deutsch: XXX Diagnosen angeboten)
  712.       YYY Errors Detected         (deutsch: YYY Fehler entdeckt)
  713.                                                                      26
  714.       Sind beide Zahlen 0, ist alles in Ordnung. Wenn nicht, suchen Sie im
  715.       Listing nach den Fehler-Meldungen, welche die fehlerhaften Zeilen an-
  716.       zeigen. Sie brauchen sich an dieser Stelle nicht darum zu kümmern, was
  717.       die Fehler-Meldungen aussagen, vergleichen Sie nur die Programm-Datei
  718.       Zeile für Zeile mit unserem Entwurf. Wenn Sie es geschaft haben, das
  719.       Programm ohne Fehler zu assemblieren, können Sie weiterlesen.
  720.       Ihre Diskette enthält jetzt einen Maschinen-Programm mit dem Namen
  721.       HELLO.COM. Überzeugen Sie sich davon, indem Sie sich mit DIR das Direk-
  722.       tory ansehen. Dort sollte die Datei aufgelistet sein.
  723.       Zum Starten des Maschinen-Programms müssen Sie nur den Namen ohne die
  724.       Extension .COM eintippen. (Hinweis: Die Datei hat die Extension ".COM"
  725.       von DOS bekommen, damit sie immer von DOS als Maschinen-Programm er-
  726.       kannt werden kann). Versuchen Sie es nun.
  727.       Schreiben Sie beim DOS-Prompt: HELLO. Ihr Disk-Laufwerk surrt nun eine
  728.       Sekunde, danach erscheint die Meldung "Hello, World!".
  729.       Als weitere Übung könnten Sie versuchen, einen Wagenrücklauf und einen
  730.       Zeilenvorschub auszuführen, bevor Sie die Nachricht ausgeben, damit sie
  731.       am Anfang der Zeile steht. Wagenrücklauf hat des ASCII-Code 13, Zeilen-
  732.       vorschub ist 10. Lesen Sie im "CHASM User's Manual" über die DB Pseudo-
  733.       Op nach. Fügen Sie diese dann an den Anfang des Strings, indem Sie deren
  734.       Dezimalwerte eingeben.
  735.       Versuchen Sie doch einmal, ein neues Programm namens "BEEP" zu schrei-
  736.       ben, welches das Klingel-Zeichen (ASCII Nr. 7) auf dem Bildschirm
  737.       schreibt. Sie können BEEP verwenden, um Ihre Mitarbeiter zu ärgern.
  738.       Hüten Sie sich aber davor, BEEP in einer Schleife aufzurufen!
  739.       Eine vorteilhaftere Übung wäre es, wenn Sie den Bildschirm vor dem
  740.       Ausgeben des Textes löschen würden. Der einfachste Weg wäre, die BIOS-
  741.       Funktion VIDEO_IO hierfür zu verwenden (dokumentiert auf den Seiten
  742.       A-43 bis A-44 im "Technischen Handbuch").  Die Kommentare im BIOS-
  743.       Listing erklären Ihnen genau, welche Werte in welches Register geladen
  744.       werden müssen, um den Bildschirm zu beeinflussen. Setzen Sie die
  745.       Register und rufen Sie dann das Interrupt INT 10H auf, damit der Bild-
  746.       schirm gelöscht und der Cursor in die linke obere Ecke gesetzt wird.
  747.  
  748.       Wenn Sie diese ganze Fibel gelesen und auch das Programm ausprobiert
  749.       haben, werden Sie es vielleicht verändern, Sie sind ja jetzt kein
  750.       Anfänger mehr. Sie sollten nun genug wissen, um das "CHASM User
  751.       Manual" und das Buch "The 8086 Book" zu verdauen. Dann können Sie
  752.       beginnen, Ihre eigenen Programme zu schreiben.     VIEL GLÜCK!
  753.  
  754.       Anmerkungen des Übersetzers: Sämtliche angegebene Literatur ist in
  755.                                    ENGLISCHER SPRACHE. Inzwischen dürfte
  756.                                    es jedoch sicherlich deutsche Über-
  757.                                    setzungen geben.
  758.                   Bitte verzeihen Sie mir einige ungenaue Übersetzungen,
  759.                   die Fibel wurde in amerikanischer (Umgangs-)Sprache
  760.                   geschrieben.
  761.          Ich hoffe, daß Ihnen diese Fibel nützlich sein wird.
  762.  
  763.                                                         TOASTI
  764.  
  765.