# 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
- ![image_423.png](image_423.png)

### Little Endian
![image_424.png](image_424.png)

### Alignment im Speicher
- Ausrichtung der Adressen für Zugriffe an Worten (32Bit = 4 Byte)
  - ![image_425.png](image_425.png)
- 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

![image_426.png](image_426.png)


## 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

![image_427.png](image_427.png)

## Immediate Adressierung
- ![image_428.png](image_428.png)
- Operand wird direkt im Befehl gespeichert
  - Kein weiterer Speicherzugriff erforderlich

## Direkte Adressierung
- ![image_429.png](image_429.png)
- 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
- ![image_430.png](image_430.png)
- im PC immer aktuelle Befehlsadresse + 8

## Register-Adressierung
- `mov r0, r1`
- ![image_431.png](image_431.png)
- Wie [direkte Adressierung](#direkte-adressierung). nur mit Speicher- statt Registeradresse

### Register-indirekte Adressierung
- Beispiel: `ldr r0, [r1]`
- ![image_432.png](image_432.png)
- 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
![image_433.png](image_433.png)

## Indizierte Adressierung
- Register + Offset Adressierung
  - Beispiel: `ldr r0, [r1, #8]`
- ![image_434.png](image_434.png)
- Kommt häufig vor, dass Speicher zugegriffen wird, der einen Offset relativ zur Basisadresse besitzt
- Adressierung über Register plus konst. Offset = **indexed Adressing**
- Arm:
  - ![image_435.png](image_435.png)
- ![image_436.png](image_436.png)

## Beispiel Kopieren indiziert
- ![image_437.png](image_437.png)
- ![image_438.png](image_438.png)


## Load/Store - Befehlsformat
![image_477.png](image_477.png)

## Adressierungsarten übersicht
| Art                         | ARM-Beispiel                                                                     | Alternativer Name                                                        |
|-----------------------------|----------------------------------------------------------------------------------|--------------------------------------------------------------------------|
| Immediate                   | `mov r0, #8`                                                                     | Literal                                                                  |
| Direkt                      | wird nicht unterstützt                                                           | Absolute                                                                 |
| PC-relativ                  | `ldr r1, [pc, #offset]`<br/>Pseudobefehl, `label` in `.text`<br/>`ldr r1, label` |                                                                          |
| Register                    | `mov r0, r1`                                                                     | Register-to-Register<br/>Register Direct                                 |
| Register-Indirect           | `ldr r0, [r1]`                                                                   | Indexed                                                                  |
| Indiziert / Index           | `ldr r0, [r1, #4]`<br/>`ldr r0, [r1, #4]!`<br/>`ldr r0, [r1], #4`                | Pre-indexed<br/>Post-indexed,<br/>pre-incrementing<br/>post-incrementing |
| Basis-indizierte            | `ldr r0, [r1, r0, LSL#2]`                                                        |                                                                          |
| Basis-indizierte mit Offset | wird nicht unterstützt                                                           |                                                                          |


## Blocktransfer-Befehle
![image_478.png](image_478.png)
- Register mit niedrigster Nummer wird geladen von/gespeichert nach der niedrigsten Adresse
- Reihenfolge der angegebenen Register im Befehl spielt keine Rolle

### Beispiel
![image_479.png](image_479.png)

## Stacks
- push {}
- pop {}