web-dev-qa-db-ja.com

ARMアセンブラ-CMP、BLT、BGTを使用するにはどうすればよいですか?

皆さんへの簡単な質問です。私のループでは、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
7
user1080390

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

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

CMPを使用してr6とr4を比較し、その差をr7に入れたい場合、どうすればよいですか?

subs r7, r6, r4    /* r7 ← r6 - r4 */

R7が0未満の場合にBLTを使用したい場合も同じ質問ですが、どうすればよいですか?

bmi _exit          /* branch if r7 < 0 */

BMI(マイナス/負)Nが有効な場合(Nは1)、ここでNは、命令の結果が負の数になった場合に有効になるフラグです。それ以外の場合は無効にします。

なぜsubではなくsubSなのですか? Sはオプションのサフィックスであるため、指定すると、操作の結果に応じて条件フラグ(Nなど)が更新されます。

よろしく。

1
omotto

ARMドキュメント(CMPドキュメントの例): http://infocenter.arm.com/help/index.jsp?topic=/com.arm)をチェックアウトする必要があります。 doc.dui0068b/CIHIDDID.html

そこで読み取れるものから、実行しようとしていることには、1つではなく2つの命令が必要になる場合があります(ARMアセンブラが特別な処理を行わない限り)

敬具、
Bo

0
Bo.