1. ホーム
  2. c

[解決済み] ARMアセンブラ - CMP、BLT、BGTはどのように使用するのですか?

2022-02-28 03:55:02

質問

ループの中でCMP、BLT、BGTを使用して値を比較する必要があります。次のループでは、これらの命令をどのように使用するのでしょうか?

BGT、BLT、CMPをアプリケーションを動作させるために必要なので、使おうとしています。問題は、それらをどのように使用するのかがわからないことです。CMPを使用してr6とr4を比較し、その差をr7に格納したい場合、どのようにすればよいのでしょうか?同じ質問で、r7が0より小さい場合にBLTを使いたい場合、どのようにすればいいのでしょうか?

  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

これが私のループ全体です。

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

解決方法は?

条件分岐を行うには、まず何らかの方法で条件レジスタを設定する必要があります。これを実現するのが cmp を追加するか、あるいは s をほとんどの命令で使用することができます。詳しくはARMのアセンブリドキュメントを確認してください。簡単な例です。

分岐 if r0 が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

比較する r6r4 に、その差を r7 の場合、分岐します。 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)