David Schirrmeister 25ac114405 update
2024-12-05 13:57:04 +01:00

158 lines
6.2 KiB
Markdown

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