Sprungadressen (Labels): Unterschied zwischen den Versionen

Aus C und Assembler mit Raspberry
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…“
 
 
(2 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
= 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:
 
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 20: 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 34: 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 45: 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 63: 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.
 
=== Lösung 1: Verwende numerische Labels ===


<syntaxhighlight lang="asm">
<syntaxhighlight lang="asm">
.macro repeat_loop count
.macro blink delay
    mov \count, #3
1:
1:
     // irgendwas tun
     nop
     subs \count, \count, #1
     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>


== 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 90: Zeile 97:
! 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 100: Zeile 107:
* 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

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.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.

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