2016-10-20 4 views
0

次のコードでアセンブラがラベルdestに分岐できるかどうかを調べようとしています。ARMアセンブリ言語:この条件文は "dest"というラベルに分岐しますか?

LDR R1, =value 
LDR R2, [R1] 
ADDS R2, R2, #200 
STR R2, [R1] 
BEQ dest 

ここで、最初の値は0xFFFFFF38です。私は、ADD命令の最後にある 's'は、小数点の値200とR2を追加し、結果をR2に入れ、APSRフラグも設定していると理解していますが、BEQステートメント。

ありがとうございました。

答えて

2

多くのアセンブリ言語は、CMP(したがって「等しい」)のような比較命令の後によくあるBEQ型命令を持っています。

しかし、比較はしばしば「減算するが結果を捨てる」ため、ゼロフラグが設定されている場合、BEQは単に分岐します。しかし

; basically: for (reg1 = 0; reg1 != reg2; reg1++) 
    load reg1, 0 
startloop: 
    cmp reg1, reg2 ; pretend subtract reg1 - reg2 
    beq endloop  ; zero flag set means they were equal 
    : : 
    inc reg1 
    bra startloop 
endloop: 

、あなたがに制限されていないだけで比較、何も設定しています。あなたが見る傾向があるものを言い換える

は、(いくつかの神話の擬似アセンブラコード内)のようなものです関連するフラグのような、使用することができます

あなたの特定のケースで
load reg1, [memaddr] ; loading zero from memory 
    dec reg3    ; decrementing if we go 1 -> 0 

STRは実際コンディを変更しませんブランチに影響を及ぼすのはADDSです(実際には、ADDはこれを指定しないので、これを指定するのはSという接尾辞です)。

ADDS R2, R2, #200の結果(最終結果がR2)が0の場合、ブランチが作成されます。

初期値はFFFFFF38hであり、あなたが200C8h)を追加した場合、実際の場合になります。

FFFFFF38 
     C8 + 
    -------- 
(1)00000000 = 
関連する問題