8

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

3 に答える 3

11

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

r05 より大きい場合は分岐:

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)
于 2012-05-15T13:32:53.073 に答える
1

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 など) は演算の結果で更新されます。

よろしく。

于 2017-01-04T11:14:55.597 に答える
0

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

そこで読むことができるものから、あなたがやろうとしていることは、1つではなく2つの命令を必要とするかもしれません(ARMアセンブラが特別な処理を行わない限り)

よろしく、
ボー

于 2012-05-15T13:15:34.203 に答える