Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Programmflußsteuerung

Bei der Verarbeitung eines Programms wird mit jedem Befehl, der aus dem Speicher zur Ausführung in den Mikroprozessor gelesen wird, der Befehlszähler erhöht, so daß er beim nächsten Befehlsabruf den nächsten Befehl im Speicher adressiert. Diese Geradeausverarbeitung von Befehlsfolgen kann durch Sprungbefehle unterbrochen werden, die es erlauben, den Befehlszähler mit einer im Befehl angegebenen Sprungadresse zu laden und damit das Programm an anderer Stelle fortzusetzen. Je nachdem, ob der Sprung mit einer Bedingung verknüpft ist oder nicht, spricht man von einem bedingten bzw. unbedingten Sprung.

Unbedingter Sprung

Bild 3.4 zeigt die schematische Darstellung von drei Programmabschnitten mit unbedingten Sprüngen. Die Fälle a) und b) zeigen je drei in gleicher Weise gespeicherte Befehlsfolgen, die jedoch in unterschiedlicher Reihenfolge verarbeitet werden. Dargestellt sind Sprünge, deren Sprungadressen größer als die Adresse des Sprungbefehls sind (Vorwärts sprünge), und Sprünge, deren Sprungadressen kleiner als die Adresse des Sprungbefehls sind (Rückwärtssprünge). Fall c) enthält einen Rückwärtssprung auf eine bereits durchlaufene Befehlsfolge, wodurch eine Programmschleife gebildet wird. Ein Verlassen der Schleife ist wegen der Benutzung des unbedingten Sprungs durch das Programm selbst nicht möglich. Eine solche Endlosschleife kann nur durch eine Programmunterbrechung verlassen werden.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Bild 3.4. Durch unbedingte Sprünge verbundene Befehlsfolgen

Beispiel 3.5. Endlosschleife. An ein externes Datenregister EAREG sollen wiederholt und in möglichst kurzen Zeitabständen die Werte 0 und 1 ausgegeben werden (vgl. Programmbeispiel in Abschnitt 1.3.1). – Die wiederholte Ausgabe wird durch eine Endlosschleife mit dem JMP-Befehl gebildet. Um die Zeitabstände zwischen den einzelnen Ausgaben möglichst kurz zu halten, werden die Werte 0 und 1 im Registerspeicher bereitgestellt; ansonsten könnten sie auch als Direktoperanden in den MOVE-Befehlen der Endlosschleife angegeben werden.

Bedingter Sprung und einfache Verzweigung

Von Ausnahmen abgesehen, werden Programmschleifen nicht als Endlosschleifen programmiert, sondern so, daß sie in Abhängigkeit von einer Bedingung, z.B. nach einer bestimmten Anzahl von Schleifendurchläufen, wieder verlassen werden. Dazu dienen die bedingten Sprungbefehle Bcond, mit denen der Sprung in Abhängigkeit von einer im Befehl angegebenen Bedingung ausgeführt (Bedingung erfüllt) oder das Programm mit dem auf den Sprungbefehl folgenden Befehl fortgesetzt wird (Bedingung nicht erfüllt). Dadurch entsteht eine Verzweigung des Programmablaufs zu einem von zwei möglichen Programmpfaden. Sie wird als einfache Verzweigung bezeichnet.

Zur Überprüfung der Sprungbedingung werten die bedingten Sprungbefehle den Zustand der Bedingungsbits CC im Statusregister aus. Diese Bits werden durch die Ausführung fast aller Befehle beeinflußt, so daß sich fast alle Befehle zur Vorbereitung einer Programmverzweigung verwenden lassen. Insbesondere sind hierfür jedoch die Vergleichsbefehle CMP, BTST und TAS vorgesehen, bei denen das Ergebnis der Vergleichsoperation ausschließlich auf die Bedingungsbits wirkt. Für eine übersichtliche und sichere Programmierung sollte die Beeinflussung der Bedingungsbits immer durch einen Befehl unmittelbar vor dem Sprungbefehl erfolgen. Dazwischenliegende Befehle, die die Bedingungsbits erneut beeinflussen, können zu fehlerhaften Verzweigungen führen.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Im Flußdiagramm wird eine Programmverzweigung durch einen Rhombus mit Angabe der Sprungbedingung dargestellt (Bild 3.5a). Wird die Verzweigung durch einen Vergleichsbefehl vorbereitet, so wird dies durch ein Sechsecksymbol dargestellt (Bild 3.5b).

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Bild 3.5. Flußdiagrammdarstellung von Verzweigungen

