Schleifen (sogenannte Loops)

Zurück

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)

                              ;zuerst müssen wir mal unser Datensegment vorbereiten
    mov ax,@data              ;die Segmentadresse des Datensegmentes ins Register AX
    mov ds,ax                 ;DS die Segmentadresse des Datensegmentes mitteilen

    mov dx,OFFSET DieMeldung  ;Offsetadresse von Nachricht dem Datenregister mitteilen
    mov ah,09h                ;ins Register AH die Funktion 9 reinschreiben

    mov cx, 10d              ;in CX schreiben wir, wie oft die Schleife
                              ;ausgeführt werden soll. In unserem Fall 10 mal.

OurLoop:                      ;Anfang der Schleife mit der Markierung "OurLoop" setzen
   
int 21h                   ;die Funktion (9=Text ausgeben) im Register AH ausführen
Loop OurLoop                  ;hier kennzeichnen wir das Ende der Schleife

    mov ah,4Ch                ;nun schreiben wir die Funktion 4C (Beenden) nach AH
    int 21h                   ;Funktion im Register AH ausführen

END Start                     ;Ende des Einsprungpunktes angeben

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]