Direktiven: Unterschied zwischen den Versionen

Aus C und Assembler mit Raspberry
Die Seite wurde neu angelegt: „* .data -> Dezimalzahl: Beginnt mit 1-9 und enthält 0-9 -> Oktalzahl: Beginnt mit 0 und enthält 0-7 -> Binärzahl: Beginnt mit 0b und enthält 0-1 -> Hexadezimal: Beginnt mit 0x und enthält 0-f -> Gleitkommawerte: Beginnt mit 0f oder 0e und enthält die Gleitkomma-Zahl -> Präfix: "-" nimmt das Zweierkomplement, "~" nimmt das Einerkompliment .byte -0xa3, -22, ~0b11010010 Directive Beschreibung .ascii Eine Zeichenfolge in doppelten Anführungszeichen…“
 
KKeine Bearbeitungszusammenfassung
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
* .data
== Was sind Direktiven? ==
-> Dezimalzahl: Beginnt mit 1-9 und enthält 0-9
 
-> Oktalzahl: Beginnt mit 0 und enthält 0-7
Direktiven (auch ''Pseudoinstruktionen'') sind spezielle Anweisungen für den Assembler. Sie erzeugen '''keinen Maschinencode''', sondern geben dem Assembler Informationen über Struktur, Speicherlayout, Initialwerte und mehr.
-> Binärzahl: Beginnt mit 0b und enthält 0-1
 
-> Hexadezimal: Beginnt mit 0x und enthält 0-f
== 1. Speicherbereiche ==
-> Gleitkommawerte: Beginnt mit 0f oder 0e und enthält die Gleitkomma-Zahl
 
-> Präfix: "-" nimmt das Zweierkomplement, "~" nimmt das Einerkompliment
=== .text ===
* Enthält ausführbaren Code.
* Typischerweise beginnt hier das Programm mit einem `_start:`-Label.
<syntaxhighlight lang="asm">
.text
.global _start
_start:
    mov x0, #1
    // ...
</syntaxhighlight>
 
=== .data ===
* Initialisierte Daten (z. B. Variablen mit Anfangswert).
* Wird zur Speicherung fester Werte oder Strings verwendet.
<syntaxhighlight lang="asm">
.data
myvalue: .word 42
</syntaxhighlight>
 
=== .bss ===
- Nicht initialisierte Daten (der Linker initialisiert sie mit 0).
<syntaxhighlight lang="asm">
.bss
.comm buffer, 64    // 64-Byte Puffer
</syntaxhighlight>
 
== 2. Datentyp-Direktiven ==
 
Diese Direktiven erzeugen Daten im Speicher.
 
{| class="wikitable"
! Direktive !! Beschreibung !! Beispiel
|-
| <code>.byte</code> || 8 Bit || <code>.byte 0xFF</code>
|-
| <code>.hword</code><br><code>.short</code> || 16 Bit (Halfword) || <code>.hword 0xABCD</code>
|-
| <code>.word</code> || 32 Bit || <code>.word 123456</code>
|-
| <code>.xword</code><br><code>.quad</code>  || 64 Bit || <code>.xword 0x123456789ABCDEF0</code>
|-
| <code>.octa</code> || 128 Bit || <code>.octa 0x123456789ABCDEF0123456789ABCDEF0</code>
|-
| <code>.float</code> || 32-Bit Gleitkommazahl || <code>.float 3.14</code>
|-
| <code>.double</code> || 64-Bit Gleitkommazahl || <code>.double 3.1415926</code>
|}
 
Da der Assembler verschiedene Zahlenformate kennt, müssen die Zahlenwerte einer bestimmten Form angegeben werden:
 
* Dezimalzahl: Beginnt mit 1-9 und enthält 0-9
* Oktalzahl: Beginnt mit 0 und enthält 0-7
* Binärzahl: Beginnt mit 0b und enthält 0-1
* Hexadezimal: Beginnt mit 0x und enthält 0-f
* Gleitkommawerte: Beginnt mit 0f oder 0e und enthält die Gleitkomma-Zahl
* Präfix: "-" nimmt das Zweierkomplement, "~" nimmt das Einerkompliment
: <syntaxhighlight lang="asm">
  .byte -0xa3, -22, ~0b11010010
  .byte -0xa3, -22, ~0b11010010
