Daten an absolute Adresse schreiben
Frage
Ich spiele gerade ein bisschen mit Assembler auf einem Cortex-M3-Mikrocontroller herum.Ich bin mir nicht sicher, ob das wichtig ist, aber bitte schön.
Ich muss einen Wert in eine bestimmte Adresse im Speicher schreiben.Folgendes habe ich versucht:
LDR R4, =__cs3_interrupt_vector_cortex_m
STR R4, [=VTOR]
Aber es scheint, als müsste ich die VTOR-Adresse relativ zum PC-Register referenzieren.Die Frage ist, ob es eine Möglichkeit gibt, die Adresse relativ nicht zu referenzieren und dies automatisch zu tun (so dass es im Grunde wie mein Ansatz aussehen würde).
Ich benutze GNU Assembler.
Lösung
Sie müssen die Zieladresse in ein Register laden.Ich gehe davon aus, dass VTOR
eine Speicheradresse oder ein 'C'-Zeiger ist und __cs3_interrupt_vector_cortex_m
ist eine Konstante.Dh, Sie möchten eine 32-Bit-Konstante an eine Adresse schreiben.Wenn dies der Fall ist, dann,
; Get value __cs3_interrupt_vector_cortex_m to r4
ldr r4, =__cs3_interrupt_vector_cortex_m
ldr r5, =VTOR ; address 'VTOR' to r5.
str r4, [r5] ; write the constant to 'VTOR' address.
Der ARM / Daumen / Daumen 2 ist ein laden-speichern Architektur.Sie können keine Speicheroperanden in den Lade- und Speicheranweisungen verwenden.Dies vereinfacht das CPU-Design, unterscheidet sich jedoch von M68K- und x86-Assemblern.
Syntax ldr rX, =val
wird in der erklärt Gnu Assembler Infoseiten.Im Allgemeinen wird es in Folgendes konvertiert,
ldr rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.
Der pseudo-op .ltorg
weist den Assembler an, die Literaltabelle zu sichern;der Offset teil des obigen Codes.Sie können eine hinzufügen .ltorg
irgendwo zwischen Unterroutinen usw.
Sie können die Syntax nicht verwenden str r4,[=VTOR]
wie die gleich syntax ist nur eine Abkürzung für die Verwendung mit ldr
.Beispielsweise,
ldr rX,=7 ; is really 'mov rx,#7' in all modes.
ldr rX,=0xff ; is 'mov rx,#0xff' for ARM and '[pc,#offset]' for thumb.
ldr rx,=0x12345678 ; will use the [pc, #offset] for all modes.
Sie können das verwenden ldr rX,=VTOR
syntax, um die Adresse in ein Register zu bekommen.Es braucht dann eine andere Anweisung wie str rY, [rX]
um tatsächlich an diese Adresse zu schreiben.
Konstanten werden innerhalb eines Befehls codiert, so dass der Konstantenbereich besonders in sehr begrenzt ist Daumen Modus.Ich denke, du benutzt daumen2 welches kann mehr Reichweite haben.