# 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 -  -  ## Load/Store - Befehlsformat  ## 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  - Register mit niedrigster Nummer wird geladen von/gespeichert nach der niedrigsten Adresse - Reihenfolge der angegebenen Register im Befehl spielt keine Rolle ### Beispiel  ## Stacks - push {} - pop {}