zusammenfassungen/Writerside/topics/RA/arm_adressierung.md
David Schirrmeister dc5850cc01 update
2024-06-27 11:44:33 +02:00

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

  • 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