130 lines
3.9 KiB
Markdown
130 lines
3.9 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
|
|
- 
|
|
|
|
### 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
|
|
- 
|
|
- 
|
|
- |