Unbedingte Sprünge, wie der B
-Befehl (Branch), ändern den Programmfluss immer zu einer angegebenen Adresse, ohne Rücksicht auf etwaige Bedingungen. Das bedeutet, dass das Programm immer zu der angegebenen Stelle im Code springt, wenn dieser Befehl ausgeführt wird.
B <label>
Hierbei ist label
der Block, zu dem das Programm springen soll.
MOV R0, #3 @ Speichere die Zahl 3 in Register R0
MOV R1, #4 @ Speichere die Zahl 4 in Regster R1
B addierer @ Spring in Block "addierer"
MOV R3, #5 @ Dieser Befehl wird übersprungen
addierer:
ADD R2, R0, R1 @ Addiere die Werte 3 (R0) und 4 (R1) auf, speichere das Ergebnis in R2
In diesem Beispiel wird die Anweisung MOV R3, #5
nicht ausgeführt, weil der Befehl B addierer
die Ausführung des Programms direkt zur Sprungmarke addierer
weiterleitet. Sobald der Befehl B addierer
ausgeführt wird, springt das Programm sofort zum Block addierer
und die nachfolgende Anweisung (MOV R3, #5) wird übersprungen. Nach der Addition in addierer
wird das Programm beendet.
Der BX-Befehl (“Branch and Exchange”) wird verwendet, um zu einer Adresse zu springen, die in einem Register gespeichert ist.
BX <Register>
Hierbei ist <Register>
das Register, das die Adresse enthält, zu der gesprungen werden soll.
MOV R0, #3 @ Speichere die Zahl 3 in Register R0
MOV R1, #4 @ Speichere die Zahl 4 in Register R1
LDR R3, =seg2 @ Lade die Adresse des Blocks 'seg2' in Register R3
B seg1 @ Springe zu 'seg1'
seg2:
LDR R4, =ende @ Lade die Adresse des Blocks 'ende' in Register R4
BX R4 @ Springe zu 'ende' (die Adresse in R4)
seg1:
ADD R2, R0, R1 @ Addiere die Werte in R0 und R1, speichere das Ergebnis in R2
BX R3 @ Springe zur Adresse in R3 (zu Block 'seg2')
ende:
MOV R5, R2 @ Speichere das Ergebnis der Addition (R2) in R5
In diesem Beispiel zeigt der Code, wie mit B
und BX
verschiedene Blöcke angesprungen werden können. Der B-Befehl
springt bedingungslos zu einem Label, während BX
einen Sprung zur Adresse ermöglicht, die in einem Register gespeichert ist.
Der BL-Befehl (“Branch with Link”) ermöglicht es, zu einer bestimmten Speicheradresse oder einem Code-Block zu springen und gleichzeitig die Rücksprungadresse im Link-Register (LR) zu speichern. Dies ist besonders nützlich für Funktionsaufrufe, bei denen nach der Ausführung einer Funktion zum ursprünglichen Programmfluss zurückgekehrt werden soll.
BL <label>
Hierbei ist label
der Block, zu dem das Programm springen soll.
MOV R0, #3 @ Speichere die Zahl 3 in Register R0
MOV R1, #4 @ Speichere die Zahl 4 in Register R1
BL addierer @ Springe in Block "addierer" und speichere die Rücksprungadresse in LR
MOV R0, R2 @ Dieser Befehl wird ausgeführt, nachdem 'addierer' beendet ist
LDR R4, =ende @ Lade die Adresse des Blocks 'ende' in Register R4
BX R4 @ Springe zu Block 'ende'
addierer:
ADD R2, R0, R1 @ Addiere die Werte 3 (R0) und 4 (R1) auf, speichere das Ergebnis in R2
BX lr @ Springe zurück zur Adresse im LR (zurück zu MOV R0, R2)
ende:
In diesem Beispiel wird der Befehl BL addierer
verwendet, um in den Block addierer
zu springen und gleichzeitig die Adresse des nächsten Befehls (MOV R0, R2) im Link-Register (LR) zu speichern. Nach der Addition in addierer wird das Programm durch den Befehl BX lr
zur gespeicherten Adresse im Link-Register zurückgeleitet und MOV R0, R2 wird ausgeführt.
zurück | Hauptmenü | weiter |
3.1 Kontrollflussinstruktionen |
---|
3.1.1 Intro |
3.1.2 Unbedingte Sprünge |
3.1.3 Bedingte Sprünge |
3.1.4 Manipulation des Programmcounters (Übungsaufgabe) |