Bild 3.6 zeigt drei wichtige Fälle von Verzweigungen in Flußdiagrammdarstellung. Im Fall a) wird bei erfüllter Bedingung eine Befehlsfolge übersprungen. Im Fall b) wird in Abhängigkeit der Bedingung eine von zwei Befehlsfolgen durchlaufen; für die anschließende Zusammenführung beider Pfade ist zusätzlich ein unbedingter Sprung erforderlich. Im Fallc) wird bei erfüllter Bedingung die vorangegangene Befehlsfolge erneut durchlaufen (Programmschleife).

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen
Bild 3.6. Beispiele für einfache Verzweigungen

Beim Aufbau einer Verzweigung müssen der bedingte Sprungbefehl, der dem Sprungbefehl vorangehende Befehl zur Vorbereitung der Verzweigung und der Datentyp der von diesem Befehl verarbeiteten Bedingungsgrößen aufeinander abgestimmt werden. Im folgenden betrachten wir einige Möglichkeiten zur Bildung einfacher Verzweigungen und unterscheiden dabei die Datentypen

  • Zweikomplementzahl,
  • Dualzahl und
  • logischer Vektor.

Arithmetische Bedingungsgrößen. Programmverzweigungen, bei denen die Bedingungsgrößen Zahlen sind, lassen sich bevorzugt mit dem CMP-Befehl vorbereiten. CMP vergleicht zwei Größen durch Subtraktion und beeinflußt mit dem Resultat sämtliche Bedingungsbits. Die Unterscheidung von Zweikomplementzahlen und Dualzahlen ergibt sich allein durch die Wahl des bedingten Sprungbefehls. Für die Abfrage bei Zweikomplementzahlen eignen sich alle Sprungbefehle, die die Bits N, Z oder V überprüfen. Für die Abfrage bei Dualzahlen eignen sich alle Sprungbefehle, die die Bits N, Z oder C überprüfen. Zur Erinnerung: das V-Bit zeigt Bereichsüberschreitungen bei Operationen mit Zweikomplementzahlen, das C-Bit bei Operationen mit Dualzahlen an.

Beispiel 3.6. Vergleich von 16-Bit-Zweikomplementzahlen. Eine im Speicher stehende 16-Bit-Zweikomplementzahl mit der Adresse ZAHL soll daraufhin überprüft werden, ob sie im Wertebereich O;2;ZAHL;2; 1000 liegt. – Der Vergleich mit den Bereichsgrenzen erfolgt durch den CMP-Befehl, dessen Wirkung auf die Bedingungsbits durch die bedingten Sprungbefehle BMI und BGT ausgewertet wird. BMI und BGT beziehen sich dabei auf die für die Behandlung von Zweikomplementzahlen zuständigen Bits N bzw. N und V.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Beispiel 3.6

Beispiel 3.7. Vergleich von Dualzahlen. Eine im Speicher stehende 8-Bit-Dualzahl mit der Adresse DUALZ soll daraufhin überprüft werden, ob sie im Bereich O~DUALZ~9 liegt. – Die Überprüfung der Bereichsgrenze 0 kann entfallen, da es sich beim Wert von DUALZ um eine vorzeichenlose Zahl handelt. Die Überprüfung der oberen Bereichsgrenze erfolgt durch den Vergleichsbefehl CMPB und den bedingten Sprungbefehl BRI. BRI bezieht sich auf die für die Behandlung von Dualzahlen zuständigen Bits Z und C.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Beispiel 3.7

Logische Bedingungsgrößen. In der Steuerungstechnik kommen oft Binärdaten vor, die zu logischen Vektoren (Bitketten) im Byte-, Wort- oder Doppelwortformat zusammengefaßt sind. So werden z.B. die Zustände von externen Schaltern durch die Werte einzelner Bits innerhalb eines Bytes dargestellt. Für die Abfrage einer oder mehrerer Bitpositionen eines solchen Vektors (zweiwertige Bedingungsgrößen) ist der BTST-Befehl vorgesehen. Dieser gibt in einer Maske entweder als Direktoperand (konstante Maske) oder als Registeroperand (variable Maske) – mit den auf 1 gesetzten Bits die zu testenden Bitpositionen vor. Der Test erfolgt durch Vergleich mit Null, wodurch das Bedingungsbit Z beeinflußt wird. Die Verzweigung kann dann mit einem der Sprungbefehle BEQ oder BNE erfolgen.

