Utilisation du signe «=» dans l'assemblage ARM [duplicate]
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
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