Sprungadressen (Labels): Unterschied zwischen den Versionen
KKeine Bearbeitungszusammenfassung |
|||
| Zeile 62: | Zeile 62: | ||
Innerhalb von Makros sind benannte Labels problematisch, da sie mehrfach verwendet werden können und zu Konflikten führen. Deshalb sind numerische Labels oder lokale Labels mit eindeutigen Suffixen (z. B. <code>\@</code>) üblich. | Innerhalb von Makros sind benannte Labels problematisch, da sie mehrfach verwendet werden können und zu Konflikten führen. Deshalb sind numerische Labels oder lokale Labels mit eindeutigen Suffixen (z. B. <code>\@</code>) üblich. | ||
=== Lösung 1: Verwende numerische Labels === | |||
<syntaxhighlight lang="asm"> | <syntaxhighlight lang="asm"> | ||
.macro | .macro blink delay | ||
1: | 1: | ||
nop | |||
subs \ | subs \delay, \delay, #1 | ||
bne 1b | bne 1b | ||
.endm | |||
</syntaxhighlight> | |||
=== Lösung 2: Mit <code>\@</code> für eindeutige Labels === | |||
<syntaxhighlight lang="asm"> | |||
.macro wait_loop delay | |||
loop\@: | |||
subs \delay, \delay, #1 | |||
bne loop\@ | |||
.endm | .endm | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Aktuelle Version vom 11. April 2025, 10:38 Uhr
Labels sind Bezeichner für Adressen im Code oder in den Datenabschnitten. Sie dienen vor allem dazu, Sprünge, Verzweigungen und Datenzugriffe lesbar und wartbar zu gestalten. Es gibt zwei Hauptarten von Labels:
1. Benannte Labels
Ein benannter Label ist ein selbstgewählter Name, der mit einem Doppelpunkt abgeschlossen wird:
loop_start:
// Anweisungen
b loop_start // Sprung zurück zu loop_start
Eigenschaften
- Müssen mit einem Buchstaben oder Unterstrich beginnen
- Können Buchstaben, Zahlen und Unterstriche enthalten
- Dürfen nicht mit einer Zahl beginnen
- Groß- und Kleinschreibung wird unterschieden
Verwendung
- Ziel von Sprüngen (
b,bl,cbz,b.eqetc.) - Definition von Daten im
.data-Segment - Symbolischer Zugriff durch Debugger oder Linker
.data
message:
.asciz "Hallo Welt"
.text
ldr x0, =message
2. Numerische Labels
Numerische Labels bestehen nur aus einer Zahl, gefolgt von einem Doppelpunkt, z. B. 1:, 2: usw.
1:
// Code
b 1f // "1f" = nächstes Vorkommen von Label 1
...
1:
// Ziel von 1f
Verwendung von f und b
1f– "1 forward": springt zum nächsten Vorkommen von1:1b– "1 backward": springt zum vorherigen Vorkommen von1:
Typisches Beispiel für eine Schleife:
mov x0, #5
1:
// irgendeine Operation
subs x0, x0, #1
bne 1b // zurück zum letzten Label 1
3. Labels in Makros
Innerhalb von Makros sind benannte Labels problematisch, da sie mehrfach verwendet werden können und zu Konflikten führen. Deshalb sind numerische Labels oder lokale Labels mit eindeutigen Suffixen (z. B. \@) üblich.
Lösung 1: Verwende numerische Labels
.macro blink delay
1:
nop
subs \delay, \delay, #1
bne 1b
.endm
Lösung 2: Mit \@ für eindeutige Labels
.macro wait_loop delay
loop\@:
subs \delay, \delay, #1
bne loop\@
.endm
4. Lokale Labels (.L)
Labels, die mit .L beginnen, sind lokale Labels, die vom Linker ignoriert und nicht exportiert werden. Diese werden meist vom Compiler automatisch erzeugt, können aber auch manuell verwendet werden:
b .Lskip
// Code wird übersprungen
.Lskip:
Zusammenfassung
| Label-Typ | Beispiel | Verwendung |
|---|---|---|
| Benannter Label | start: |
Für allgemeine Sprünge, Daten |
| Numerischer Label | 1: / 1f / 1b |
Kurzzeitige Sprünge |
| Lokaler Label | .Lloop: |
Interner Sprung, nicht exportiert |
Tipps
- Verwende numerische Labels für kurze Schleifen oder Sprungziele
- Nutze benannte Labels für größere Strukturen und zur besseren Lesbarkeit
- Achte auf Mehrfachverwendungen in Makros – numerische Labels oder eindeutige
.L-Labels helfen