ARMアセンブリを調べていたところ、EOR/XORとANDがすべてCフラグとOフラグを設定していることに気付きました。それはどのように機能しますか?それらは常にクリアされていますか?彼らはどのような条件を設定していますか?
4 に答える
ARM アセンブラーを使用し続ける場合は、ARM アーキテクチャ リファレンス マニュアルである ARM ARM のコピーが必要です。多くのバージョンがあり、それぞれに独自の「機能」があります。できるだけ多く集めることをお勧めしますが、それは別の話です。無料で電子コピーを入手するには、いくつかの方法があります。どちらにしても:
AND ARM の場合、AND の代わりに AND を使用することを意味する S ビット セットが必要です。親指モードでは、常に ANDS を使用しますが、たとえば、ガスは親指モードで ANDS を受け入れることを拒否します (ただし、常に ANDS として逆アセンブルします)。
If S==1 and Rd == R15 then
CPSR=SPSR
else if S==1
N Flag = Rd[31]
Z Flag = if Rd == 0 then 1 else 0
C Flag = shifter_carry_out
V flag = unaffected
フラグに関しては、EOR は AND と同じです。
通常の AND/EOR がキャリー フラグとオーバーフロー フラグを設定するとはまったく思えません。ANDS および EORS バリアント (AND/EOR with set) はキャリーを設定できますが、右側がシフトされたオペランドである場合に限ります。これらはどちらも、オーバーフロー フラグにはまったく影響しません。
例えば、
ANDS R0,R1,R2, LSR #1
R2のb0に応じてキャリーを設定します。ビットが 1 (つまり、R2 が奇数) の場合、キャリーがセットされます。
詳細については、こちらを参照してください (第 3 章、命令セット)。
他の投稿者が指摘したように、C フラグは、操作前にソース レジスタの 1 つにオプションで適用されるシフトに基づいて更新されます。
V (オーバーフロー) フラグは、これらの命令の影響を受けません。
結果が正確にゼロの場合は Z フラグが設定され、2 の補数の整数として表示したときに結果が負の場合 (つまり、上位ビットが 1 の場合) は N フラグが設定されます。
演算後に結果を任意にシフトできることを思い出してください。キャリーフラグは、バレルシフタからのキャリーアウトに基づいてセットされます。オーバーフロー フラグは影響を受けません。