Version 2.0 Aktualisiert: 30.03.04

Ich habe bei dem Programm die vereinfachten Segmentanweisungen benutzt, welche nur von neueren Assemblern unterstützt werden. Ich weiss nicht wie verbreitet ältere Assembler sind, möglicherweise werden diese Anweisungen von ihrem Assembler nicht unterstützt. Ich werde daher die normalen Segmentanweisungen im Anhang kurz erklären. Programmiert habe ich im MASM Modus, da ich vom Ideal Modus nicht viel halte. Der MASM Modus hat auch den Vorteil, dass er sowohl vom MASM als auch von TASM verstanden wird.
Das Assemblerprogramm beginnt mit .MODEL SMALL .Dieser Befehl richtet sich an den Assembler selbst, und wird nicht direkt übersetzt. Der Befehl legt fest, dass Daten und Code jeweils ein eigenes Segment erhalten, dass nicht grösser als 64 KB sein darf. .MODEL TINY würde bedeuten, dass Daten und Code in ein einziges Segment passen müssen, das ebenfalls nicht grösser als 64 KB sein darf. Dies würde dann, zusammen mit ein paar anderen Modifikationen eine COM Datei (engl. compile = zusammenstellen) erzeugen.
Die nächste Anweisung ist .STACK 100h. Dies legt die grösse des Stack auf 256 Byte fest, wenn man versucht mehr darauf zu speichern gibt es einen Stack overflow oder Stapelüberlauf. Versucht man etwas vom Stack zu holen, wenn dieser leer ist gibt es einen Stack underflow. Für unser Programm ist ein Stack mit 256 Byte mehr als gross genug. Wird kein Wert angegeben werden 1024 Byte reserviert.
.DATA definiert das Datensegment. Hier kommen Daten und Variablen, Puffer usw. rein. Die Daten werden durch ein Label gekennzeichnet, welches vom Assembler in eine Adresse umgesetzt wird. In unserem Fall heisst das Label "Meldung". Der Namen kann beliebig gewählt werden, jedoch werden nur die ersten 31 Zeichen berücksichtigt. Folgende Zeichen sind in Labels erlaubt: 1. A-Z 2. a-z 3. 0-9 (nicht am Anfang des Namens) 4. _ und @ und ? und $ (dürfen nicht allein stehen). Zwischen Gross und Kleinbuchstaben wird nicht unterschieden.
DB steht für define Byte. Der Assembler zählt automatisch die Zeichen in den doppelten Hochkommata (es gehen auch einfache) und reserviert den Speicherplatz. Wenn sie doppelte Hochkommata benutzen, dürfen sie diese nicht in der Zeichenkette benutzen und andersherum. D.h. so geht es: DB "Tom´s cat" und so: DB ´Er sagte: "Hallo"´ .
.CODE bezeichnet den Anfang des Codesegments. D.h. nun folgen die Befehle.
Der Befehl mov kopiert den Inhalt des Quelloperanden in den Zieloperanden. So schiebt z.B. mov ax,1500 den Wert 1500 nach AX. Also ist danach AX = 1500. @data enthält die Adresse des Datensegments (der Assembler ermittelt diese Zahl). mov ax,@data schiebt also die Adresse des Datensegments nach ax. mov ds,ax schiebt die den Wert von AX nach DS. Das Datensegmentregister enthält also nun die Adresse des Datensegments.
mov ds,@data sieht zwar kürzer aus, geht aber nicht, da man Segmentregister nicht direkt mit Konstanten laden kann. Man muss also den Umweg über ein Universalregister in kauf nehmen. mov dx,OFFSET Meldung schiebt die Offsetadtresse von Meldung nach dx. OFFSET Meldung wird vom Assembler in einen Wert umgesetzt, OFFSET selbst ist kein Maschienenbefehl.
mov ah,09h schiebt den Wert 9 nach ah. AX wird sozusagen zur Hälfte überschrieben. int 21h verzweigt in ein Unterprogramm des Betriebssystemes. Das Programm wird unterbrochen (Interrupt!) und DOS führt nun seine Funktion 09h aus: Write String, schreibe Zeichenkette. Die DOS-Funktion muss in ah stehen (in unserem Fall ist es Funktion 9). Ausserdem benötigt die DOS-Funktion noch Angaben über den Ort der Zeichenkette. Dieser wird durch die Segmentadresse in DS und die Offsetadresse in DX definiert. Das Ende der Zeichenkette wird dem Betriebssystem durch ein $ mitgeteilt, welches selbst nicht angezeigt wird.
Das Unterprogramm welches durch Int 21h ausgelöst wurde kehrt am Ende wieder in das Programm zur nächsten Anweisung zurück. Alle nötigen Informationen hat der Prozessor im Stack gespeichert. mov ah,4Ch schiebt 4Ch nach AH. Die Kennung der Interruptfunktion befindet sich also nun in ah. Int 21h löst ein weiteres Unterprogramm aus, welches das Programm beendet. END zeigt dem Assembler das Ende an, hier wird nicht mehr weiterübersetzt.