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: <code>LDR <Rt>, [<Rn>, #<imm>]</code>
: Format: <syntaxhighlight lang="asm" inline>LDR <Rt>, [<Rn>, #<imm>]</syntaxhighlight>
: Beispiel: <code>LDR X0, [X1, #8]</code>
: Beispiel: <syntaxhighlight lang="asm" inline>LDR X0, [X1, #8]</syntaxhighlight>
: Erklärung: Lädt den Wert, der sich 8 Bytes nach der Adresse in <code>X1</code> befindet, in das Register <code>X0</code>.
: 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: <code>LDRB <Rt>, [<Rn>, #<imm>]</code>
: Format: <syntaxhighlight lang="asm" inline>LDRB <Rt>, [<Rn>, #<imm>]</syntaxhighlight>
: Beispiel: <code>LDRB W0, [X1, #2]</code>
: Beispiel: <syntaxhighlight lang="asm" inline>LDRB W0, [X1, #2]</syntaxhighlight>
: Erklärung: Lädt ein Byte, das sich 2 Bytes nach der Adresse in <code>X1</code> befindet, in das Register <code>W0</code>.
: 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: <code>LDRH <Rt>, [<Rn>, #<imm>]</code>
: Format: <syntaxhighlight lang="asm" inline>LDRH <Rt>, [<Rn>, #<imm>]</syntaxhighlight>
: Beispiel: <code>LDRH W0, [X1, #4]</code>
: 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 <code>X1</code> befindet, in das Register <code>W0</code>.
: 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: <code>LDP <Rt>, <Rt2>, [<Rn>, #<imm>]</code>
: Format: <syntaxhighlight lang="asm" inline>LDP <Rt>, <Rt2>, [<Rn>, #<imm>]</syntaxhighlight>
: Beispiel: <code>LDP X0, X1, [X2, #16]</code>
: Beispiel: <syntaxhighlight lang="asm" inline>LDP X0, X1, [X2, #16]</syntaxhighlight>
: Erklärung: Lädt zwei aufeinanderfolgende Register (<code>X0</code> und <code>X1</code>) aus dem Speicher, beginnend bei der Adresse, die 16 Bytes nach dem Wert in <code>X2</code> liegt.
: 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: <code>STR <Rt>, [<Rn>, #<imm>]</code>
: Format: <syntaxhighlight lang="asm" inline>STR <Rt>, [<Rn>, #<imm>]</syntaxhighlight>
: Beispiel: <code>STR X0, [X1, #8]</code>
: Beispiel: <syntaxhighlight lang="asm" inline>STR X0, [X1, #8]</syntaxhighlight>
: Erklärung: Speichert den Wert in <code>X0</code> an die Adresse, die 8 Bytes nach der Adresse in <code>X1</code> liegt.
: 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: <code>STRB <Rt>, [<Rn>, #<imm>]</code>
: Format: <syntaxhighlight lang="asm" inline>STRB <Rt>, [<Rn>, #<imm>]</syntaxhighlight>
: Beispiel: <code>STRB W0, [X1, #2]</code>
: Beispiel: <syntaxhighlight lang="asm" inline>STRB W0, [X1, #2]</syntaxhighlight>
: Erklärung: Speichert ein Byte aus <code>W0</code> an die Adresse, die sich 2 Bytes nach <code>X1</code> befindet.
: 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: <code>STRH <Rt>, [<Rn>, #<imm>]</code>
: Format: <syntaxhighlight lang="asm" inline>STRH <Rt>, [<Rn>, #<imm>]</syntaxhighlight>
: Beispiel: <code>STRH W0, [X1, #4]</code>
: Beispiel: <syntaxhighlight lang="asm" inline>STRH W0, [X1, #4]</syntaxhighlight>
: Erklärung: Speichert ein Halbwort aus <code>W0</code> an die Adresse, die sich 4 Bytes nach <code>X1</code> befindet.
: 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: <code>STP <Rt>, <Rt2>, [<Rn>, #<imm>]</code>
: Format: <syntaxhighlight lang="asm" inline>STP <Rt>, <Rt2>, [<Rn>, #<imm>]</syntaxhighlight>
: Beispiel: <code>STP X0, X1, [X2, #16]</code>
: Beispiel: <syntaxhighlight lang="asm" inline>STP X0, X1, [X2, #16]</syntaxhighlight>
: Erklärung: Speichert zwei aufeinanderfolgende Register (<code>X0</code> und <code>X1</code>) in den Speicher, beginnend bei der Adresse, die 16 Bytes nach dem Wert in <code>X2</code> liegt.
: 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): <code>STXR <Ws>, <Rt>, [<Rn>]</code>
: 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: <code>LDXR</code> lädt den Wert aus der Adresse <code>X1</code> in <code>X0</code>. <code>STXR</code> speichert den Wert von <code>X0</code> an die Adresse <code>X1</code> und setzt <code>W2</code> auf 0, wenn der Store erfolgreich war.
: 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 X1 befindet, in das Register X0.
  • 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 X1 befindet, in das Register W0.
  • 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 X1 befindet, in das Register W0.
  • LDP (Load Pair):
Format: LDP <Rt>, <Rt2>, [<Rn>, #<imm>]
Beispiel: LDP X0, X1, [X2, #16]
Erklärung: Lädt zwei aufeinanderfolgende Register (X0 und X1) aus dem Speicher, beginnend bei der Adresse, die 16 Bytes nach dem Wert in X2 liegt.

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 X0 an die Adresse, die 8 Bytes nach der Adresse in X1 liegt.
  • STRB (Store Register Byte):
Format: STRB <Rt>, [<Rn>, #<imm>]
Beispiel: STRB W0, [X1, #2]
Erklärung: Speichert ein Byte aus W0 an die Adresse, die sich 2 Bytes nach X1 befindet.
  • STRH (Store Register Halfword):
Format: STRH <Rt>, [<Rn>, #<imm>]
Beispiel: STRH W0, [X1, #4]
Erklärung: Speichert ein Halbwort aus W0 an die Adresse, die sich 4 Bytes nach X1 befindet.
  • STP (Store Pair):
Format: STP <Rt>, <Rt2>, [<Rn>, #<imm>]
Beispiel: STP X0, X1, [X2, #16]
Erklärung: Speichert zwei aufeinanderfolgende Register (X0 und X1) in den Speicher, beginnend bei der Adresse, die 16 Bytes nach dem Wert in X2 liegt.

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: LDXR lädt den Wert aus der Adresse X1 in X0. STXR speichert den Wert von X0 an die Adresse X1 und setzt W2 auf 0, wenn der Store erfolgreich war.