Sprungadressen (Labels): Unterschied zwischen den Versionen

Aus C und Assembler mit Raspberry
KKeine Bearbeitungszusammenfassung
KKeine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
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:
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 ==
== 1. Benannte Labels ==
Zeile 18: Zeile 18:


=== Verwendung ===
=== Verwendung ===
* Ziel von Sprüngen (`b`, `bl`, `cbz`, `b.eq` etc.)
* Ziel von Sprüngen (<code>b</code>, <code>bl</code>, <code>cbz</code>, <code>b.eq</code> etc.)
* Definition von Daten im `.data`-Segment
* Definition von Daten im <code>.data</code>-Segment
* Symbolischer Zugriff durch Debugger oder Linker
* Symbolischer Zugriff durch Debugger oder Linker


Zeile 32: Zeile 32:
== 2. Numerische Labels ==
== 2. Numerische Labels ==


Numerische Labels bestehen nur aus einer Zahl, gefolgt von einem Doppelpunkt, z. B. `1:`, `2:` usw.
Numerische Labels bestehen nur aus einer Zahl, gefolgt von einem Doppelpunkt, z. B. <code>1:</code>, <code>2:</code> usw.


<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
Zeile 43: Zeile 43:
</syntaxhighlight>
</syntaxhighlight>


=== Verwendung von `f` und `b` ===
=== Verwendung von <code>f</code> und <code>b</code> ===


* `1f` – "1 forward": springt zum **nächsten** Vorkommen von `1:`
* <code>1f</code> – "1 forward": springt zum '''nächsten''' Vorkommen von <code>1:</code>
* `1b` – "1 backward": springt zum **vorherigen** Vorkommen von `1:`
* <code>1b</code> – "1 backward": springt zum '''vorherigen''' Vorkommen von <code>1:</code>


=== Typisches Beispiel für eine Schleife: ===
=== Typisches Beispiel für eine Schleife: ===
Zeile 61: Zeile 61:
== 3. Labels in Makros ==
== 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.
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.


<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
Zeile 73: Zeile 73:
</syntaxhighlight>
</syntaxhighlight>


== 4. Lokale Labels (`.L`) ==
== 4. Lokale Labels (<code>.L</code>) ==


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:
Labels, die mit <code>.L</code> 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:


<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
Zeile 88: Zeile 88:
! Label-Typ !! Beispiel !! Verwendung
! Label-Typ !! Beispiel !! Verwendung
|-
|-
| Benannter Label || `start:` || Für allgemeine Sprünge, Daten
| Benannter Label || <code>start:</code> || Für allgemeine Sprünge, Daten
|-
|-
| Numerischer Label || `1:` / `1f` / `1b` || Kurzzeitige Sprünge
| Numerischer Label || <code>1:</code> / <code>1f</code> / <code>1b</code> || Kurzzeitige Sprünge
|-
|-
| Lokaler Label || `.Lloop:` || Interner Sprung, nicht exportiert
| Lokaler Label || <code>.Lloop:</code> || Interner Sprung, nicht exportiert
|}
|}


Zeile 98: Zeile 98:
* Verwende numerische Labels für kurze Schleifen oder Sprungziele
* Verwende numerische Labels für kurze Schleifen oder Sprungziele
* Nutze benannte Labels für größere Strukturen und zur besseren Lesbarkeit
* Nutze benannte Labels für größere Strukturen und zur besseren Lesbarkeit
* Achte auf Mehrfachverwendungen in Makros – numerische Labels oder eindeutige `.L`-Labels helfen
* Achte auf Mehrfachverwendungen in Makros – numerische Labels oder eindeutige <code>.L</code>-Labels helfen

Version vom 11. April 2025, 10:32 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.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