0

Zilog Z80 プロセッサに関する本を読んでいます。著者は、考えられる理由でキャリー ビットをクリアしたいときはいつでも、次のいずれかを行います。

XOR A
AND A
OR  A

それはFレジスタにあるCビットにどのように影響しますか? 言い換えれば、あるレジスター (A) で操作を実行すると、別のレジスター (F) にどのように影響するでしょうか?

4

4 に答える 4

7

私はあなたの懸念を理解していると思います。フラグ レジスタは演算の結果を取得するため、AND、OR、XOR のすべてがゼロ フラグ、符号フラグ、およびパリティ フラグに影響することは理にかなっています。これらはすべて、結果の直接的なプロパティです。ただし、演​​算は算術演算ではないため、キャリーは自然なプロパティではありません。

答えはALU自体にあると思います。プログラマーとして、ALU を多機能ボックスと見なします。値と操作を与えると、副産物としてフラグを設定するアキュムレータでその操作を実行します。内部的には、加算、減算、または xor という演算ごとに個別の回路があると思われます。

実際には、目的の操作を実行するために変更できる各ビットの多目的機能に似ています。大まかに言えば、add と add with Carry でこれを見ることができます。これらの命令の内部的な違いは、加算の実行にキャリー フラグを使用するかどうかだけです。同様に、減算は数の 2 の補数を加算するだけです。したがって、減算はオペランドのフロントエンドの変更のみがあり、同じ加算回路を使用します。

ここで、単一ビットで加算を行う方法を考えてみましょう。キャリーを無視すると、0+0 = 0、0+1 = 1+0 = 1、1+1 = 0 であることに注意してください。では、キャリーはどうでしょうか? キャリー(0+0) = キャリー(0+1) = キャリー(1+0) = 0 およびキャリー(1+1) = 1.

それらの機能を認識していますか?2 ビットの桁上げは AND です。加算された 2 ビットの結果は、それらの XOR です。この考え方をもう少し拡張すると、単純な回路で 2 つのビットをキャリー入力と一緒に加算し、結果のビットとキャリー出力を生成する方法がわかります。それらを 8 つつなげると、数字が加算されます。

プロセッサーを設計していた場合、XOR をほぼ無料で入手できることに気付くかもしれません。XOR は 2 つの数値を加算するだけで、ビットからビットへの桁上げを停止します。同様のショートカットを使用すると、キャリー計算から通常得られる AND 値を引き出すことができます。そこに OR を見つける別のトリックがあると確信しています。Z-80 の設計者は AND および XOR ゲートを使用せず、回路から生成できるものにおいてさらに柔軟な生のトランジスタ ロジックを使用していたため、ここで詳細が非常に重要になります。

とにかく、今は選択肢があります。私たちの XOR は、各ビット間のキャリーをゼロにしています。8ビット目はどうですか?まあ、それもゼロにする必要があります。そうしないと、キャリー ビットは符号ビットの AND になり、アセンブラー プログラマーを混乱させ、悩ませ、あまり役に立たないように思われます。しかし、他のすべてのビットと同じようにキャリー ビットをゼロにすると、きれいな対称回路が得られ、結果は明確で明確になります。そして、値を無視するよりもゼロにする方が簡単だと思います。

したがって、ゼロキャリーを通過させることで、いくつかのトランジスタを節約できます。そして、その副作用は、"OR A,A" や "AND A,A" のような操作で役に立ちます。現在、Z-80 は 8080 からこの動作を継承しているため、実際には Z-80 ではなく 8080 の設計者が選択したものです。キャリーに直接影響を与える操作は、SCF - キャリー フラグを 1 に設定し、CCF - キャリー フラグを補完する 2 つしか与えられていないため、命令セットでそれについて考えていることがわかります。「OR A、A」はすでに無料でそれを行っているため、彼らは明示的に「クリアキャリーフラグ」を提供することを避けました。したがって、ビジネス全体で命令全体が保存されます。そして、論理演算でキャリーフラグをゼロにすることは、プログラミングの大きな障害にはならないと彼らは推論したとしか思えません。ほとんどの場合、あなたの 論理計算または算術計算のいずれかを実行しているため、キャリーをザッピングする論理演算は大したことではありません。明らかに、他の CPU 設計者は同意しませんでしたが、それは公正な選択です。

結論: キャリーをクリアすることは回路の自然な結果であり、8080 の設計者は維持するのに有用な副作用であると判断し、それを抑制するために回路を追加するのではなく、そのままにしておくことを選択しました。

具体的な詳細については、Z-80 ALU が内部でどのように動作するか、および8085 ALU 内部を参照してください。

于 2016-09-27T20:14:55.500 に答える
1

ほとんどのプロセッサは、マイクロコードと呼ばれるものを使用して作成されています。1 つのマイクロコード命令が 1 つの非常に小さなことを行います。

したがって、OR A命令が次のようなことを行うことを示すことができます。

OR A     tmp ← A              modify register "tmp"
         tmp ← tmp | A        apply OR and save result in "tmp"
         A ← tmp              copy "tmp" back to A
         F[C] ← 0             clear C flag
         F[Z] ← A == 0        set Z to 1 if A == 0, zero otherwise
         F[N] ← A[7]          set N to sign bit of A

これは A に影響を与えないため、命令の名前を変更した可能性があることに注意してくださいCLC(キャリーのクリア)。

他の人が述べたように、C フラグのクリアは、z80 の設計者が決定した選択でした。ほとんどのプロセッサは、論理演算 (AND、OR、XOR、NAND...) で C フラグに影響を与えません。

于 2016-09-27T17:58:58.610 に答える