2017-07-29 5 views
0

EFLAGSレジスタには、キャリーフラグとオーバーフローフラグがありますが、これらのフラグの用途は何か不思議です。EFLAGSレジスタのキャリーフラグとオーバーフローフラグの用途は何ですか?

私は、以下の用途を考えることができます:

  • 私は2つの符号なし整数を追加していて、私は 追加が成功したかどうかを知りたい場合(つまり、指定したレジスタに装着した結果であります/メモリ)、キャリーフラグが に設定されているかどうかを確認します(設定されていない場合は、追加に成功しました)。

  • 2つの符号付き(2の補数)の数を加算していて、加算が成功した場合(すなわち、符号ビットがあふれずに指定されたレジスタ/メモリに適合した場合)、 は、 オーバーフローフラグが設定されているかどうかを確認します(設定されていない場合は、追加は になりました)。

これらの使用は正しいですか?それ以外の用途はありますか?

+0

https://en.wikipedia.org/wiki/Carry_flagおよびhttps://en.wikipedia.org/wiki/Overflow_flag –

+0

キャリーフラグの使用法については、複製記事で詳しく説明していますが、他の部分そうではありません。私はOFを使って何のトリックも見ていないが、興味があるだろう。 –

答えて

2

フラグは条件付き命令(条件付きジャンプ(jCC)および条件付き移動(cmovCCおよびfcmovCC)を制御する唯一の方法です。したがって、あなたがいくつかの条件に応じて選択をしたいときはいつでも

  • は2つの数字に等しいですか?
  • は、もう1つ大きな数字ですか?
  • は数字がゼロですか?
  • は、数字に特定のビットが設定されていますか?
  • は、数字のパリティが偶数か奇数か?

フラグレジスタが必要です。この目的のために、cmp命令が存在します。オペランドを減算し、結果を破棄してフラグを設定します。このようにして、数値を比較し、結果に応じて何かを行うことができます。 2つの数字の順序がフラグに与える影響については、this tableを参照してください。

最後に、フラグ(特にキャリーフラグ)を使用して大きな数値を加算することもできます。これは、キャリーを引き継ぐか、またはより小さな数字から高い数字に借りるadcおよびsbb命令を使用して容易になります。

+0

私が質問に出した用途はどうですか?正しいのですか? –

+1

はい、しかし彼らはスーパー共通ではありません。 – fuz

+0

@joseph_m通常は、コードの設計によってデータ型のオーバーフローを解決し、入力値をサニタイズします。計算の途中では、キャリー/オーバーフローをもうチェックしません。デザインがオーバーフローして適切に処理されることが期待されます。特別なシナリオ(動的な "電卓"のようなユーザーエクスプレッションの評価、オーバーフローの場合は "エラー"を避ける)で有効になることがありますが、ほとんどのSWはチェックなしでメイン計算を実行するように設計されていますそれはずっと速い)。 – Ped7g

関連する問題