# 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) -