3.9 KiB
3.9 KiB
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
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
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]
-
- Beispielsweise:
- Pseudobefehl, wird vom Assembler in passenden Befehl umgesetzt
- Speicherinhalt an Stelle Label wird geladen
Pipelining
Register-Adressierung
mov r0, r1
- Wie 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]
- Beispiel:
- Kommt häufig vor, dass Speicher zugegriffen wird, der einen Offset relativ zur Basisadresse besitzt
- Adressierung über Register plus konst. Offset = indexed Adressing
- Arm: