2011-10-24 15 views
5

私はアームアセンブリのサブルーチンを学習していますが、私は例と混同しています。 "bne Body"の前にcmp x、yは必要ないのですか?それは何を比較していますか?ARMのsssemblyで前のcmpと比較してbne分岐をどのように比較できますか?

@ Sum of the first "MAX" Fibonacci with subroutine 
.text 
.global _start 
.equ MAX,10 
_start: mov r1,#MAX 
bl Fib 
exit: swi 0x11 @ Terminate the program 
@Subroutine to compute sum of n Fibonacci numbers 
Fib: sub r1,r1,#2 @ Counter - 2 
mov r2,#1 
mov r3,#2 
mov r0,#3 
Body: add r4,r2,r3 
add r0,r0,r4 @ Update Sum 
mov r2,r3 
mov r3,r4 
Decr: subs r1,r1,# 
bne Body @ If Count != 0, repeat loop 
Done: mov pc,lr @ Return from subroutine 

答えて

3

'subs'命令はフラグを設定し、 'bne'はこれらのフラグで分岐します。基本的には、r1を0に、分岐が0に等しくない場合は分岐します。実際には、減算演算として比較が実行されます。つまり、CPU内の2つの数値を比較する方法です。古いCPUには比較演算コードはなく、実際には減算の同義語にすぎません(フラグセットには小さな違いがありますが、明瞭にするために比較演算コードを使用する必要があります)。

+0

ありがとうございました。私が知っておくべきフラグ(例えば、追加)を設定する他の指示はありますか? –

+0

はい、その多くがあります。 ALU演算(数学または論理)を行うほとんどの命令は、いくつかの条件下でフラグを設定できます。単純にデータを移動したり、プログラムの流れを分岐させる命令は、通常そうしません。確かに、どのようなフラグをどのような条件で設定できるかを知るためには、実際には指示書のドキュメントを見る必要があります。 –

+0

"subs"命令の2番目の 's'に注意してください。これは、結果に応じてフラグが設定されていることを示します(例えば、 "sub"命令はフラグを設定しません)。 – starblue

関連する問題