Beispiel 3.8. Abfrage von Einzelbitsignalen auf gleiche Zustände. Acht Einzelbitsignale sind über das externe Datenregister EASIG mit den acht niedrigerwertigen Datenleitungen des Datenbusses verbunden. Ein Programm soll an einer vorgegebenen Stelle in einer Warteschleife verharren, bis die Signale in den Bitpositionen 0,1 und 3 – unabhängig von den restlichen Signalen – den Zustand 1 aufweisen. – Da der BTSTB-Befehl einen Vergleich der maskierten Bitpositionen mit Null vornimmt, die Aufgabenstellung jedoch eine Abfrage auf 1-Zustände fordert, müssen die Signalwerte zuvor invertiert werden. Dazu werden sie zunächst in das Register RO geladen.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Beispiel 3.8

Läßt sich die Abfrage der maskierten Bits nicht einheitlich auf 0 bzw. nach der Inversion auf 1 durchführen, so muß anstelle des BTST-Befehls der CMPBefehl verwendet werden. Mit CMP läßt sich jedes beliebige Bitmuster als Vergleichsgröße vorgeben, jedoch muß die Maskierung mit dem AND-Befehl zusätzlich programmiert werden.

Beispiel 3.9. Abfrage von Einzelbitsignalen auf unterschiedliche Zustände. In Abänderung der Aufgabenstellung aus Beispiel 3.8 soll das Programm in einer Warteschleife verharren, bis das Signal 3 den Zustand 0 und die Signale 0 und 1 den Zustand 1 aufweisen. – Die Maskierung erfolgt in RO mit der Maske $OB. Die Werte der drei betreffenden Signalbits bleiben dabei erhalten, die restlichen Bits des niedrigerwertigen Registerbytes werden auf Null gesetzt. Diese O/1-Kombination in RO wird durch den CMPB-Befehl mit dem Bitmuster $03 verglichen.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Beispiel 3.9

Soll der Programmablauf durch eine Folge einzelner Bits gesteuert werden und sind diese Bits zu einem Operanden zusammengefaßt, so bieten sich die Schiebebefehle zur Vorbereitung der Programmverzweigung an. Durch das Schieben der Bits in die höchste Bitposition (Beeinflussung des N-Bits) oder in die CarryStelle (Beeinflussung des C-Bits), lassen sich Verzweigungen mit den Sprungbefehlen BPL und BMI bzw. BCC und BCS bilden. Verwendet man für das Schieben einen Rotationsbefehl, so bleibt die Bitfolge erhalten.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Beispiel 3.10. Steuerung des Programmflusses durch ein Bitmuster. Ein Programm soll in Abhängigkeit von den acht aufeinanderfolgenden Bits der Oj1-Kombination $5A zu den Programmpfaden NULL bzw. EINS verzweigen. Das Bitmuster soll, beginnend mit dem niedrigstwertigen Bit, in einer Endlosschleife ausgewertet werden. – Die Vorbereitung der Abfrage erfolgt mit dem Rotationsbefehl RORB, mit dem das niedrigstwertige Bit des in RO stehenden Bitmusters in die Carry-Stelle und gleichzeitig in die höchstwertige Bitposition von RO übertragen wird; abgefragt wird der Zustand des C-Bits durch den bedingten Sprungbefehl BCS.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Beispiel 3.10

Mehrfachverzweigungen

Folge von zweiwertigen Bedingungen. Häufig ist für jede der Bedingungsvorgaben ein eigener Programmpfad vorgesehen, und die Abfrage entscheidet durch eine Mehrfachverzweigung, ob dieser Pfad durchlaufen wird oder nicht. Beispiel 3.11 zeigt eine Mehrfachverzweigung, bei der wie in Beispiel 3.10 die Bits eines logischen Vektors als zweiwertige Bedingungsgrößen nacheinander ausgewertet werden.

