コンピュータプロセッサでは、キャリーフラグ(通常はC フラグとして示される)は、システムステータスレジスタ/フラグレジスタの 1ビットで、算術キャリーまたはボローが最上位の算術論理演算ユニット(ALU) ビット位置から発生したことを示すために使用されます。キャリーフラグを使用すると、部分的な加算/減算からバイナリ数字を上位ワードの最下位ビット位置にキャリー (加算) することで、単一の ALU 幅を超える数値を加算/減算できます。これは通常、プロセッサのユーザーがアセンブリまたはマシンコードレベルでプログラムしますが、一部のプロセッサでは (組み合わせ式、または「物理的」) ALU よりも広いレジスタと算術命令を持つため、デジタルロジックまたはマイクロコードを介して特定のプロセッサで内部的に発生することもあります。 [ 1 ]また、多くのプロセッサで同様の方法でビットシフトと回転を拡張するためにも使用されます(専用のフラグを介して行われる場合もあります)。減算演算では、2つの(反対の)慣習が採用されています。ほとんどのマシンは借用時にキャリーフラグを設定しますが、一部のマシン(6502やPICなど)は借用時にキャリーフラグをリセットします(逆も同様)。
キャリーフラグは、ほとんどの算術(および通常は複数のビット単位)命令の結果によって影響を受け、また、それらの多くへの入力としても使用されます。これらの命令のいくつかは、キャリーを読み取るか無視するかの 2 つの形式を持っています。アセンブリ言語では、これらの命令は、ADD/SUB (ADC/SBCキャリーADD/SUBを含む)、SHL/SHR(ビットシフト)、ROL/ROR(ビット回転)、 (キャリーを介して回転)などのRCR/RCLニーモニックで表されます。[ 2 ]このようにキャリーフラグを使用することで、複数ワードの加算、減算、シフト、回転操作が可能になります。
11111111255 + 255 ( + )を計算してみましょう。結果は 510 となり、これはバイナリで111111119 ビットの値です。しかし、 8 ビットレジスタを使用する場合、レジスタには下位 8 ビットのみが格納されます(バイナリ、10 進数では 254)。ビット 7 (8 番目のビット) から桁上がりが発生するため、桁上がりフラグが設定され、結果が 9 ビットであることを示します。有効な 9 ビットの結果は、桁上がりフラグと結果を連結したものです。11111111011111110
その他の一般的なALUステータスレジスタのSign_Flagビットは、セット、Zero_flagクリア、クリアとなりますOverflow_Flag。
11111111が符号付き整数 −1 の 2 の補数表現 (x86 命令) を表す場合、がクリアされ、が無視されるADD al,-1ため、結果の解釈は −2 となります。 がセットされているため、結果の符号は負になります。は符号付き整数 −2 の 2 の補数表現です。Overflow_FlagCarry_FlagSign_Flag11111110
11111111が符号なし整数バイナリ数 255 (x86 命令) を表す場合ADD al,255、結果の解釈は 254 となりますが、これは正しくありません。なぜなら、結果の最上位ビットが に格納されるためCarry_Flag、それを無視することはできないからです。 とOverflow_FlagはSign_Flag無視されます。
別の例として、ビットパターンとキャリーフラグがセットされた8ビットレジスタが挙げられます。キャリーを通して左回転命令を実行すると、最上位ビット(ビット7)がキャリーに回転され、キャリーが最下位ビット(ビット0)に回転されるため、結果としてキャリーフラグはクリアされます。0101010110101011
Intel 4004やIntel 8008に至るまで、ほとんどのマイクロプロセッサには、キャリーフラグを設定およびリセットするための専用命令が用意されていました。例外はIntel 8080(およびその派生版であるZ80)で、キャリーフラグをクリアするビット単位の論理命令(AND、OR、XOR)のいずれかで操作を実行できたため、明示的なキャリーリセット命令コードは含まれていませんでした。
キャリーフラグは、比較命令(通常は減算演算として実装される)の後にもよく使用され、比較対象の2つの値のうちどちらが小さいか(または大きいか等しいか)を判断するために使用されます。キャリーフラグを調べる分岐命令は、キャリーがクリアされている場合は、キャリーがセットされている場合はといったニーモニックBCCで表されることがよくあります。このように使用される場合、キャリーフラグは値を符号なし整数として比較するメカニズムを提供します。これは、値を符号付き整数として比較するメカニズムを提供するオーバーフローフラグBCSとは対照的です。
キャリーフラグは加算においては明確に定義されているが、減算演算においてキャリーフラグを使用する一般的な方法は2つある。
最初の方式では、ビットを借用フラグとして使用し、a − bを計算する際にa < bの場合にビットをセットし、借用を実行する必要があります。a ≥ b の場合、ビットはクリアされます。借用ありの減算( ) 命令では、 a − b − C = a −( b + C )が計算されますが、借用なしの減算 ( ) では、借用ビットがクリアされているかのように動作します。6800、680x0、8051、8080 / Z80、およびx86 [ 2 ]ファミリ (その他) では、借用ビットが使用されます。SBBSUB
2 つ目の方法は、− x = ( not x )+1という恒等式を直接使用し(つまり、キャリー ビットを反転して格納しない)、a − b をa +(not b )+1として計算します。キャリー フラグはこの加算に従って設定され、キャリー付き減算ではa +not( b )+ Cが計算されますが、キャリーなし減算ではキャリー ビットが設定されているかのように動作します。結果として、a ≥ bの場合はキャリー ビットが設定され、a < bの場合はクリアされます。System /360、[ 3 ] ARM、POWER / PowerPC、6502、MSP430、COP8、Am29000、i960、および88000プロセッサはこの規則を使用しています。6502 は特に有名な例で、キャリーなし減算演算がないため、プログラマは借りが必要ないすべての減算演算の前にキャリー フラグが設定されるようにする必要があります。[ 4 ]
上記に挙げたプロセッサ(過去数十年間で最も人気のあるマイクロプロセッサを含む)は、これらの演算をそれぞれ「借用減算」および「桁上げ減算」と呼んでいるが、その命名法は一貫していない。VAX 、NS320xx、Fairchild Clipper 、およびAtmel AVRアーキテクチャは借用ビット規約を使用しているが、a − b − C演算を「桁上げ減算」と呼んでいる ( 、、および)。PA -RISCおよびPICmicroアーキテクチャは桁上げビット規約を使用しているが、a +not( b )+ C演算を「借用減算」と呼んでいる (および)。H8 など他のプロセッサは、これを「拡張減算」と呼んでいる ( )。SPARC は借用規約、ニーモニック、および「桁上げ減算」という名称を使用している。SBWCSUBCSUBWCSBCSUBBSUBWFBSUBXSUBX
Motorola 6809 は、借りビット規約と両方の命名法を使用しており、演算を「借り付き減算」と呼んでいますが、ニーモニック略語を割り当てていますSBC。[ 5 ]
ST6 8ビットマイクロコントローラは、異なる意味で双方向性を持っています。「キャリー付き減算」命令のようなものはありませんが、減算命令によって設定されるキャリービットがあり、その規則はプロセッサモデルによって異なります。ST60プロセッサは「キャリー」規則を使用し、ST62およびST63プロセッサは「ボロー」規則を使用します。[ 6 ]
{{cite book}}: CS1 maint: bot: 元の URL の状態が不明です (リンク)