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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top