2016-11-22 2 views
0

J'essaie de porter un simple RTOS écrit pour arm926ejs afin d'armer le cortex-A9. Tout en se référant au changement de contexte, je suis tombé sur les instructions suivantes,Instruction STR et LDR dans l'assemblage ARM

_userIntrStackPtr: 
    .word 0x0 

STR  sp,_userIntrStackPtr 

LDR  r0,__userStackPtr2Ptr 

Mais, quand je tente de compiler le code, je reçois l'erreur

Error: internal_relocation (type: OFFSET_IMM) not fixed up 

Quelqu'un peut-il s'il vous plaît expliquer les instructions ci-dessus? Aussi quand j'ai référé d'autres codes, j'ai vu des instructions similaires comme,

LDR  r0,=__userStackPtr2Ptr 

Quelle est la différence entre ces deux méthodes? Comment puis-je utiliser ces étiquettes avec instruction str et ldr? Je ne suis pas bon avec l'assemblage. S'il vous plaît aider ..

Répondre

2

La forme donnée des instructions utilise l'adressage relatif PC et certains assembleurs peuvent imposer des restrictions sur eux, tels que les symboles doivent être dans la même section afin que le décalage est connu. Le code ci-dessus, comme illustré, s'assemble avec gnu assembleur 2.24.51.20131021 cependant. Je suppose que vous n'avez pas fourni le MCVE réel.

Pour la deuxième partie de la question: le = charge l'adresse de sorte que vous avez besoin d'un autre LDR/STR pour effectuer l'opération de mémoire. Par exemple:

LDR r0, =_userIntrStackPtr 
STR sp, [r0] 
LDR r0, =__userStackPtr2Ptr 
LDR r0, [r0] 
+0

Merci pour le jester de réponse. J'ai changé les sections et maintenant l'erreur est partie. Bien que tout appartenait à la section .text de l'éditeur de liens, l'un était en .text et le reste en .text.vectors. J'ai changé à la fois .text et sa compilation maintenant. Je n'ai pas testé le fonctionnement, mais l'erreur est partie. – Ajeesh