Direktiven: Unterschied zwischen den Versionen
Aus C und Assembler mit Raspberry
KKeine Bearbeitungszusammenfassung |
KKeine Bearbeitungszusammenfassung |
||
| (Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
| Zeile 40: | Zeile 40: | ||
| <code>.byte</code> || 8 Bit || <code>.byte 0xFF</code> | | <code>.byte</code> || 8 Bit || <code>.byte 0xFF</code> | ||
|- | |- | ||
| <code>.hword</code> || 16 Bit (Halfword) || <code>.hword 0xABCD</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>.word</code> || 32 Bit || <code>.word 123456</code> | ||
|- | |- | ||
| <code>.xword</code> || 64 Bit || <code>.xword 0x123456789ABCDEF0</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>.float</code> || 32-Bit Gleitkommazahl || <code>.float 3.14</code> | ||
| Zeile 51: | Zeile 53: | ||
|} | |} | ||
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 | |||
</syntaxhighlight> | |||
== 3. Strings == | == 3. Strings == | ||
| Zeile 72: | Zeile 85: | ||
* <code>\n</code> → Neue Zeile | * <code>\n</code> → Neue Zeile | ||
* <code>\t</code> → Tabulator | * <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> → Backslash | ||
* <code>\"</code> → Anführungszeichen | * <code>\"</code> → Anführungszeichen | ||
| Zeile 110: | Zeile 128: | ||
.zero 32 // 32 Bytes mit Nullwert | .zero 32 // 32 Bytes mit Nullwert | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<code>.fill Anzahl, Größe, Inhalt</code>: Erzeugt einen Speicher mit dem "Inhalt" der "Größe" und "Anzahl". | |||
== 7. Weitere nützliche Direktiven == | == 7. Weitere nützliche Direktiven == | ||
| Zeile 129: | Zeile 149: | ||
|- | |- | ||
| <code>.macro</code>, <code>.endm</code> || Makrodefinitionen für Wiederverwendung | | <code>.macro</code>, <code>.endm</code> || Makrodefinitionen für Wiederverwendung | ||
|- | |||
| <code>.rept Anzahl ... .endr</code> || Wiederholt "Anzahl" den Inhalt von "..." | |||
|} | |} | ||
== | == Hinweise == | ||
* '''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. | * '''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. | ||
* '''Lesbarkeit''': <code>.equ</code>-Konstanten erhöhen die Verständlichkeit deines Codes. | * '''Lesbarkeit''': <code>.equ</code>-Konstanten erhöhen die Verständlichkeit deines Codes. | ||
* '''Richtige Ausrichtung''' mit <code>.align</code> vermeidet unerwartete Fehler und verbessert die Performance. | * '''Richtige Ausrichtung''' mit <code>.align</code> vermeidet unerwartete Fehler und verbessert die Performance. | ||
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
#definein C). .equund.setsind 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
.textfür Code,.datafür initialisierte Daten und.bssfür nicht-initialisierte. - Lesbarkeit:
.equ-Konstanten erhöhen die Verständlichkeit deines Codes. - Richtige Ausrichtung mit
.alignvermeidet unerwartete Fehler und verbessert die Performance.