Petite question pour vous, dans ma boucle, je dois utiliser CMP, BLT et BGT pour comparer certaines valeurs. Comment utiliser ces instructions dans la boucle suivante?
J'essaie d'utiliser BGT, BLT et CMP car j'en ai besoin pour que mon application fonctionne. Le problème est que je ne sais pas comment les utiliser. Si je voulais utiliser CMP pour comparer r6, avec r4 et mettre la différence dans r7, comment procéderais-je? La même question si je voulais utiliser BLT si r7 est inférieur à 0, comment ferais-je cela?
BGT ??????? ; branch if greater than 5
CMP ???????? ; compare r6 with r4 , put difference into r7
BLT ???????? ;branch if r7 is less than 0
BGT ???????? ;branch if r7 is greater than 0
Voici toute ma boucle:
LoopStart
BL WaitBUT1
BL readTemp
BL checkTemp
BGT ??????? ; branch if greater than 5
BL errorVal
CMP ???????? ; compare r6 with r4 , put difference into r7
BLT ???????? ;branch if r7 is less than 0
BL FanOn
BL errorLedOn
BL systemLedOn
BL heaterOn
BGT ???????? ;branch if r7 is greater than 0
BL FanOff
BL errorLedOff
BL systemLedOff
BL heaterOff
BL WaitBUT2
BL FanOff
BL errorLedOff
BL systemLedOff
BL heaterOff
B LoopStart
Vous ne pouvez pas créer de branche conditionnelle sans d'abord définir le registre de conditions. Cela peut être fait avec cmp
ou en ajoutant s
à la plupart des instructions. Consultez la documentation de l'assemblage ARM pour plus de détails. Exemple rapide:
Branchement si r0
supérieur à 5:
cmp r0, #5 ;Performs r0-5 and sets condition register
bgt label_foo ;Branches to label_foo if condition register is set to GT
Comparez r6
avec r4
, mettez la différence en r7
, branche si r7 < 0
:
subs r7, r6, r4 ;Performs r7 = r6 - r4 and sets condition register
blt label_bar ;Branches to label_bar if r7 < 0 (in which case r6 < r4)
Si je voulais utiliser CMP pour comparer r6, avec r4 et mettre la différence dans r7, comment procéderais-je?
subs r7, r6, r4 /* r7 ← r6 - r4 */
La même question si je voulais utiliser BLT si r7 est inférieur à 0, comment ferais-je cela?
bmi _exit /* branch if r7 < 0 */
IMC (moins/négatif) Lorsque N est activé (N = 1), N est un indicateur qui sera activé si le résultat de l'instruction génère un nombre négatif. Désactivé autrement.
Pourquoi subS au lieu de sub? S étant un suffixe facultatif, les indicateurs de condition (comme N) sont mis à jour sur le résultat de l'opération, lorsque est spécifié.
Cordialement.
Vous devriez consulter la documentation ARM à (exemple pour la documentation CMP): http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0068b/CIHIDDID .html
D'après ce qui peut être lu ici, ce que vous essayez de faire peut nécessiter deux instructions plutôt qu'une seule (sauf si votre assembleur ARM effectue un traitement spécial)
Sincères amitiés,
Bo