ドキュメントでは、それはレジスタの論理サイズであるため、«16ビットレジスタ»として表示されます。
実際の実装(プロセッサの作成方法)では、9ビットしか持たないことがよくあります。他の "ビット"はグラウンドピンに直接接続されたラインです(または電圧が+ 1.2Vかどうかは関係ありません)。これはメモリが高価で、数ビットを節約できれば安いです5ビットx1000万プロセッサを節約しています...)
新しい実装では、コンピュータは自動的にそのような処理を行いますが、それほど気にしないと思います。いつも0にしておけばいいですね。
プログラマーとして、あなたが関係する限り、それは16ビットです。ハードウェアエンジニアの場合、はちょうど 9ビットです。スタック上のフラグを適切にプッシュできることを確認するだけで済みます(他の5ビットは常に既知の値になり、ほとんどの場合ゼロになります)。
さらに詳細:
フラグレジスタにアクセスするには、プログラマーとして、あなたはPUSHF
とPOPF
を使用しています。
; read to AX
PUSHF
POP AX
; write from AX
PUSH AX
POPF
(上記FUZxxlコメントに関しては注意点として、古いPUSHF及びPOPF命令は16ビットで、新しいバージョンが32または64ビットである。これは、適切に整列スタックを維持することが重要です。)
Ped7gで説明したように、AXに任意の値を入れてPUSH
+ POPF
にすることはできますが、それは良い方法ではありません。あなたは指示がないそのためのフラグを変更したいとき通常、あなたが実行します。
PUSHF
POP AX
OR 10h ; set flag A to 1
PUSH AX
POPF
フラグを変更する他の方法は、特定の命令を使用することです。これは命令で直接定義されています。 CLD
とSTC
のように、フラグを直接クリアまたは設定する命令がいくつかあります。そして、借り入れを微調整するSBB
やキャリーを調整するADC
などがあります(とN、Z、Vフラグ...)
最後に、分岐命令で基本フラグをチェックする方法があります。多くの場合、これはCMP
命令で使用されます(新しいプロセッサでは、フラグが変更される理由はたくさんあります)。これにより、レジスタが別の値と比較され、小さい、大きい、小さいか等しい、大きいか等しい、オーバーフローを生成します。したがって、JC
のような命令は、Cフラグを読み取り、真(1に設定)ならジャンプします。
古いプロセッサでは、ほとんどのフラグはブランチにリンクしています。 8086は、 "算術演算"(加算と減算を10進数で行う)と "Direction"のDフラグ(LOOPCX
、MOVB
を参照)にAフラグを追加しました。
その後、ここにはあまり挙げられないほどの多くのフラグが追加されました。これらの中には特定の命令が存在するかどうかを知るのに便利なものもありました。それ以来、私たちは拡張機能のためにCPUID
命令を持っています。あなたはCPUについて知る必要があり、実行時にパッチすることさえできます。
図が正しくありません。すべてのビットについては、[here](https://en.wikipedia.org/wiki/FLAGS_register)を参照してください。 – fuz
FLAGSレジスタは32ビットのEFLAGSレジスタに展開されてから64ビットのRFLAGSレジスタに展開され、最初の16ビットを超えるビットが意味を持ちます。 – fuz
@FUZxxl、彼は8086について話しているのではなく、より進歩したペンティアム、セレロン、ゼオンのプロセッサではないことを「明らかに」質問しています。 –