INC
(インクリメント)とDEC
(デクリメント)のx86命令がフラグレジスタのCF
(キャリーフラグ)に影響しないのはなぜですか?なぜINCおよびDEC命令はキャリーフラグに影響しませんか?
答えて
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?
影響を与える必要がないためです。ゼロフラグをチェックするだけで十分です。 したがって、inc命令とdec命令の後では、キャリーフラグは同じままであり、場合によってはこれが便利です。
あなたは[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の複雑さに追加されました。
- 1. x86のINC命令はどのようにアトミックではありませんか?
- 2. 動的に$ INC命令
- 3. MIPS命令およびマシンコード
- 4. なぜshouldAutorotateは()のiPadには影響しませんか?
- 5. なぜem.persist()はデータベーステーブルに影響しませんか?
- 6. FirefoxでなぜFunction.prototype.func = ...はconsole.logに影響しませんか?
- 7. Vector3の方向は影響に影響しません
- 8. 'および'、 'または'命令を検出する
- 9. Android:TextView.setTextAppearance()はテキストサイズに影響しません
- 10. THREE.SmoothShadingはジオメトリに影響しません
- 11. SQLiteDatabase.updateは行に影響しません
- 12. fo:blockはページレイアウトに影響しません。
- 13. 命令キャッシュの制限の影響を実証する方法
- 14. x86のサブ命令と影響を受けるフラグ
- 15. x86/x86_64複数ソケット上のメモリ注文命令の影響
- 16. mallocはRAMの使用に影響しません。なぜですか?
- 17. なぜKeep.NoneはAkkaストリームの実行結果に影響しませんか?
- 18. D3ズームは軸にのみ影響し、データには影響しません
- 19. USERおよびWORKDIR命令はダウンストリームドッカーファイルに保持されますか?
- 20. SPARC v9にはダブルワード比較およびスワップ命令がありますか?
- 21. ncurses:init_color()は影響しません
- 22. `$ _SESSION`のキーの命名はセキュリティに影響しますか?
- 23. display:noneナビゲーションバーに影響しません
- 24. なぜCefSharp.WebBrowserExtensions.SetZoomLevelはすべてのインスタンスに影響しますか?
- 25. Touch Pro 2、ARMsチップ、および浮動小数点命令
- 26. OpenCL:GPU上の32ビットおよび64ビットpopcnt命令?
- 27. Canvas globalAlphaは画像に影響しませんか?
- 28. SwitchMapはカスタムテーマに影響しませんか?
- 29. djangoフィルタはパフォーマンスに影響を及ぼしませんか?
- 30. JBoss EAP:@TransactionTimeoutは@Timeoutメソッドに影響しませんか?
@AndreasBrinckその質問は「なぜ?」についての質問ではなく、そこの回答はデザインの選択肢の質問に答えるものでもありません。 –
これはまったく重複していません。もう一つの質問は* INC/DECを使う方法を尋ねて、桁上げが更新されていないことを単に観察します。この質問は*なぜ*更新されていないかを尋ねます。私は、司会者が銃を飛び去っているということを示すいくつかの人々が、質問を正確な重複として閉じようとしているという事実を見出します。それはSOHのための有用なIMHOではありません。 –