web-dev-qa-db-fra.com

ARM Assembleur - Comment utiliser CMP, BLT et BGT?

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
7
user1080390

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)
9
Leo

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.

1
omotto

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

0
Bo.