Écrire des données à une adresse absolue
Question
Je joue actuellement un peu avec l'assembleur sur un microcontrôleur Cortex-M3.Je ne sais pas si c'est important, mais voilà.
Je dois écrire une valeur à une certaine adresse en mémoire.Voici ce que j'ai essayé :
LDR R4, =__cs3_interrupt_vector_cortex_m
STR R4, [=VTOR]
Mais il semble que je doive référencer l'adresse VTOR par rapport au registre du PC.La question est de savoir s'il existe un moyen de ne pas référencer l'adresse de manière relative et de laisser cela se faire automatiquement (afin que cela ressemble fondamentalement à mon approche).
J'utilise GNU Assembleur.
La solution
Vous devez charger l'adresse de destination dans un registre.Je suppose que VTOR
est une adresse mémoire ou un pointeur 'C' et __cs3_interrupt_vector_cortex_m
est une constante.Autrement dit, vous souhaitez écrire une constante de 32 bits sur une adresse.Si tel est le cas alors,
; 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.
Le ARM/Thumb/Thumb2 est un magasin de chargement architecture.Vous ne pouvez pas utiliser d'opérandes mémoire dans les instructions de chargement et de stockage.Cela simplifie la conception du processeur, mais est différent de l'assembleur M68K et x86.
La syntaxe ldr rX, =val
est expliqué dans le Pages d'informations sur l'assembleur Gnu.Généralement, il se convertira en ce qui suit,
ldr rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.
Le pseudo-opération .ltorg
dit à l'assembleur de vider la table littérale ;le compenser partie du code ci-dessus.Vous pouvez ajouter un .ltorg
n'importe où entre les sous-programmes, etc.
Vous ne pouvez pas utiliser la syntaxe str r4,[=VTOR]
comme le équivaut à la syntaxe n'est qu'un raccourci à utiliser avec ldr
.Par exemple,
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.
Vous pouvez utiliser le ldr rX,=VTOR
syntaxe pour obtenir l'adresse d'un registre.Il faut ensuite une autre instruction comme str rY, [rX]
pour écrire à cette adresse.
Les constantes sont codées dans une instruction, la plage des constantes est donc très limitée, surtout dans pouce mode.Je suppose que tu utilises pouce2 qui peut avoir plus de portée.