Schleifen in Assembler
Wie in jeder anderen Programmiersprache auch, besitzt die Sprache Assembler Schleifenbefehle.
Eine Schleife in Assembler ist eine Kontrollstruktur, die wiederholt einen Anweisungsblock - den sogenannten Schleifenrumpf oder Schleifenkörper - durchführt, solange die Schleifenbedingung als Laufbedingung gültig bleibt bzw. als Abbruchbedingung nicht eintritt.
Eine Assembler Schleife, deren Schleifenbedingung immer zur Fortsetzung führt oder die keine Schleifenbedingung hat, wird als Endlosschleife bezeichnet.
FOR-Schleife mit dem Befehl loop realisieren
Eine mit FOR vergleichbare Schleife lässt sich mit loop realisieren:
loop adresse
Bei der Adresse handelt es sich um eine relative Adresse, die 8 Bit groß ist. Da das Offset deshalb nur einen Wert von -128 bis +127 einnehmen darf, kann eine Schleife maximal 128 Byte Code erhalten. Umgehen lässt sich diese Beschränkung, wenn man die Schleife mit den Befehlen der bedingten Sprünge konstruiert, beispielsweise mit einem Near Jump.
Die Anzahl der Schleifendurchgänge befindet sich immer im CX-Register (daher auch der Name „Counter Register“). Bei jedem Durchgang wird der Inhalt um 1 verringert. Ist der Inhalt des CX-Registers 0, wird die Schleife verlassen und der nächste Befehl bearbeitet.
Der Befehl ließe sich also auch mit der folgenden Befehlsfolge nachbilden:
dec cx jne adresse
Wenn der Schleifenzähler in einer Assembler Schleife um mehr als 1 verringert werden soll, kann der sub-Befehl verwendet werden. Wenn der Schleifenzähler um 2 oder 3 verringert wird, werden die meisten Assemblerprogrammierer stattdessen auf den dec-Befehl zurückgreifen, da dieser schneller als der sub-Befehl ist.
Assembler Schleife Beispiel
Das nachfolgende Programm ist eine Schleife, die dreimal durchgeführt wird:
xor cx,cx loop1 nop inc cx cmp cx,3 jle loop1
Weitere Schleifen in Assembler
Neben den normalen FOR-Schleifen existieren in den meisten Hochsprachen auch noch WHILE- oder „REPEAT ... UNTIL“-Schleifen.
Im Assembler kann dazu die loope (loop if equal) und loopne (loop if not equal) als Befehl benutzt werden. Beide Befehle prüfen nicht nur, ob das CX-Register den Wert 0 erreicht hat, sondern zusätzlich noch das Zeroflag.
Der loope-Befehl durchläuft die Schleife solange, wie der Zeroflag gesetzt ist, der loopne-Befehl dagegen, solange das Zeroflag ungleich 0 ist.
Weiterführende Artikel
- Numerische Werte in Assembler