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
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?
"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.
- 1. UIView ne prend pas contact
- 2. drupal_write_record ne prend pas l'objet
- 3. GridView ne prend pas DDL.SelectedValue
- 4. FirstOrDefault ne prend pas argument
- 5. Java ne fonctionne pas dans mon PC
- 6. Xcode d'émission ARMv7
- 7. Optimisé (armv7) par rapport à Standard (armv6 armv7)
- 8. armv7 iphone warnings
- 9. stimuler la construction ARMv7
- 10. UIRequiredDeviceCapabilities armv6 et armv7
- 11. Le projet Symfony ne fonctionne pas sur le PC local
- 12. Android jvm ne prend pas en charge keyFactory generatePublic()?
- 13. Symboles indéfinis pour l'architecture armv7:
- 14. L'iPhone utilisant les instructions ARMv7 prend-il en charge les binaires compilés ARMv6?
- 15. Pourquoi urllib2 ne prend pas mon URL?
- 16. Objet ne prend pas de valeur
- 17. TimeZoneInfo.ConvertTimeFromUtc ne prend pas en compte DST
- 18. Firefox/prefs.js ne prend pas de modifications
- 19. appendTo ne prend pas mon ID
- 20. IDEA ne prend pas en charge scala?
- 21. Array ne prend pas toutes les données
- 22. richtextbox ne prend pas en charge l'arabe
- 23. SimpleXMLRPCServer ne prend pas en charge methodSignature?
- 24. La redirection ne prend pas effet
- 25. Window.print() ne prend pas l'URL actuelle
- 26. Chemin du fichier ne prend pas correctement
- 27. Workbooks.OpenText ne prend pas le paramètre 'fieldinfo'
- 28. MultiBinding ne prend pas la deuxième propriété
- 29. NSMutableArray ne prend pas un objet remplacé
- 30. Ne prend pas en compte la condition
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
@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?". –