Utilisation du signe «=» dans l'assemblage ARM [duplicate]

Nov 01 2020

Je l'ai googlé mais je n'ai rien trouvé, je suis nouveau dans l'assemblage, j'ai une définition de symbole que je pense égale aux déclarations #define de C.

FIRST       EQU         0x20000480

Dans __main, je veux charger cette valeur 0x20000480 dans le registre R1, donc j'ai le code suivant,

LDR         R1, FIRST

Cela donne une erreur de

main.s (65): erreur: A1150E: symbole incorrect, non défini ou externe

Si j'insère un "=" devant le PREMIER,

LDR         R1, =FIRST

Ensuite, il se construit bien.

Quelqu'un peut-il expliquer l'utilisation de l'opérateur "=" (s'il s'agit d'un opérateur) ici?

Réponses

1 Jake'Alquimista'LEE Nov 01 2020 at 13:06

Le "=" indique un accès littéral possible au pool. L' ldrinstruction est une instruction de pseudo dans ce cas , qui se traduit par l'une des mov, mvnouldr [pc, #offset]

code source:

ldr     r0, =0xff
ldr     r1, =0xffffffff
ldr     r2, =0xf00000ff

démontage:

mov     r0, #0xff
mvn     r1, #0x00
ldr     r2, [pc, #offset]

0xff peut être exprimé par les 12 bits d'espace ainsi que par 0 (~ 0xffffffff) et ainsi il se traduit par movet mvnrespectivement.
http://www.davespace.co.uk/arm/introduction-to-arm/immediates.html

D'autre part, comme ce n'est pas le cas avec 0xf00000ff, un accès littéral au pool est dû sous la forme d'une pccharge relative.

En armv7revanche, vous pouvez charger le registre avec toute valeur 32 bits grâce à movwet des movtinstructions qui est préférable à un accès mémoire

movw    r2, #0xffff // ANY 16bit value
movt    r2, #0xf000 // ANY 16bit value to the upper part without corrupting the lower one