Schleife
aus RHWiki, der freien Romhacking-Enzyklopädie
Als Schleife bezeichnet man ein Programmkonstrukt, das eine mehrfache Ausführung ein und desselben Codeblocks erlaubt. Dies kann entweder rein zur Verkleinerung des Quellcodes dienen, oder aber um eine Zählervariable zu verwenden, welche in jedem Durchlauf entsprechende Werte enthält.
Zweck
Mit Schleifen kann man z.B. große Datenmengen kopieren, ein Array oder eine Liste durchsuchen, oder generell die selbe Methode auf verschiedene Daten anwenden.
Dabei spart man mit Schleifen erheblich Code, wie folgendes Beispiel zeigt:
// Ohne Schleife: Kopiere Quelle[1] nach Ziel[1] Kopiere Quelle[2] nach Ziel[2] Kopiere Quelle[3] nach Ziel[3] Kopiere Quelle[4] nach Ziel[4] Kopiere Quelle[5] nach Ziel[5] ... ... ... .. .. .. . . .
Das kann strenggenommen zwar schneller als eine entsprechende Schleife sein (da in einer Schleife der dauernde Vergleich des Zählers auch Zeit kostet), sodass es sich für eine kleine Anzahl von Operationen evtl. lohnt, jedoch wird bei einer hohen Anzahl von Durchläufen der Code ziemlich groß, sodass es unvernünftig wäre, keine Schleife zu verwenden.
// Mit Schleife: Für Zähler von 1 bis 100 tue folgendes: Kopiere Quelle[Zähler] nach Ziel[Zähler] Ende der Schleife (Erhöhe Zähler um 1 und wiederhole bis Zähler 100 ist)
Implementierung von Schleifen
In Programmiersprachen werden oft mehrere verschiedene Konstrukte und Konzepte zur Umsetzung von Schleifen angeboten. Meistens wird dabei das Schlüsselwort "for" verwendet, gelegentlich auch "do" oder "while".
Beispiel: (C-Syntax)
for (int i = 0; i < 100; i++)
{
// Kommandos
};
Da dies aber keine Dokumentation über die Funktion von Programmiersprachen sein soll, wollen wir hier eher die Assembler-Äquivalente betrachten.
In Assembler gibt es diese tollen Sprachkonstrukte nämlich nicht. Dort verwendet man Sprünge (Jumps), um Schleifen zu realisieren.
Beispiel: (x86-Assembler) MOV eax, 100 // Startwert des Zählers (EAX) auf 100 setzen @Start: // Sprungmarke ... DEC eax // Den Zähler (EAX) um 1 herunterzählen JNZ Start // Vorgang von 'Start' wiederholen bis EAX Null ist.
Beispiel: (65c816-(SNES-)Assembler) LDX #$64 ; Setze X-Akkumulator (Zähler) auf 100 Start: ; Sprungmarke ... DEX ; Ziehe 1 von Zähler ab BNE Start ; springe zurück zum Start, wenn Zähler <> 0
Beispiel :(Z80GB-GB(C)-Assembler) ld a,$64 ; Setze das Register a (Zähler) auf 0x64 @Start: ; Sprungmarke ... dec a ; Dekrementiere den Zähler jr nz,@Start ; springe zurück zu @Start, wenn Zähler <> 0
Wie Schleifen in Assembler umgesetzt werden, ist aufgrund der hohen Flexibilität letztendlich dem Programmierer oder Hacker selbst überlassen. Für eine Beschreibung der jeweils verfügbaren Opcodes siehe die Artikel zu den entsprechenden Plattformen.

