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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top