2011-11-07 10 views
6

私は8086命令セットを読んでいて、CMP(比較)がキャリーフラグを設定できると言います。私は、比較で2つのオペランドを減算することを理解していますが、そのような場合に誰かが例を提供できるかどうか疑問に思っていました。なぜCMP(比較)は8086アセンブリでキャリーフラグを設定するのですか?

私はちょうど数字を追加するという考えを理解することはできませんし、負の数はキャリーフラグを設定します。私は借りフラグを読みましたが、比較命令の理解を明確にするための例が必要でした。

また、3 - 5 = -2の場合、負のフラグがセットされると思います...キャリーセットはいつですか?

+0

「私は例を作る必要があります」というステートメントは、この音を宿題のようにします。既存のコードを使ってデバッグし、CYフラグを見るだけなら、いくつかの追加命令の後に設定されていることがわかります。 –

+0

私は自分の命令セットアーキテクチャを作成していますが、8086命令を読んで、比較(2つのオペランドを減算してそれぞれのフラグを設定する)がキャリーフラグをどのように設定できるか疑問に思っています。私はADDがキャリーを設定するときを知っていますが、私は減算/キャリー(借りと混同しないでください)について少し懐疑的です。 8086(および多くの他のもの)の – faul

+0

の場合、キャリーフラグは倍の義務を行い、減算または比較演算の借り入れを表します。比較される値がレジスタ内の値より大きい比較を行うと、CYフラグがセットされているなどの借用があります。値がレジスタと同じか小さい場合は、借用はなく、CYはクリアされます。 – JustJeff

答えて

4
  • キャリーフラグは、アンダーフローまたはオーバーフローの原因となった操作の後に設定されます。たとえば、6から10を引いた値がアンダーフローになり、キャリーフラグがセットされます。同様に、レジスタの最大値に1を加算するとオーバーフローが発生し、キャリーフラグがセットされます。
  • シフト動作中にキャリフラグも変更されますが、最後のビットの値をデスティネーションレジスタからシフトした値に設定されます( )。
  • ビットテストは、テストされたビットの値をキャリー フラグに置きます。これを行うオペコード:BT、BTC、BTR、およびBTS。
  • キャリーフラグに直接影響を与える命令は、CLC、CMC、およびSTCです。
  • 比較中、キャリ​​ーフラグは、2つのオペランドが減算されたかのように設定されます。
  • 否定(NEG)の間に、オペランドが でない限りキャリーフラグがセットされ、その場合はクリアされます。
2

キャリーフラグは、通常、符号なし演算を使用するときに設定されます。たとえば、2つの符号なし(結果がレジスタに収まらない)数値を加算すると、オーバーフローフラグは立てられず、キャリーフラグのみが立てられます。ただし、符号付き算術演算を使用する場合、そのようなイベントではオーバーフローフラグが設定されます。

1

this answerに関連する質問に整数値を加算または減算した後、キャリーフラグとオーバーフローフラグを0と1に設定した例があります。
また、8ビットの数値の桁上げ命令で桁上げと減算をエミュレートするサンプルCコードがあります。これを使用して遊ぶことができます。各番号は符号なしと符号付き括弧(2の補数)その隣の両方として表され
127(127) - 255( -1) - 1 = 127(127) CY=1 OV=0

出力形式のようなものがあります。 =より前の数値は、ADC/SBBより前のキャリフラグです。 CY=およびOV=は、ADC/SBBの後にキャリーおよびオーバーフローフラグを示します。

比較は、キャリー、オーバーフロー、符号とゼロフラグ(およびパリティと補助キャリーに影響しますが、ここでは重要ではありません)に影響する点を除いて、借用のない減算とほとんど同じです/メモリ。

関連する問題