2016-04-12 127 views
5

全部の旗が私の外から混乱しています。 Web上の定義は本当に明白です。私はこのすべてに本当に良い説明を得ることはできないようです。ゼロフラグ、符号フラグ、オーバーフローフラグ、キャリーフラグの設定方法は?

はその定義によれば、 は - キャリー - :符号付き整数オーバーフロー 示す - ゼロ:オーバーフロー符号なし整数オーバーフロー を示す動作はゼロ 作製 - 記号:操作が

どのように負の値を生成しました次のような文章がありますか? - 次の手順は、サインフラグを設定します:(。ここでは答えは負の数252ではない、なぜ符号フラグのセットです?)

mov al,0FEh 
sub al,2 
  • 8ビットに7Fhのと05Hを追加しますレジスタはオーバーフローフラグを設定します(ここでの回答は132です.255を超えてオーバーフローが発生する理由は?)

  • 8ビットレジスタに0FFhと05hを追加しても、 300はどのようにオーバーフローフラグがありませんか?256より上です)

  • 8ビットレジスタに5から0FBhを追加すると、ゼロフラグがセットされます(ここでの答えは0ではなく、256です)。8ビットは255しか保持できませんが、 "0"はどこから来ますか?私はちょうどそれを得ることはありません)

誰かが私がここで間違っていることを教えてください、これに近づく正しい方法は何ですか?おかげさまで

+1

負の数値が2の補数で表される仕組みについては、こちらをご覧ください。 – EOF

+1

_ "ここでの答えは252ではありません" _答えは0xFCで、252または-4として表示されます。インテルマニュアルの符号フラグのデシジョンは、 "符号付き整数の符号ビットである結果の最上位ビットに設定されます(0は正の値、1は負の値を示します)。" _ 。 0xFCには明らかに最上位ビットが設定されています。 – Michael

+1

_ "8ビットは255を保持できるだけで、" 0 "はどこから来るのでしょうか?" _ 256の最下位8ビットの値は何ですか? – Michael

答えて

6

ここでの回答はマイナスの数字ではありません。では、なぜ署名フラグが設定されていますか?

符号なしとして、それは252であるが、符号なしの符号を持つことができないので、に署名したように符号フラグのみ扱う数に関連しています。どのように扱うかは関係ありません。プロセッサは常にsignフラグで署名して処理します。したがって、252は127を超えているため、2の補数で負であり、符号ビットが設定されます。 8ビットのレジスタで7Fhのと05Hの追加

は、オーバーフローフラグを設定します。(ここでは答えはオーバーフローがあり、なぜそれはとても255を超えていないのです132ある?)

あなたが言ったように、 符号がオーバーフローしたときにオーバーフローが設定されます。符号付きの8ビット変数は-128から127になります。したがって、127から132になるのはオーバーフローです。 8ビットレジスタに0FFHと05Hを追加

オーバーフローフラグを設定しません。(答えは300であるので、どのようにオーバーフローフラグがないのですか?それは256より上だ)

再び、オーバーフローはとなり、がオーバーフローします。これにより、符号なしがオーバーフローするので、キャリービットが設定されます。8ビットのレジスタで0FBhに5を追加

はゼロフラグを設定します(ここでは答えは、私は8ビットのみ255を保持することができますが、ここで、「0」から来たん理解256、0でないのですか?Iちょうどそれを得ることはありません。)

をあなたが言ったように、8ビットはをオーバーフローし、最下位8ビットが0だから、結果がゼロであり、ゼロビットであることを後に255まで行くことができますセット。

+0

ありがとうございました!私の脳はこれを理解しようとすることから閉ざされていますが、あなたの答えはもっと意味があります。私は休憩をとる必要がありますし、これをもっと実践してください。再度、感謝します! – rose

1

もう1つの優れたガイド:Understanding Carry vs. Overflow conditions/flags。それはあなたの頭の中にすべてのものを保つのを簡単にする4ビットの数字でいくつかの良いステップバイステップの例があります。また、署名されていないキャリーは、ビットを符号なしとして解釈するときにチェックしているものであり、符号付きのオーバーフローはビットを符号付きとして解釈するときにチェックしているものです。

んゼロフラグが本当に8最下位ビットの値が0であるときにオンされ、そしてちょうど「操作は0を生成しないときという意味:OPさんのコメントに基づいて


"

覚えておくべき重要なことは、固定幅整数演算であることです。 8ビットレジスタに、0xFFの+ 1は、実際にこれは、8ビット動作用の2 の弾性率を有する、modular arithmeticであり、数学的に0

を生成ありません。

はそうです、ZFdst = (dst+src) % 0x100に応じて設定されています。

これは、通常、レジスタがゼロかどうか、ゼロに向かってカウントアップしているかどうか、負の値で始まったレジスタにincでカウントしているかどうかを知りたいからです。正に開始したレジスタ。

キャリーなしでゼロを取得した場合でも、CF==0ZF==1を検出してそのケースを検出できます。 dstCFが両方ともゼロだった場合にのみZFが設定されていると、結果レジスタをテストするために別の命令が必要になることがよくあります。

JA  Jump if above (CF=0 and ZF=0). 
JAE  Jump if above or equal (CF=0). 
JB  Jump if below (CF=1). 
JBE  Jump if below or equal (CF=1 or ZF=1). 

JC  Jump if carry (CF=1). 

JE  Jump if equal (ZF=1). 

がなかったとき、ZFにのみ設定することができれば、私はを考える:このようなcmpまたはsub仕事の後、符号なし条件コードというCFとZF独立した平均値を持つ


あなたは上記とAbove-or-Equalの差を教えてもらえません。だから、それはおそらくへのデザインの決定のための最も具体的な理由ではないあなたの最初の推測が行われていた方法になります。

はここで比較署名した条件の一つだ:jcc下、

JLE  Jump if less or equal (ZF=1 or SF ≠ OF). 

条件のフルセットがIntelのinsnのセットのリファレンス・マニュアルである(タグウィキ内のリンク)(ジャンプであれば条件コード)命令リスト。

関連する問題