J'utilise un processeur ARMv7 avec des instructions Thumb-2.
J'ai exécuté un ADD
, un SUB
ou un CMP
. Maintenant, je veux déplacer l'indicateur de condition LE
vers r2
. Après cela, r2
doit contenir 0
ou 1
.
J'ai parcouru le manuel de Thumb-2, mais je n'ai pas trouvé d'instruction MOV conditionnelle ou d'instruction spéciale pour lire les indicateurs.
Quelle est la manière la plus efficace de procéder? Merci d'avance!
3 Réponses :
Vous devez démarrer un bloc conditionnel avec une instruction ite
(if-then-else) et ensuite simplement utiliser des attributions conditionnelles:
ite le @ if-then-else (le) movle r2, #1 @ if (le) then r2 = #1 movgt r2, #0 @ else r2 = #0
En général, vous peut utiliser des instructions conditionnelles arbitraires dans Thumb-2 si vous les préfixez avec des instructions informatiques appropriées. Lisez le manuel pour plus de détails.
J'ai parcouru le manuel de Thumb-2, mais je n'ai pas trouvé d'instruction MOV conditionnelle ou d'instruction spéciale pour lire les indicateurs.
Vous pouvez utiliser MRS code>
, afin de copier les drapeaux conditionnels dans un registre (ie r2
).
Quelle est la manière la plus efficace de procéder?
Jusqu'à présent, vous n'avez pas inclus d'exigence dans laquelle le code d'exécution conditionnel n'est pas suffisant, c'est donc le moyen le plus efficace.
MRS n'est pas vraiment un bon choix; il faut encore une ou deux instructions supplémentaires pour déplacer / et le bit unique que vous voulez mettre en place.
Merci, je ne connaissais pas l'instruction MRS.
Dans ARM, (presque) toutes les instructions peuvent être prédites. En mode pouce, cela nécessite une instruction it
pour encoder le prédicat et le modèle de négation ou non pour les prochaines instructions.
Mais dans une syntaxe unifiée, l'assembleur peut le faire pour vous, sans explication it
, je pense.
par exemple movle r0, # 1
définit r0 = 1
si la condition LE est vraie dans les drapeaux, sinon en la laissant inchangée. Vous aurez donc besoin d'un mov r0, # 0
en premier.
ARM32 n'a pas d'instruction set-from-condition comme le setcc
de x86.
AArch64 fait: transformer une condition d'indicateur en un entier ne prend qu'une seule instruction cset
.
Cette source C:
@ clang and gcc make the same efficient code booleanize(int, int): cmp w0, w1 cset w0, lt @ signed less-than ret booleanize_u(unsigned int, unsigned int): cmp w0, w1 cset w0, lo @ unsigned lower ret
Merci pour votre réponse détaillée!