Beispiel 3.11. Sequentielles Abfragen von zweiwertigen Bedingungen. Ein Datenbyte EASIG spiegelt die Zustände von acht Eingangssignalen wider. In Abhängigkeit vom Zustand 1 eines jeden Bits soll ein zugehöriger Programmpfad durchlaufen werden. Die Reihenfolge der Bearbeitung ist durch die Reihenfolge der Bits, beginnend mit dem höchstwertigen Bit, vorgegeben. – Der Inhalt von EASIG wird mit MOVEB in das Register RO geladen. Die Abfrage der einzelnen Bits erfolgt sequentiell durch den bedingten Sprungbefehl BM!. Dieser wertet das Vorzeichenbit N des zuvor erzeugten Resultats aus. Vor der ersten Abfrage wird N durch den MOVEB-Befehl, vor den weiteren Abfragen durch je eine I-Bit-Linksverschiebung in RO beeinflußt. Da der logische Schiebebefehl LSLB verwendet wird, geht das in RO stehende Bitmuster verloren. Es wird jedoch mit jedem Sprung zur Adresse LOOP mit den aktuellen Signalzuständen neu geladen

Beispiel 3.11

Verknüpfung von zweiwertigen Bedingungen. Bedingungsvorgaben, bei denen mehrere Bedingungen miteinander logisch verknüpft werden, führen ebenfalls zu Mehrfachverzweigungen. Bild 3.7 zeigt dazu drei Beispiele, in denen zwei zweiwertige Bedingungen B1 und B2 durch die logischen Operatoren und, oder und äquivalent miteinander verknüpft werden und mit den Aussagen true und false auf jeweils einen von zwei Programmpfaden verzweigen. Beispiel 3.12 zeigt ein Programm, bei dem auf einen von drei möglichen Programmpfaden verzweigt wird.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Bild 3.7. Mehrfachverzweigungen durch Verknüpfung von zweiwertigen Bedingungen

Beispiel 3.12. Mehrfachverzweigungen durch Verknöpfung von Bedingungen. Zwei Zweikomplementzahlen sollen miteinander verglichen werden. Je nach Erfüllung der Bedingungen A kleiner, gleich oder größer B soll zu einem von drei möglichen Programmpfaden verzweigt werden. – Für die Abfragevorbereitung genügt ein einziger CMP-Befehl, da die von ihm beeinflußten Bedingungsbits durch den BLT-Befehl der ersten Abfrage nicht verändert werden.

Beispiel 3.12

Mehrwertige Bedingung. Eine Mehrfachverzweigung erhält man auch dann, wenn eine einzelne Bedingungsgröße mehr als zwei Werte annehmen kann und diese als unterschiedliche Verzweigungskriterien ausgewertet werden (mehrwertige Bedingungsgröße). Überlicherweise handelt es sich hierbei um fortlaufende Werte positiver ganzer Zahlen.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Bild 3.8. Baumförmige Auswertung einer mehrwertigen Bedingungsgröße

Grundsätzlich kann das Abfragen des Bedingungswertes sequentiell erfolgen, wobei die Einzelabfragen durch CMP-Befehle vorbereitet werden (sequentielles Verzweigen). Dieses Verfahren ist durch die Anzahl der Abfragen, die im ungünstigsten Fall gleich der Anzahl der möglichen Werte ist, sehr zeitaufwendig. Eine effizientere Programmierungstechnik zeigt Bild 3.8. Hier werden die Bits der Bedingungsgröße baumförmig ausgewertet, wodurch die Anzahl der Abfragen immer gleich der Anzahl der für die Wertedarstellung erforderlichen Bits ist (binäres Verzweigen). Die Abfragen können durch BTST-Befehle vorbereitet werden. Gegenüber dem sequentiellen Verzweigen wird das Programm unübersichtlicher. Bild 3.8 zeigt den Fall einer 2-Bit-Bedingungsgröße, die die Werte Obis 3 annehmen kann.

Eine weitere Möglichkeit der Programmierung von Mehrfachverzweigungen mit einer mehrwertigen Bedingungsgröße bietet die Verwendung des JMP-Befehls mit z.B. registerindirekter Adressierung des Sprungziels. Hierbei wird das Adreßregister zunächst mit der Anfangsadresse einer sogenannten Sprungtabelle geladen, die ihrerseits die Adressen der einzelnen Programmpfade enthält. Vor der Ausführung des Sprungbefehls wird der Registerinhalt durch Addition der Bedingungsgröße so verändert, daß er in der Sprungtabelle auf die der Verzweigung entsprechende Zieladresse zeigt. Die Verzweigung erfolgt allein durch den JMPBefehl; eine mehrschrittige Bedingungsabfrage entfällt.

