6.2 KiB
6.2 KiB
ARM Adressierung
Datentransfer-Befehle
- Einzelregister-Transfer-Befehle (MOV, MVN, MRS, MSR)
- Einzeltransfer-Load/Store-Befehle
- Blocktransfer-Load/Store-Befehle
Datentransfer
Datentransfer zwischen Speicher und Register
ldr r0, [r1]
str r0, [r1]
-
R0: Zielregister
-
R1: enthält Speicheradresse, von der geladen/gespeichert wird
-
Langsamer Transfer zwischen Speicher- und Rechenwerk
Zwischen Registern
mov r0, r1
-
R0: Zielregister
-
R1: Quellregister
-
Schneller Transfer innerhalb des Rechenwerks
Speicherorganisation
Little Endian
Alignment im Speicher
- Ausrichtung der Adressen für Zugriffe an Worten (32Bit = 4 Byte)
- erlaubt einfachere Speicheranbindung, wenn Wortweise gelesen wird
- Cache Speicherung mindestens nach Worten ausgerichtet
- Wenn man Bytes frei anordnen würde, könnte eine Hälfte im Cache stehen, die andere nicht verfügbar
- Intel:
- Jedes Wort kann auf jeder Adresse stehen
- nicht ausgerichtete Wörter brauchen 2 Speicherzugriffe
- wäre langsamer
Speicheraufteilung / Assembleranweisungen
- .text
- Legt Textbereich an
- .align #Bits
- nachfolgende Anweisung steht auf Speicherstelle, deren unteren #Bits 0 sind
- .data
- Legt Datenbereich an
- .comm symbol, size
- Legt Symbol in globale bss-Section für uninitialisierte Daten
- .word Ausdruck
- Legt initialisierten Speicherbereich mit Größe 4 Byte an
- .byte Ausdruck
- Legt initialisierten Speicherbereich mit Größe 1 Byte an
Befehle LDR und STR
- Zugriff erfolgt indirekt
- Speicherung kann indiziert / mit Offset vorgenommen werden
- zum Zugriff genutzter Zeiger kann vor / nach Zugriff in-/dekrementiert werden
Immediate Adressierung
Direkte Adressierung
- Adresse befindet sich im Opcode
- Kann während der Laufzeit nicht mehr geändert werden
- Achtung:
- RISC kann nicht 32Bit im Opcode → nicht möglich
PC-relative Adressierung
- Zugriff auf Daten mit ldr register, label
- Laden der ADresse erfolgt über Konstante
- wird PC-relativ adressiert
- Befehl ldr r0, Label
- Pseudobefehl, wird vom Assembler in passenden Befehl umgesetzt
- Beispielsweise:
-
add r0, pc, #8 sub r0, pc, #0xb7 ldr r0, [r0] ldr r0, [pc, #8]
-
- Beispielsweise:
- Pseudobefehl, wird vom Assembler in passenden Befehl umgesetzt
- Speicherinhalt an Stelle Label wird geladen
Pipelining
Register-Adressierung
mov r0, r1
- Wie direkte Adressierung. nur mit Speicher- statt Registeradresse
Register-indirekte Adressierung
- Beispiel:
ldr r0, [r1]
- Benutzt Registerwert (Basisregister) als Speicheradresse
- zum Laden/Speichern des Wertes an der Adresse
- einer der Operanden aus dem Speicher, andere im Register
- Registeradressierung über Pointer
- Gesamter Speicherbereich kann adressiert werden, ohne dass Adresse in der Instruktion sein muss
Beispiel Kopieren
Indizierte Adressierung
- Register + Offset Adressierung
- Beispiel:
ldr r0, [r1, #8]
- Beispiel:
- Kommt häufig vor, dass Speicher zugegriffen wird, der einen Offset relativ zur Basisadresse besitzt
- Adressierung über Register plus konst. Offset = indexed Adressing
- Arm:
Beispiel Kopieren indiziert
Load/Store - Befehlsformat
Adressierungsarten übersicht
Art | ARM-Beispiel | Alternativer Name |
---|---|---|
Immediate | mov r0, #8 |
Literal |
Direkt | wird nicht unterstützt | Absolute |
PC-relativ | ldr r1, [pc, #offset] Pseudobefehl, label in .text ldr r1, label |
|
Register | mov r0, r1 |
Register-to-Register Register Direct |
Register-Indirect | ldr r0, [r1] |
Indexed |
Indiziert / Index | ldr r0, [r1, #4] ldr r0, [r1, #4]! ldr r0, [r1], #4 |
Pre-indexed Post-indexed, pre-incrementing post-incrementing |
Basis-indizierte | ldr r0, [r1, r0, LSL#2] |
|
Basis-indizierte mit Offset | wird nicht unterstützt |
Blocktransfer-Befehle
- Register mit niedrigster Nummer wird geladen von/gespeichert nach der niedrigsten Adresse
- Reihenfolge der angegebenen Register im Befehl spielt keine Rolle
Beispiel
Stacks
- push {}
- pop {}