Lade- und Speicheranweisungen: Unterschied zwischen den Versionen
Aus C und Assembler mit Raspberry
KKeine Bearbeitungszusammenfassung |
|||
| (Eine dazwischenliegende Version desselben Benutzers wird nicht angezeigt) | |||
| Zeile 8: | Zeile 8: | ||
* LDR (Load Register): | * LDR (Load Register): | ||
: Format: < | : Format: <syntaxhighlight lang="asm" inline>LDR <Rt>, [<Rn>, #<imm>]</syntaxhighlight> | ||
: Beispiel: < | : Beispiel: <syntaxhighlight lang="asm" inline>LDR X0, [X1, #8]</syntaxhighlight> | ||
: Erklärung: Lädt den Wert, der sich 8 Bytes nach der Adresse in < | : Erklärung: Lädt den Wert, der sich 8 Bytes nach der Adresse in <syntaxhighlight lang="asm" inline>X1</syntaxhighlight> befindet, in das Register <syntaxhighlight lang="asm" inline>X0</syntaxhighlight>. | ||
* LDRB (Load Register Byte): | * LDRB (Load Register Byte): | ||
: Format: < | : Format: <syntaxhighlight lang="asm" inline>LDRB <Rt>, [<Rn>, #<imm>]</syntaxhighlight> | ||
: Beispiel: < | : Beispiel: <syntaxhighlight lang="asm" inline>LDRB W0, [X1, #2]</syntaxhighlight> | ||
: Erklärung: Lädt ein Byte, das sich 2 Bytes nach der Adresse in < | : Erklärung: Lädt ein Byte, das sich 2 Bytes nach der Adresse in <syntaxhighlight lang="asm" inline>X1</syntaxhighlight> befindet, in das Register <syntaxhighlight lang="asm" inline>W0</syntaxhighlight>. | ||
* LDRH (Load Register Halfword): | * LDRH (Load Register Halfword): | ||
: Format: < | : Format: <syntaxhighlight lang="asm" inline>LDRH <Rt>, [<Rn>, #<imm>]</syntaxhighlight> | ||
: Beispiel: < | : Beispiel: <syntaxhighlight lang="asm" inline>LDRH W0, [X1, #4]</syntaxhighlight> | ||
: Erklärung: Lädt ein Halbwort (16 Bit), das sich 4 Bytes nach der Adresse in < | : Erklärung: Lädt ein Halbwort (16 Bit), das sich 4 Bytes nach der Adresse in <syntaxhighlight lang="asm" inline>X1</syntaxhighlight> befindet, in das Register <syntaxhighlight lang="asm" inline>W0</syntaxhighlight>. | ||
* LDP (Load Pair): | * LDP (Load Pair): | ||
: Format: < | : Format: <syntaxhighlight lang="asm" inline>LDP <Rt>, <Rt2>, [<Rn>, #<imm>]</syntaxhighlight> | ||
: Beispiel: < | : Beispiel: <syntaxhighlight lang="asm" inline>LDP X0, X1, [X2, #16]</syntaxhighlight> | ||
: Erklärung: Lädt zwei aufeinanderfolgende Register (< | : Erklärung: Lädt zwei aufeinanderfolgende Register (<syntaxhighlight lang="asm" inline>X0</syntaxhighlight> und <syntaxhighlight lang="asm" inline>X1</syntaxhighlight>) aus dem Speicher, beginnend bei der Adresse, die 16 Bytes nach dem Wert in <syntaxhighlight lang="asm" inline>X2</syntaxhighlight> liegt. | ||
== Stores (Schreiboperationen) == | == Stores (Schreiboperationen) == | ||
| Zeile 31: | Zeile 31: | ||
* STR (Store Register): | * STR (Store Register): | ||
: Format: < | : Format: <syntaxhighlight lang="asm" inline>STR <Rt>, [<Rn>, #<imm>]</syntaxhighlight> | ||
: Beispiel: < | : Beispiel: <syntaxhighlight lang="asm" inline>STR X0, [X1, #8]</syntaxhighlight> | ||
: Erklärung: Speichert den Wert in < | : Erklärung: Speichert den Wert in <syntaxhighlight lang="asm" inline>X0</syntaxhighlight> an die Adresse, die 8 Bytes nach der Adresse in <syntaxhighlight lang="asm" inline>X1</syntaxhighlight> liegt. | ||
* STRB (Store Register Byte): | * STRB (Store Register Byte): | ||
: Format: < | : Format: <syntaxhighlight lang="asm" inline>STRB <Rt>, [<Rn>, #<imm>]</syntaxhighlight> | ||
: Beispiel: < | : Beispiel: <syntaxhighlight lang="asm" inline>STRB W0, [X1, #2]</syntaxhighlight> | ||
: Erklärung: Speichert ein Byte aus < | : Erklärung: Speichert ein Byte aus <syntaxhighlight lang="asm" inline>W0</syntaxhighlight> an die Adresse, die sich 2 Bytes nach <syntaxhighlight lang="asm" inline>X1</syntaxhighlight> befindet. | ||
* STRH (Store Register Halfword): | * STRH (Store Register Halfword): | ||
: Format: < | : Format: <syntaxhighlight lang="asm" inline>STRH <Rt>, [<Rn>, #<imm>]</syntaxhighlight> | ||
: Beispiel: < | : Beispiel: <syntaxhighlight lang="asm" inline>STRH W0, [X1, #4]</syntaxhighlight> | ||
: Erklärung: Speichert ein Halbwort aus < | : Erklärung: Speichert ein Halbwort aus <syntaxhighlight lang="asm" inline>W0</syntaxhighlight> an die Adresse, die sich 4 Bytes nach <syntaxhighlight lang="asm" inline>X1</syntaxhighlight> befindet. | ||
* STP (Store Pair): | * STP (Store Pair): | ||
: Format: < | : Format: <syntaxhighlight lang="asm" inline>STP <Rt>, <Rt2>, [<Rn>, #<imm>]</syntaxhighlight> | ||
: Beispiel: < | : Beispiel: <syntaxhighlight lang="asm" inline>STP X0, X1, [X2, #16]</syntaxhighlight> | ||
: Erklärung: Speichert zwei aufeinanderfolgende Register (< | : Erklärung: Speichert zwei aufeinanderfolgende Register (<syntaxhighlight lang="asm" inline>X0</syntaxhighlight> und <syntaxhighlight lang="asm" inline>X1</syntaxhighlight>) in den Speicher, beginnend bei der Adresse, die 16 Bytes nach dem Wert in <syntaxhighlight lang="asm" inline>X2</syntaxhighlight> liegt. | ||
== Atomare Operationen == | == Atomare Operationen == | ||
| Zeile 55: | Zeile 55: | ||
* LDXR/STXR (Exclusive Load/Store Register): | * LDXR/STXR (Exclusive Load/Store Register): | ||
: Format (LDXR): <syntaxhighlight lang="asm" inline>LDXR <Rt>, [<Rn>]</syntaxhighlight> | : Format (LDXR): <syntaxhighlight lang="asm" inline>LDXR <Rt>, [<Rn>]</syntaxhighlight> | ||
: Format (STXR): < | : Format (STXR): <syntaxhighlight lang="asm" inline>STXR <Ws>, <Rt>, [<Rn>]</syntaxhighlight> | ||
: Beispiel: | : Beispiel: | ||
:<syntaxhighlight lang="asm"> | :<syntaxhighlight lang="asm"> | ||
| Zeile 61: | Zeile 61: | ||
STXR W2, X0, [X1] | STXR W2, X0, [X1] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
: Erklärung: < | : Erklärung: <syntaxhighlight lang="asm" inline>LDXR</syntaxhighlight> lädt den Wert aus der Adresse <syntaxhighlight lang="asm" inline>X1</syntaxhighlight> in <syntaxhighlight lang="asm" inline>X0</syntaxhighlight>. <syntaxhighlight lang="asm" inline>STXR</syntaxhighlight> speichert den Wert von <syntaxhighlight lang="asm" inline>X0</syntaxhighlight> an die Adresse <syntaxhighlight lang="asm" inline>X1</syntaxhighlight> und setzt <syntaxhighlight lang="asm" inline>W2</syntaxhighlight> auf 0, wenn der Store erfolgreich war. | ||
Aktuelle Version vom 26. September 2024, 12:43 Uhr
Die "Lade- und Speicheranweisungen" im ARMv8 sind essenziell für den Zugriff auf den Speicher, sowohl um Daten zu lesen (Load) als auch zu schreiben (Store). Diese Anweisungen sind entscheidend für jede Art von Datenverarbeitung.
Grundlegendes
In der ARMv8-Architektur bedeutet "Load" das Laden von Daten aus dem Speicher in Register, während "Store" das Schreiben von Daten aus Register in den Speicher bedeutet. Dabei unterstützen "Loads and Stores" verschiedene Datenformate und Adressierungsmodi.
Loads (Leseoperationen)
Hier sind einige der wichtigsten Load-Instruktionen:
- LDR (Load Register):
- Format:
LDR <Rt>, [<Rn>, #<imm>] - Beispiel:
LDR X0, [X1, #8] - Erklärung: Lädt den Wert, der sich 8 Bytes nach der Adresse in
X1befindet, in das RegisterX0.
- LDRB (Load Register Byte):
- Format:
LDRB <Rt>, [<Rn>, #<imm>] - Beispiel:
LDRB W0, [X1, #2] - Erklärung: Lädt ein Byte, das sich 2 Bytes nach der Adresse in
X1befindet, in das RegisterW0.
- LDRH (Load Register Halfword):
- Format:
LDRH <Rt>, [<Rn>, #<imm>] - Beispiel:
LDRH W0, [X1, #4] - Erklärung: Lädt ein Halbwort (16 Bit), das sich 4 Bytes nach der Adresse in
X1befindet, in das RegisterW0.
- LDP (Load Pair):
- Format:
LDP <Rt>, <Rt2>, [<Rn>, #<imm>] - Beispiel:
LDP X0, X1, [X2, #16] - Erklärung: Lädt zwei aufeinanderfolgende Register (
X0undX1) aus dem Speicher, beginnend bei der Adresse, die 16 Bytes nach dem Wert inX2liegt.
Stores (Schreiboperationen)
Hier sind einige der wichtigsten Store-Instruktionen:
- STR (Store Register):
- Format:
STR <Rt>, [<Rn>, #<imm>] - Beispiel:
STR X0, [X1, #8] - Erklärung: Speichert den Wert in
X0an die Adresse, die 8 Bytes nach der Adresse inX1liegt.
- STRB (Store Register Byte):
- Format:
STRB <Rt>, [<Rn>, #<imm>] - Beispiel:
STRB W0, [X1, #2] - Erklärung: Speichert ein Byte aus
W0an die Adresse, die sich 2 Bytes nachX1befindet.
- STRH (Store Register Halfword):
- Format:
STRH <Rt>, [<Rn>, #<imm>] - Beispiel:
STRH W0, [X1, #4] - Erklärung: Speichert ein Halbwort aus
W0an die Adresse, die sich 4 Bytes nachX1befindet.
- STP (Store Pair):
- Format:
STP <Rt>, <Rt2>, [<Rn>, #<imm>] - Beispiel:
STP X0, X1, [X2, #16] - Erklärung: Speichert zwei aufeinanderfolgende Register (
X0undX1) in den Speicher, beginnend bei der Adresse, die 16 Bytes nach dem Wert inX2liegt.
Atomare Operationen
ARMv8 unterstützt auch atomare Lade- und Speicherinstruktionen, die bei der Implementierung von Synchronisationsmechanismen wichtig sind:
- LDXR/STXR (Exclusive Load/Store Register):
- Format (LDXR):
LDXR <Rt>, [<Rn>] - Format (STXR):
STXR <Ws>, <Rt>, [<Rn>] - Beispiel:
LDXR X0, [X1] STXR W2, X0, [X1]
- Erklärung:
LDXRlädt den Wert aus der AdresseX1inX0.STXRspeichert den Wert vonX0an die AdresseX1und setztW2auf 0, wenn der Store erfolgreich war.