-2
mov ax , 0x00FF
push ax
popf
rcr ax , 1
をコンパイルするとき、私は答えとして807F
を得る私はなぜだろうか。私はpopf
がスタックの先頭をフラグレジスタに移動することを知っていますが、それはどのようにしてCF
に影響しますか?移動した単語の最初または最後のビットのみを挿入しますか?
mov ax , 0x00FF
push ax
popf
rcr ax , 1
をコンパイルするとき、私は答えとして807F
を得る私はなぜだろうか。私はpopf
がスタックの先頭をフラグレジスタに移動することを知っていますが、それはどのようにしてCF
に影響しますか?移動した単語の最初または最後のビットのみを挿入しますか?
popf
を使用する前に、8ビットを設定した値をプッシュしました。これらのビットのうちの5ビットだけがのプロセッサーフラグを効果的に変更します。 popf
直後に
EFLAGSの最低の言葉のようになり登録:
-- NT IO/PL OF DF IF TF SF ZF -- AF -- PF -- CF
0 0 0 0 0 0 0 0 1 1 0 1 0 1 1 1
^ ^ ^
These bits you are not allowed to change
図からは、キャリーフラグが設定されましたことになります。 rcr ax, 1
命令は、0000000011111111(00FFh)をまだ保持していたAX
レジスタのビット15にCFをシフトするので、結果は1000000001111111(807Fh)になります。 CFは、AX
レジスタの古いビット0がそこに置かれたため、まだ/再設定されています。
なぜ命令セットリファレンスを参照していませんでしたか? 'EFLAGS'の最下位ビットは' CF'ですので、そこから設定されます。あなたの見方に応じて、それは最初か最後のビットです:) – Jester
これは、あなたがAXからプッシュしたもので完全にフラグを上書きします。 –
デバッガを使用します。これは、レジスタの値と各フラグの値を*リアルタイムで表示します。最良の結果を得るには、命令セットのドキュメント(命令+ x86の名前はGoogle)と組み合わせてください。 –