3

ARMアセンブリを調べていたところ、EOR/XORとANDがすべてCフラグとOフラグを設定していることに気付きました。それはどのように機能しますか?それらは常にクリアされていますか?彼らはどのような条件を設定していますか?

4

4 に答える 4

5

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 と同じです。

于 2009-08-02T05:43:54.737 に答える
4

通常の AND/EOR がキャリー フラグとオーバーフロー フラグを設定するとはまったく思えません。ANDS および EORS バリアント (AND/EOR with set) はキャリーを設定できますが、右側がシフトされたオペランドである場合に限ります。これらはどちらも、オーバーフロー フラグにはまったく影響しません。

例えば、

ANDS R0,R1,R2, LSR #1

R2のb0に応じてキャリーを設定します。ビットが 1 (つまり、R2 が奇数) の場合、キャリーがセットされます。

詳細については、こちらを参照してください (第 3 章、命令セット)。

于 2009-07-29T11:12:10.290 に答える
4

他の投稿者が指摘したように、C フラグは、操作前にソース レジスタの 1 つにオプションで適用されるシフトに基づいて更新されます。

V (オーバーフロー) フラグは、これらの命令の影響を受けません。

結果が正確にゼロの場合は Z フラグが設定され、2 の補数の整数として表示したときに結果が負の場合 (つまり、上位ビットが 1 の場合) は N フラグが設定されます。

于 2009-07-29T23:42:49.627 に答える
2

演算後に結果を任意にシフトできることを思い出してください。キャリーフラグは、バレルシフタからのキャリーアウトに基づいてセットされます。オーバーフロー フラグは影響を受けません。

于 2009-07-29T11:07:06.217 に答える