Sprungadressen (Labels)

Aus C und Assembler mit Raspberry
Version vom 11. April 2025, 10:23 Uhr von Satyria (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „= Labels im ARM64-Assembler = 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: <syntaxhighlight lang="asm"> loop_start: // Anweisungen b loop_start // Sp…“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

Labels im ARM64-Assembler

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.eq` etc.)
  • 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 von `1:`
  • `1b` – "1 backward": springt zum **vorherigen** Vorkommen von `1:`

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.

.macro repeat_loop count
    mov \count, #3
1:
    // irgendwas tun
    subs \count, \count, #1
    bne 1b
.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