Schleifen (sogenannte Loops)
Da wir nun wissen, wie man einen Satz ausgeben kann, wollen wir uns den Schleifen widmen.
Wozu brauche ich
eigentlich eine Schleife?
Angenommen, wir
schreiben ein Programm, dass die Zahlen von 1 - 1000 ausgeben soll, dann haben
wir 2 Möglichkeiten, dies zu realisieren. Die erste Möglichkeite wäre, alle
Zahlen von 1 - 1000 untereinander zu schreiben, was natürlich ein kompletter
Unsinn wäre. Wir erstellen also eine Schleife, die in unserem Fall z.B. 1000
mal durchlaufen wird und dass ausführt, was innerhalb der Schleife steht.
Unsere Schleife könnte so aussehen (grob gesehen):
VARIABLE AktuelleZahl =
0
SCHLEIFE (1000 mal)
Gib die
AktuelleZahl aus
Erhöhe die aktuelle Zahl um 1
ENDE DER SCHLEIFE
Zu merken:
Wenn man etwas um 1
erhöht, so nennt man das "Inkrementieren".
Das Gegenteil davon
wäre, wenn man etwas um 1 zu verringert, was man
"Dekrementieren"
nennt.
Wir wollen nun ein Programm schreiben, welches 10 mal eine Meldung ausgibt, die wir vorher festgelegt haben.
Das erste Codebeispiel wurde um einige Zeilen erweitert (gelb markiert), welche natürlich weiter unten wieder erklärt werden :)
loops.asm (Windows-1250 Zeichenkodierung)
.MODEL
Small
;wir basteln eine kleine EXE Datei :) .STACK 100h ;100h (im Dezimalen 255) gibt die Größe des Stacks an .DATA ;hier beginnt der Datenabschnitt ; Die Meldung, die wir ausgeben wollen DieMeldung DB "Hilfe, ich bin in einer Schleife!",13,10,"$" .CODE ;hier beginnt der Codeabschnitt Start:
;Einsprungspunkt (wo gestartet wird)
mov dx,OFFSET DieMeldung
;Offsetadresse von Nachricht dem
Datenregister mitteilen
mov cx, 10d
;in CX schreiben wir, wie oft die Schleife OurLoop:
;Anfang der Schleife mit der Markierung "OurLoop" setzen |
DieMeldung DB "Hilfe,
ich bin in einer Schleife!",13,10,"$"
Hmmm... das ist unser Text
der ausgegeben werden soll. Wie das geht, haben wir ja
schon in unserm Programm
"Hello world!"
gesehen, doch... was bedeutet dieses ,13,10,
am Ende?
Die Antwort sei kurz und einfach erklärt: Es ist ein Zeilenvorschub. Bei einem
Zeilenvorschub wird in die nächste Zeile gewechselt, was also den gleichen
Effekt hat, wie wenn wir z.B. in Word Enter drücken würden. Wichtig:
Der Zeilenvorschub darf nicht nach dem $-Zeichen stehen.
mov cx, 10d
In der Schleife
wird der Wert in CX
automatisch immer um
1
herabgesetzt
(dekrementiert), bis er 0
ist, was zur Beendigung der Schleife führt.
10d
ist die
Zahl
10
im Dezimalen(d).
Wir könnten die Zahl 10
aber auch als hexadezimale(h)
Zahl reinschreiben, also
0Ah.
übrigens: Eine Hexadzimale Zahl in Assembler muss
immer mit einer 0
beginnen.
OurLoop:
Diese Markierung gibt an, wo die Schleife
beginnt. Der Name kann hier frei gewählt
werden. Es könnte ebenso
"Schleifenanfang"
heißen. Eine Markierung (Label)
erkennt man immer an dem
folgendem Aufbau:
<Labelname>:
Hinweis: Eine Markierung wird übrigens Label genannt.
int 21h
Da der Befehl
innerhalb der Schleife steht, wird er 10 mal ausgeführt. Wir wir wissen,
führt das Interrupt 21h
immer die Funktion aus, die ein
AH
steht. In
unserem Fall steht in
AH
09 (Text ausgeben).
Somit wird 10 mal der Text
ausgegeben, den wir vorher angegeben haben.
Loop OurLoop
Mit diesem Befehl
geben wir an, wo die Schleife "OurLoop"
aufhört. Der Aufbau des
Befehles sieht folgend aus:
Loop <Name der
Schleife>
So, nun geht es wieder ans Erstellen. Also, rein in die Eingabeaufforderung und Folgendes eintippen:
F:\Assembler
Tutorial\Beispiele\Schleife>ml /c
schleife.asm Microsoft (R) Macro Assembler Version 6.14.8444 Copyright (C) Microsoft Corp 1981-1997. All rights reserved. Assembling: schleife.asm F:\Assembler Tutorial\Beispiele\Schleife> |
Nun müssen wir das ganz noch Linken:
F:\Assembler
Tutorial\Beispiele\Schleife>dlink
schleife Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994 Copyright (C) Microsoft Corp 1984-1993. All rights reserved. Run File [schleife.exe]: List File [nul.map]: Libraries [.lib]: Definitions File [nul.def]: F:\Assembler Tutorial\Beispiele\Schleife> |
Und wenn wir es ausführen, sollte Folgendes ausgegeben werden:
F:\Assembler
Tutorial\Beispiele\Schleife>schleife Hilfe, ich bin in einer Schleife! Hilfe, ich bin in einer Schleife! Hilfe, ich bin in einer Schleife! Hilfe, ich bin in einer Schleife! Hilfe, ich bin in einer Schleife! Hilfe, ich bin in einer Schleife! Hilfe, ich bin in einer Schleife! Hilfe, ich bin in einer Schleife! Hilfe, ich bin in einer Schleife! Hilfe, ich bin in einer Schleife! F:\ASSEMB~1\BEISPI~1\Schleife> |
Wie man sieht, funktioniert unsere Schleife :)
Letzte änderung: [17. Juni 2003]