zusammenfassungen/Writerside/topics/RA/arm_adressierung.md
David Schirrmeister be1eeaf778 update
2024-07-02 15:34:34 +02:00

6.2 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

  • Byte-orientierter Speicher
    • Speicherstelle: 1 Byte
  • Transfer-Befehle liefern meist 32 Bit
  • image_423.png

Little Endian

image_424.png

Alignment im Speicher

  • Ausrichtung der Adressen für Zugriffe an Worten (32Bit = 4 Byte)
    • 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

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

Immediate Adressierung

  • image_428.png
  • Operand wird direkt im Befehl gespeichert
    • Kein weiterer Speicherzugriff erforderlich

Direkte Adressierung

  • 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
  • im PC immer aktuelle Befehlsadresse + 8

Register-Adressierung

Register-indirekte Adressierung

  • Beispiel: ldr r0, [r1]
  • 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

Indizierte Adressierung

  • Register + Offset Adressierung
    • Beispiel: ldr r0, [r1, #8]
  • 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_436.png

Beispiel Kopieren indiziert

  • image_437.png
  • image_438.png

Load/Store - Befehlsformat

image_477.png

Adressierungsarten übersicht

Art ARM-Beispiel Alternativer Name
Immediate mov r0, #8 Literal
Direkt wird nicht unterstützt Absolute
PC-relativ ldr r1, [pc, #offset]
Pseudobefehl, label in .text
ldr r1, label
Register mov r0, r1 Register-to-Register
Register Direct
Register-Indirect ldr r0, [r1] Indexed
Indiziert / Index ldr r0, [r1, #4]
ldr r0, [r1, #4]!
ldr r0, [r1], #4
Pre-indexed
Post-indexed,
pre-incrementing
post-incrementing
Basis-indizierte ldr r0, [r1, r0, LSL#2]
Basis-indizierte mit Offset wird nicht unterstützt

Blocktransfer-Befehle

image_478.png

  • Register mit niedrigster Nummer wird geladen von/gespeichert nach der niedrigsten Adresse
  • Reihenfolge der angegebenen Register im Befehl spielt keine Rolle

Beispiel

image_479.png

Stacks

  • push {}
  • pop {}