皆さんへの簡単な質問です。私のループでは、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アセンブリのドキュメントを確認してください。簡単な例:
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
r6
とr4
を比較し、違いを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)
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など)が更新されます。
よろしく。
ARMドキュメント(CMPドキュメントの例): http://infocenter.arm.com/help/index.jsp?topic=/com.arm)をチェックアウトする必要があります。 doc.dui0068b/CIHIDDID.html
そこで読み取れるものから、実行しようとしていることには、1つではなく2つの命令が必要になる場合があります(ARMアセンブラが特別な処理を行わない限り)
敬具、
Bo