2011-10-21 3 views
2

J'ai une bibliothèque écrite en C mixé avec un peu d'assemblage pour ARM. Il était auparavant compilé pour armv6. Maintenant j'essaye de l'améliorer à armv7. Cependant, il existe un gestionnaire d'interruption qui a l'instruction stmdb sp!, {pc} qui n'est pas autorisée dans armv7. Quelle serait une instruction équivalente sur armv7? J'ai essayé str r15, [sp, #-4]! mais cela ne fonctionne pas.armv7: stmb ne prend pas pc

Répondre

2

Il y a des limites spécifiques concernant l'utilisation de PC dans la liste reg pour PUSH et POP instructions, en fonction du mode de fonctionnement, voir:

ARM Instruction Set Reference, PUSH/POP

Plus précisément, dans le pouce [2] il est aucune opération push {pc} (ce qui revient à dire qu'il n'y a pas d'opération stmfd sp!, {pc} - push est mappé sur stmfd sp!). Par conséquent, si vous compilez votre code noyau (pourquoi avez-vous besoin d'un gestionnaire d'interruption s'il ne s'agit pas d'un code noyau), vérifiez si vous compilez un noyau Thumb-2. Cela dit, vous dites que vous avez rencontré une instruction de stmfd sp!,{pc} - vous êtes sur que ce n'est pas une faute de frappe? stmfd sp!,{lr} (et son frère, ldmfd sp!, {pc} - ici PC est présent) est normal/entièrement légal et souvent requis/rencontré en mode ARM et en mode Thumb-2. Mais qu'en réalité est dans le but d'enregistrer le compteur de programme à la pile? Que peut-on faire avec cela qui ne serait pas réalisable autrement?

+0

Je ne vois pas pourquoi on pousserait le PC sur la pile dans un gestionnaire d'interruption. Lorsque l'instruction push est exécutée, pc pointe sur l'instruction push (ou en réalité sur 4 octets après celle-ci). – Sven

+0

@Sven c'est exactement ce que j'ai dit?! Cela pourrait être un artefact _porting_; sur 32bit x86, la seule façon de lire le compteur de programme est de le pousser dans la pile (via 'call' vers ... l'instruction suivante) et de le sortir directement dans un registre. Je n'ai pas besoin d'une telle bizarrerie sur ARM, donc j'ai demandé, "bien sûr que ce n'est pas une faute de frappe?". –

2

"armv7" est plutôt générique. Quelle est la puce que vous utilisez? Compilez-vous pour ARMv7-M? Essayez PUSH {PC} ensuite. Bien que je pense que ce ne sera pas le seul problème que vous rencontrerez. Je pense que vous devriez publier des extraits et décrire plus en détail l'environnement spécifique dans lequel vous transférez.