Beispiel 3.13. Mehrfachverzweigung mit SprungtabeUe. In Abhängigkeit von einer Bedingungsgröße COND, die die Werte 0, 1, 2 und 3 annehmen kann, soll eine Mehrfachverzweigung zu einem von vier möglichen Programmpfaden mit den Adressen NULL, EINS, ZWEI und DREI durchgeführt werden. – Die Sprungtabelle SPRTAB mit den Zieladressen NULL, EINS, ZWEI und DREI wird durch DCW-Anweisungen vorgegeben. Die Verzweigung erfolgt durch registerindirekte Adressierung im IMP-Befehl mit RO als Adreßregister. RO wird zunächst mit der Anfangsadresse der Sprungtabelle SPRTAB geladen und anschließend um den doppelten Wert der Bedingungsgröße COND erhöht. Die Verdopplung ist notwendig, da die Adreßeintragungen in der Sprungtabelle jeweils ein Wort umfassen; sie wird durch eine arithmetische l-Bit-Linksverschiebung vorgenommen.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Beispiel 3.13

Anstelle der registerindirekten Adressierung kann auch die indizierte Adressierung verwendet werden. In diesem Fall besteht die Sprungtabelle aus JMPBefehlen, die die Sprunge zu den einzelnen Programmpfaden ausführen. Als Basisadresse für die Indizierung dient die Anfangsadresse der Sprungtabelle; die Distanz im Indexregister wird aus der Bedingungsgröße gebildet. Die Verzweigung erfolgt durch einen zweifachen Sprung.

Programmschleifen

Wie bereits eingangs dieses Abschnittes beschrieben, bezeichnet man eine Befehlsfolge, die wiederholt durchlaufen wird, als Programmschleife. Die Schleifenbildung erfolgt durch einen Sprungbefehl am Ende der Befehlsfolge, der auf ihren Anfang zurückführt. Enthält diese Befehlsfolge nur einen unbedingten Sprungbefehl, so handelt es sich um eine Endlosschleife; sie kann nur über eine Programmunterbrechung verlassen werden. Enthält die Befehlsfolge mindestens einen bedingten Sprungbefehl, so ist das Verlassen der Schleife von der Bedingung abhängig. Bild 3.9 zeigt zwei grundsätzliche Schleifenformen, bei denen der bedingte Sprungbefehl a) am Ende bzw. b) am Anfang der Befehlsfolge steht. Hierbei ergeben sich komplementäre Bedingungsvorgaben: Im Fall a) wird die Schleife bei nicht erfüllter Bedingung und im Fall b) bei erfüllter Bedingung verlassen. Im Fall b) ist ein zusätzlicher unbedingter Sprung zur Schleifenbildung erforderlich.

Ein weiteres Unterscheidungsmerkmal von Programmschleifen ist die Vorgabe der Anzahl von Schleifendurchläufen. Sie kann entweder induktiv oder iterativ erfolgen.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Bild 3.9 Programmschleife. a) mit nachgestellter Bedingungsabfrage, b) mit vorangestellter Bedingungsabfrage

Induktive Schleifen. Bei induktiven Programmschleifen ist die Anzahl der Schleifendurchläufe beim Eintritt in die Schleife bekannt und vom Verarbeitungsvorgang in der Schleife unabhängig. Zur Zählung der Schleifendurchläufe wird eine Laufvariable eingeführt. Sie wird vor dem Eintritt in die Schleife initialisiert, mit jedem Schleifendurchlauf verändert und in der Bedingungsabfrage als Abbruchkriterium ausgewertet. Dabei ergeben sich zwei unterschiedliche Organisationsformen: 1. Die Laufvariable wird mit Null oder Eins initialisiert, mit jedem Schleifendurchlauf um Eins erhöht und in der Bedingungsabfrage mit der vorgegebenen Anzahl von Schleifendurchläufen verglichen (aufwärtszählende Schleife). 2. Die Laufvariable wird mit der Anzahl von Schleifendurchläufen initialisiert, mit jedem Schleifendurchlauf um Eins vermindert und in der Bedingungsabfrage mit Null oder Eins verglichen (abwärtszählende Schleife). Man bezeichnet induktive Schleifen auch als Zählschleifen.

