2012-11-17 21 views
12

INC(インクリメント)とDEC(デクリメント)のx86命令がフラグレジスタのCF(キャリーフラグ)に影響しないのはなぜですか?なぜINCおよびDEC命令はキャリーフラグに影響しませんか?

+1

@AndreasBrinckその質問は「なぜ?」についての質問ではなく、そこの回答はデザインの選択肢の質問に答えるものでもありません。 –

+4

これはまったく重複していません。もう一つの質問は* INC/DECを使う方法を尋ねて、桁上げが更新されていないことを単に観察します。この質問は*なぜ*更新されていないかを尋ねます。私は、司会者が銃を飛び去っているということを示すいくつかの人々が、質問を正確な重複として閉じようとしているという事実を見出します。それはSOHのための有用なIMHOではありません。 –

答えて

23

32ビットと64ビットの値を持つ現在の "x86" CPUが、より限定された8ビットマシンとしての生活を開始したことを覚えておく必要がある理由を理解するために、Intel 8008に戻ってください。 1973年、私はまだそれを覚えています!)。

その世界では、レジスタは貴重で小さくありました。さまざまな目的のためにinc/decが必要です。最も一般的なものはループ制御です。多くのループは "多精度算術演算"(例えば16ビット以上)を行うことに関係していました。inc/decにZビットを設定することによって、ループを制御するのに非常にうまく使えます。ループ制御命令がキャリービットを変更しないと主張することによって、キャリーはループ反復にわたって保存され、キャリー状態を記憶するコードを書くことなく、複数精度演算を実装できます。

醜い命令セットに慣れれば、これはかなりうまくいきました。

ワードサイズの大きい最新のマシンでは、これはあまり必要ないので、INCとDECは意味的にADD ...、1などと同じ意味になります。実際には、キャリーセット: -

ほとんどの場合、部分的な条件コードの更新が行われ、パイプラインで面白いストールが発生する可能性があるため、ADD/SUBはINCとDECから離れています。それで問題ない場所(ほとんどの場所)では、ADD/SUBを使って屋台を避けます。例えば、1つか2つの命令のサイズが問題に十分に影響を及ぼすキャッシュラインにフィッティングするなど、コードを小さな問題のままにする場合にのみ、INC/DECを使用します。おそらく無意味なnano [文字通り!] - 最適化ですが、私は自分のコーディングの習慣でかなり古い学校です。

私の説明は、INC/DECがゼロビットを設定する理由を説明しています。 INC/DECが符号(とパリティビット)を設定する理由について、特に という説得力のある説明はありません。

編集:2016年4月:現代のx86では、ストールの問題がよりよく処理されるようです。 INC instruction vs ADD 1: Does it matter?

0

影響を与える必要がないためです。ゼロフラグをチェックするだけで十分です。 したがって、inc命令とdec命令の後では、キャリーフラグは同じままであり、場合によってはこれが便利です。

4

あなたは[INC]/[DECによってゼロフラグを設定している記号が最高の質問に対処されている理由の質問:あなたは、むしろオプションなしで行うのでしょうか?既に明らかIra Baxterとして

a) for (n=7;n>=0;n--) // translates to `dec + jns` 
b) for (n=8;n>0;n--) // translates to `dec + jnz` 

、キャリー・フラグアルゴリズムの多くで使用されている - モノクロ/ CGA/EGA時代のみならず多倍精度演算だけでなく、たとえばビットマップの処理のために: これは80ピクセル幅の行いずれかをシフトしますピクセル右...

 mov cx, 10 
begin: lodsb 
     rcr al,1 // this is rotate though carry: 
     stosb  // for the algorithm to work, carry must not be destroyed 
     LOOP begin // 

ただし、なぜパリティですか?

私はその答えはなぜではないと信じています。この命令セットは、トランジスタが不足していた70年代後半からのものです。特定の命令のパリティフラグの計算を拒否することは意味をなさないでしょうが、CPUの複雑さに追加されました。

関連する問題