4
votes

Comment lire un indicateur de condition dans l'assemblage ARMv7 Thumb-2?

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!


0 commentaires

3 Réponses :


4
votes

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.


0 commentaires

2
votes

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 , 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.


2 commentaires

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.



3
votes

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


1 commentaires

Merci pour votre réponse détaillée!