update
This commit is contained in:
@ -100,4 +100,5 @@
|
||||
|
||||
## [ARM Toolchain](arm_toolchain.md)
|
||||
|
||||
## [ARM Befehle](arm_befehle.md)
|
||||
## [ARM Befehle](arm_befehle.md)
|
||||
|
||||
|
130
Writerside/topics/RA/arm_adressierung.md
Normal file
130
Writerside/topics/RA/arm_adressierung.md
Normal file
@ -0,0 +1,130 @@
|
||||
# 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
|
||||
- 
|
||||
- 
|
||||
-
|
@ -401,3 +401,4 @@
|
||||
- Inhalt von lr wird zur Rückkehr ins aufrufende Programm benötigt
|
||||
- 
|
||||
|
||||
## [ARM Adressierung](arm_adressierung.md)
|
||||
|
Reference in New Issue
Block a user