Beispiel 3.14. Induktive Schleife mit aufwärtszählender Laufvariablen. Es sollen die natürlichen Zahlen 1 bis N summiert und das Resultat der Variablen SUM zugewiesen werden. N wird über ein externes 16-Bit-Datenregister EAREG vorgegeben (vgl. Beispiel 3.1 und Bild 3.2). – Zur Zählung der Schleifendurchläufe wird die Variable I eingeführt. Sie wird mit Eins initialisiert und mit jedem Durchlauf um Eins erhöht. Da sie in jedem Durchlauf gerade den Wert des jeweiligen Summanden aufweist, wird sie zur Summenbildung benutzt. Die eigentliche Summation erfolgt in Rl ; die dabei auftretenden Überträge werden in RO summiert, so daß das Resultat als Doppelwort entsteht. I und N stehen hier zur Veranschaulichung im Speicher; für eine effizientere Programmierung würde man sie wie im folgenden Beispiel wegen des häufigen Zugriffs im Registerspeicher halten .•

Beispiel 3.14

Beispiel 3.15. Induktive Schleife mit abwärtszählender Laufvariablen. Es sollen 100 16-BitDualzahlen, die in einem Datenblock FELD stehen, summiert und das Resultat der Variablen SUM zugewiesen werden. – Die Zählung erfolgt durch eine in R2 gespeicherte Laufvariable, die mit dem Wert 100 initialisiert und bei jedem Schleifendurchlauf um Eins vermindert wird. Gegenüber Beispiel 3.14 entfällt der CMP-Befehl, da sich die Abfrage auf Null auf das Resultat des DEC-Befehls bezieht. Für die Adressierung der Feldelemente wird mit LEA die Feldanfangsadresse nach R3 geladen und die Autoinkrement-Adressierung verwendet.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Beispiel 3.15

Iterative Schleifen. Bei iterativen Programm schleifen ist die Anzahl der Schleifendurchläufe beim Eintritt in die Schleife nicht bekannt, sondern hängt vom Resultat des Verarbeitungsvorgangs in der Schleife ab. Zur Bedingungsvorgabe für den Schleifenabbruch werden eine Rechengröße und eine Vergleichsgröße verwendet, wobei die Vergleichsgröße eine Konstante oder eine Variable sein kann. Bei Schleifen mit vorangestellter Bedingungsabfrage ist dabei zu beachten, daß die Größen vor dem Eintritt in die Schleife initialisiert sein müssen, um beim ersten Durchlauf einen definierten Abfragezustand zu haben.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Iterative Schleifen enden nicht immer in einem Schleifenabbruch, und zwar dann nicht, wenn die Iteration nicht konvergiert. Wenn dieser Fall aufgrund der Aufgabenstellung auftreten kann, ist es notwendig, die Iterationsbedingung durch eine Induktionsbedingung zur Begrenzung der Anzahl von Schleifendurchläufen zu ergänzen. Damit enthält die Schleife für den Schleifenabbruch zwei Bedingungsabfragen, die in verschiedener Weise – vorangestellt oder nachgestellt – miteinander kombiniert werden können.

Beispiel 3.16. Iterative Schleife mit zusätzlicher induktiver Begrenzung der Schleifenanzahl. Ein Pufferbereich BUFFER mit N = 512 ASCII-Zeichen soll nach einem bestimmten Zeichen, das sich in der Speicherzelle CHAR befindet, durchsucht werden. Beim Auffinden dieses Zeichens oder nach der durch die Pufferlänge N vorgegebenen maximalen Anzahl von Suchschritten soll der Suchvorgang abgebrochen werden. – Der Zeichenvergleich erfolgt in einer Programmschleife mit iterativem Schleifenabbruch bei Gleichheit zweier Zeichen oder induktivem Schleifenabbruch nach N Suchschritten. Zur Adressierung des Puffers wird zu Beginn die um Eins erhöhte höchste Pufferadresse BUFFER + N nach R3 geladen, die dann durch die Autodekrement-Adressierung im Vergleichsbefehl CMPB bei jedem Schleifendurchlauf um Eins vermindert wird. Der Suchvorgang beginnt dementsprechend mit dem letzten Zeichen des Pufferbereichs. Bei einem iterativen Schleifenabbruch zeigt das Zählregister RO die Position des gefundenen Zeichens im Puffer an, bei einem induktiven Schleifenabbruch enthält RO den Wert Null.

Programmflußsteuerung: Unbedingter Sprung, Durch unbedingte Sprünge, Flußdiagrammdarstellung von Verzweigungen

Beispiel 3.16

Like this post? Please share to your friends:
Schreibe einen Kommentar

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: