2017-01-20 10 views
-2

私はこのアセンブリPOPFとRCL/RCR命令

mov ax , 0x00FF 
push ax 
popf 
rcr ax , 1 

をコンパイルするとき、私は答えとして807Fを得る私はなぜだろうか。私はpopfがスタックの先頭をフラグレジスタに移動することを知っていますが、それはどのようにしてCFに影響しますか?移動した単語の最初または最後のビットのみを挿入しますか?

+2

なぜ命令セットリファレンスを参照していませんでしたか? 'EFLAGS'の最下位ビットは' CF'ですので、そこから設定されます。あなたの見方に応じて、それは最初か最後のビットです:) – Jester

+0

これは、あなたがAXからプッシュしたもので完全にフラグを上書きします。 –

+0

デバッガを使用します。これは、レジスタの値と各フラグの値を*リアルタイムで表示します。最良の結果を得るには、命令セットのドキュメント(命令+ x86の名前はGoogle)と組み合わせてください。 –

答えて

1

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がそこに置かれたため、まだ/再設定されています。

関連する問題