</syntaxhighlight>
== 3. Strings ==
=== .ascii ===
* ASCII-Zeichen '''ohne''' Null-Terminator.
=== .asciz / .string ===
* Null-terminierter String (enthält am Ende ein <code>\0</code>).
<syntaxhighlight lang="asm">
.data
msg1: .ascii "Hallo"
msg2: .asciz "Welt\n"
msg3: .string "Hallo 🌍\n"
</syntaxhighlight>
'''Sonderzeichen:'''
* <code>\n</code> → Neue Zeile
* <code>\t</code> → Tabulator
* <code>\b</code> → Backspace
* <code>\f</code> → Seitenvorschub
* <code>\r</code> → Return
* <code>\ddd</code> → Ein Okctaler ASCII code (ex \123)
* <code>\xdd</code> → Ein Hexadezimaler ASCII code (ex \x4F)
* <code>\\</code> → Backslash
* <code>\"</code> → Anführungszeichen
''Hinweis'': Bei UTF-8-Zeichen kann Encoding ein Problem darstellen.
== 4. Daten ausrichten: <code>.align</code> ==
- Richtet Daten im Speicher an Grenzen aus (2ⁿ).
- Beispiel: <code>.align 3</code> → richtet an 8-Byte-Grenze aus.
<syntaxhighlight lang="asm">
.data
.align 3
myvar: .xword 0x1234
</syntaxhighlight>
* Wichtig für Performance und korrekten Speicherzugriff.
* Besonders bei Arrays, Gleitkommazahlen oder strukturierter Daten wichtig.
== 5. Konstanten: <code>.equ</code> / <code>.set</code> ==
<syntaxhighlight lang="asm">
.equ LED_GPIO, 42
.set MAX_LEN, 128
mov x0, #LED_GPIO
</syntaxhighlight>
* Definiert symbolische Konstanten (wie <code>#define</code> in C).
* <code>.equ</code> und <code>.set</code> sind funktional gleichwertig.
== 6. Speicher reservieren ==
<syntaxhighlight lang="asm">
.skip 64    // Überspringt 64 Bytes
.space 128  // Reserviert 128 Bytes
.zero 32    // 32 Bytes mit Nullwert
</syntaxhighlight>


Directive Beschreibung
<code>.fill Anzahl, Größe, Inhalt</code>: Erzeugt einen Speicher mit dem "Inhalt" der "Größe" und "Anzahl".
.ascii Eine Zeichenfolge in doppelten Anführungszeichen
.asciz Eine mit 0 Bytes abgeschlossene ASCII-Zeichenfolge
.byte 1-byte Ganzzahl
.double Gleitkommawerte mit doppelter Genauigkeit
.float Gleitkommawerte
.octa 16-byte Ganzzahl
.quad 8-byte Ganzzahl
.short 2-byte Ganzzahl
.word 4-byte Ganzzahl


* Hilfreiche Direktiven:
== 7. Weitere nützliche Direktiven ==
.fill Anzahl, Größe, Inhalt: Erzeugt einen Speicher mit dem "Inhalt" der "Größe" und "Anzahl".
.rept Anzahl ... .endr: Wiederholt "Anzahl" den Inhalt von "..."


* ASCII-Strings
{| class="wikitable"
Escape Description
! Direktive !! Bedeutung
\b Backspace (ASCII code 8)
|-
\f Seitenvorschub (ASCII code 12)
| <code>.global</code> || Macht ein Symbol global (sichtbar für Linker)
\n Neue Zeile (ASCII code 10)
|-
\r Return (ASCII code 13)
| <code>.extern</code> || Verweist auf ein Symbol außerhalb der Datei
\t Tabulator (ASCII code 9)
|-
\ddd Ein Okctaler ASCII code (ex \123)
| <code>.type</code> || Setzt den Symboltyp, z. B. <code>@function</code>
\xdd Ein Hexadezimaler ASCII code (ex \x4F)
|-
\\ Das “\” Zeichen
| <code>.size</code> || Gibt die Größe eines Symbols an
\” Das Anführungszeichen
|-
| <code>.org</code> || Setzt die aktuelle Speicheradresse
|-
| <code>.include</code> || Fügt Quellcode aus anderer Datei ein
|-
| <code>.macro</code>, <code>.endm</code> || Makrodefinitionen für Wiederverwendung
|-
| <code>.rept Anzahl ... .endr</code> || Wiederholt "Anzahl" den Inhalt von "..."
|}


* Daten ausrichten
== Hinweise ==
.align Ausrichtung: Setzt den nächsten Wert auf ein "Ausrichtung" definierten Speicher.
* '''Trennung von Code und Daten''': Nutze <code>.text</code> für Code, <code>.data</code> für initialisierte Daten und <code>.bss</code> für nicht-initialisierte.
Beispiel:
* '''Lesbarkeit''': <code>.equ</code>-Konstanten erhöhen die Verständlichkeit deines Codes.
.byte 0xef
* '''Richtige Ausrichtung''' mit <code>.align</code> vermeidet unerwartete Fehler und verbessert die Performance.
.align 4 //Ausrichtung auf Wortbreite
.word 0x26ef43de

Aktuelle Version vom 11. April 2025, 07:43 Uhr

Was sind Direktiven?

Direktiven (auch Pseudoinstruktionen) sind spezielle Anweisungen für den Assembler. Sie erzeugen keinen Maschinencode, sondern geben dem Assembler Informationen über Struktur, Speicherlayout, Initialwerte und mehr.

1. Speicherbereiche

.text

  • Enthält ausführbaren Code.
  • Typischerweise beginnt hier das Programm mit einem `_start:`-Label.
.text
.global _start
_start:
    mov x0, #1
    // ...

.data

  • Initialisierte Daten (z. B. Variablen mit Anfangswert).
  • Wird zur Speicherung fester Werte oder Strings verwendet.
.data
myvalue: .word 42

.bss

- Nicht initialisierte Daten (der Linker initialisiert sie mit 0).

.bss
.comm buffer, 64    // 64-Byte Puffer

2. Datentyp-Direktiven

Diese Direktiven erzeugen Daten im Speicher.

Direktive Beschreibung Beispiel
.byte 8 Bit .byte 0xFF
.hword
.short
16 Bit (Halfword) .hword 0xABCD
.word 32 Bit .word 123456
.xword
.quad
64 Bit .xword 0x123456789ABCDEF0
.octa 128 Bit .octa 0x123456789ABCDEF0123456789ABCDEF0
.float 32-Bit Gleitkommazahl .float 3.14
.double 64-Bit Gleitkommazahl .double 3.1415926

Da der Assembler verschiedene Zahlenformate kennt, müssen die Zahlenwerte einer bestimmten Form angegeben werden:

  • Dezimalzahl: Beginnt mit 1-9 und enthält 0-9
  • Oktalzahl: Beginnt mit 0 und enthält 0-7
  • Binärzahl: Beginnt mit 0b und enthält 0-1
  • Hexadezimal: Beginnt mit 0x und enthält 0-f
  • Gleitkommawerte: Beginnt mit 0f oder 0e und enthält die Gleitkomma-Zahl
  • Präfix: "-" nimmt das Zweierkomplement, "~" nimmt das Einerkompliment
 .byte -0xa3, -22, ~0b11010010

3. Strings

.ascii

  • ASCII-Zeichen ohne Null-Terminator.

.asciz / .string

  • Null-terminierter String (enthält am Ende ein \0).


.data
msg1: .ascii "Hallo"
msg2: .asciz "Welt\n"
msg3: .string "Hallo 🌍\n"


Sonderzeichen:

  • \n → Neue Zeile
  • \t → Tabulator
  • \b → Backspace
  • \f → Seitenvorschub
  • \r → Return
  • \ddd → Ein Okctaler ASCII code (ex \123)
  • \xdd → Ein Hexadezimaler ASCII code (ex \x4F)
  • \\ → Backslash
  • \" → Anführungszeichen

Hinweis: Bei UTF-8-Zeichen kann Encoding ein Problem darstellen.

4. Daten ausrichten: .align

- Richtet Daten im Speicher an Grenzen aus (2ⁿ). - Beispiel: .align 3 → richtet an 8-Byte-Grenze aus.

.data
.align 3
myvar: .xword 0x1234
  • Wichtig für Performance und korrekten Speicherzugriff.
  • Besonders bei Arrays, Gleitkommazahlen oder strukturierter Daten wichtig.

5. Konstanten: .equ / .set

.equ LED_GPIO, 42
.set MAX_LEN, 128

mov x0, #LED_GPIO
  • Definiert symbolische Konstanten (wie #define in C).
  • .equ und .set sind funktional gleichwertig.

6. Speicher reservieren

.skip 64    // Überspringt 64 Bytes
.space 128  // Reserviert 128 Bytes
.zero 32    // 32 Bytes mit Nullwert

.fill Anzahl, Größe, Inhalt: Erzeugt einen Speicher mit dem "Inhalt" der "Größe" und "Anzahl".

7. Weitere nützliche Direktiven

Direktive Bedeutung
.global Macht ein Symbol global (sichtbar für Linker)
.extern Verweist auf ein Symbol außerhalb der Datei
.type Setzt den Symboltyp, z. B. @function
.size Gibt die Größe eines Symbols an
.org Setzt die aktuelle Speicheradresse
.include Fügt Quellcode aus anderer Datei ein
.macro, .endm Makrodefinitionen für Wiederverwendung
.rept Anzahl ... .endr Wiederholt "Anzahl" den Inhalt von "..."

Hinweise

  • Trennung von Code und Daten: Nutze .text für Code, .data für initialisierte Daten und .bss für nicht-initialisierte.
  • Lesbarkeit: .equ-Konstanten erhöhen die Verständlichkeit deines Codes.
  • Richtige Ausrichtung mit .align vermeidet unerwartete Fehler und verbessert die Performance.