| FAQ der Newsgroup de.comp.lang.assembler (d.c.l.a.) | |
|
Wie mache ich Schleifen in Assembler? Schleifen nennt man die Methode, ein Stück Code zu wiederholen. Wenn das Stück Code immer wieder ohne Abbruchbedingung wiederholt wird, spricht man von einer Endlosschleife, was meistens (aber nicht immer) gleichbedeutend mit einem Programmierfehler ist. Man unterscheidet drei Arten von Schleifen:
Eine Zählschleife wiederholt einen Block eine gewisse Anzahl.
mov ecx, 5
.Schleife: ; 5 Wiederholungen
; Anweisungen
loop .Schleife
Bei einer Repeat-Schleife wird die Abbruchbedingung am Ende der Schleife geprüft. Der Schleifenkörper wird also mindestens einmal durchlaufen.
xor ecx, ecx
.Schleife: ; repeat ... until (ecx == 5)
; Anweisungen
inc ecx
cmp ecx, 5
jne .Schleife
Bei einer While-Schleife wird die Abbruchbedingung am Anfang der Schleife geprüft.
xor ecx, ecx
.Schleife: ; while (ecx != 5)
cmp ecx, 5
je .Break
; Anweisungen
inc ecx
jmp .Schleife
.Break:
Ein Sonderfall der While-Schleife ist die Foreach-Schleife: Die Abbruchbedingung ist das Ende einer Struktur (String, Array, Objekte), deren Größe nicht bekannt ist. Das Ende der Struktur muss natürlich irgendwie erkennbar sein, ein C-String z. B. endet mit einem Nullbyte.
; Foreach-Schleife für jeden Buchstaben in einem C-String
.Schleife:
lodsb
or al, al
je .Break
; Anweisungen
jmp .Schleife
.Break:
Ein Break ist eine zusätzliche Abbruchbedingung:
; Zählschleife mit Break
mov ecx, 5
.Schleife:
cmp ecx, 3
je .Break
; Anweisungen
loop .Schleife
.Break:
Ein Continue ist die Anweisung für einen neuen Schleifendurchlauf, wobei der restliche Schleifenkörper ignoriert wird:
; Zählschleife mit Continue
mov ecx, 5
.Schleife:
cmp ecx, 2
je .Continue
; Anweisungen
.Continue:
loop .Schleife
Von einer verschachtelten Schleife spricht man, wenn sich eine Schleife innerhalb einer anderen Schleife befindet. In Pseudo-Hochsprachen-Code ausgedrückt: Beispiel einer verschachtelten Schleife: FOR I=1 TO 10 FOR J=2 TO 20 NEXT J NEXT I In Assembler ist die Gefahr groß, dass man beim Aufbau einer solchen Schleife den Überblick verliert. Es empfiehlt sich, die Schleife Stück für Stück herzustellen und bei jedem Schritt zu prüfen, ob sie noch funktioniert:
1. Schritt: Die äußere Schleife herstellen.
mov ecx, 10
I:
loop I
2. Schritt: Die innere Schleife herstellen.
mov ecx, 20
J:
loop J
3. Schritt: Schleifen verschachteln (Copy&Paste).
mov ecx, 10
I:
mov ecx, 20
J:
loop J
loop I
4. Schritt: Erkennen, dass beide Schleifen sich mit ihrem Zugriff auf ECX in die Quere kommen.
5. Schritt: ECX vor der jeweils anderen Schleife in Sicherheit bringen.
mov ecx, 10
I:
push ecx
mov ecx, 20
J:
push ecx
pop ecx
loop J
pop ecx
loop I
Ralph 'rkhb' Bauer Aug 2008 / Feb 2009 |