# 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
- Byte-orientierter Speicher
- Speicherstelle: **1 Byte**
- Transfer-Befehle liefern meist 32 Bit
- 
### 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
- 
- Operand wird direkt im Befehl gespeichert
- Kein weiterer Speicherzugriff erforderlich
## 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]
```
- Speicherinhalt an Stelle Label wird geladen
## Pipelining
- 
- im PC immer aktuelle Befehlsadresse + 8
## Register-Adressierung
- `mov r0, r1`
- 
- Wie [direkte Adressierung](#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]`
- 
- 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 {}