2

これは授業中に質問したものですが、わかりましたが、わかりません。ステータスレジスタ(8086)で実際に何ビットが使用されていますか?

ステータスレジスタは16ビットで、各ビットはフラグを持っています。しかし、私たちの講義スライドには、それ以外のイメージがありますか?

Status register

画像は、特定のビットが実際にフラグを持っていることを示しています。これらのビットだけが実際に使用されていることを意味しますか?残りの部分はちょうど飼料ですか?

私の質問が不明な場合は申し訳ありませんが、誰かが尋ねるともっと説明することができます。

現在は、実際には9ビットしか使用されていないと考えていますか?

+0

図が正しくありません。すべてのビットについては、[here](https://en.wikipedia.org/wiki/FLAGS_register)を参照してください。 – fuz

+0

FLAGSレジスタは32ビットのEFLAGSレジスタに展開されてから64ビットのRFLAGSレジスタに展開され、最初の16ビットを超えるビットが意味を持ちます。 – fuz

+1

@FUZxxl、彼は8086について話しているのではなく、より進歩したペンティアム、セレロン、ゼオンのプロセッサではないことを「明らかに」質問しています。 –

答えて

1

ドキュメントでは、それはレジスタの論理サイズであるため、«16ビットレジスタ»として表示されます。

実際の実装(プロセッサの作成方法)では、9ビットしか持たないことがよくあります。他の "ビット"はグラウンドピンに直接接続されたラインです(または電圧が+ 1.2Vかどうかは関係ありません)。これはメモリが高価で、数ビットを節約できれば安いです5ビットx1000万プロセッサを節約しています...)

新しい実装では、コンピュータは自動的にそのような処理を行いますが、それほど気にしないと思います。いつも0にしておけばいいですね。

プログラマーとして、あなたが関係する限り、それは16ビットです。ハードウェアエンジニアの場合、はちょうど 9ビットです。スタック上のフラグを適切にプッシュできることを確認するだけで済みます(他の5ビットは常に既知の値になり、ほとんどの場合ゼロになります)。


さらに詳細:

フラグレジスタにアクセスするには、プログラマーとして、あなたはPUSHFPOPFを使用しています。

; 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 

フラグを変更する他の方法は、特定の命令を使用することです。これは命令で直接定義されています。 CLDSTCのように、フラグを直接クリアまたは設定する命令がいくつかあります。そして、借り入れを微調整するSBBやキャリーを調整するADCなどがあります(とN、Z、Vフラグ...)

最後に、分岐命令で基本フラグをチェックする方法があります。多くの場合、これはCMP命令で使用されます(新しいプロセッサでは、フラグが変更される理由はたくさんあります)。これにより、レジスタが別の値と比較され、小さい、大きい、小さいか等しい、大きいか等しい、オーバーフローを生成します。したがって、JCのような命令は、Cフラグを読み取り、真(1に設定)ならジャンプします。

古いプロセッサでは、ほとんどのフラグはブランチにリンクしています。 8086は、 "算術演算"(加算と減算を10進数で行う)と "Direction"のDフラグ(LOOPCXMOVBを参照)にAフラグを追加しました。

その後、ここにはあまり挙げられないほどの多くのフラグが追加されました。これらの中には特定の命令が存在するかどうかを知るのに便利なものもありました。それ以来、私たちは拡張機能のためにCPUID命令を持っています。あなたはCPUについて知る必要があり、実行時にパッチすることさえできます。

+0

ありがとう、これはComputer Architectureクラスのため、ビットは答えとして プログラマが本質的に16ビットであるというだけのことですが、私はステータスレジスタをよく理解していません。プログラマがプログラミングのために16ビットすべてにアクセスできることを意味しますか? –

+0

@ManveerBhullar:私は予約ビットを修正しようとすると技術的に未定義の振る舞いと考えています。すべてのビットを読み込み、PUSHF(スタック上のフラグ)だけを読み込み、 'ax'のような通常のレジスタにポップすることができます。いくつかのCPUでは動作しないかもしれませんし、予期しないCPU上で予期せぬ結果を出すかもしれません(将来 "予約された"ビットが何らかの効果を持ち始めます)。エッセブル。 – Ped7g

+0

STDは、DF(方向フラグ)を1(後方)に設定しますが、私はSECが何であるかはわかりません。 CLD DFフラグをクリアします(フォワード)。 STCはCFキャリーフラグをセットし、CLCはそれをクリアする。 –

関連する問題