知識ベース

キャリーフラグ

符号なし算術オーバーフローが発生したかどうかを示すプロセッサフ​​ラグ

コンピュータープロセッサでは、 キャリーフラグ (通常Cフラグとして示される)は、算術キャリーまたはボローが最上位算術論理演算装置(ALU)ビットから生成されたことを示すために使用されるシステムステータスレジスタ/フラグレジスタの単一ビットです。ポジション。キャリーフラグを使用すると、部分的な加算/減算から、より重要なワードの最下位ビット位置に2進数を運ぶ(追加する)ことで、単一のALU幅より大きい数値を加算/減算できます。また、ビットシフトを拡張し、多くのプロセッサで同様の方法で回転するために使用されます(専用のXフラグを介して実行されることもあります)。減算操作では、2つの(反対の)規則が採用されます。ほとんどのマシンは借用時にキャリーフラグを設定し、一部のマシン(6502やPICなど)は代わりに借用時にキャリーフラグをリセットします(逆も同様)。

用途

キャリーフラグは、ほとんどの算術(および通常はビット単位)命令の結果の影響を受け、多くの命令への入力としても使用されます。これらの命令のいくつかには、キャリーを読み取るか無視する2つの形式があります。アセンブリ言語では、これらの命令は、ADD / SUB、ADC / SBC(キャリーを含むADD / SUB)、SHL / SHR(ビットシフト)、ROL / ROR(ビット回転)、RCR / RCL(キャリーを介して回転)などのニーモニックで表されます。 、 等々。この方法でキャリーフラグを使用すると、複数ワードの加算、減算、シフト、および回転操作が可能になります。

例として、8ビットレジスタを使用して255と255を追加した場合に発生することがあります。結果は510であり、バイナリで111111110であり、9ビットが必要です。レジスタに常に格納される8つの最下位ビットは11111110バイナリ(10進254)ですが、ビット7(8ビット)のキャリーが存在するため、キャリーが設定され、結果に9ビットが必要であることを示します。有効な9ビットの結果は、キャリーフラグと結果の連結です。

x86 ALUサイズが8ビット、8ビットの2の補数解釈の場合、加算操作11111111 + 11111111は、111111110、Carry_Flagセット、Sign_Flagセット、およびOverflow_Flagクリアになります。

11111111が2の補数符号付き整数-1(ADD al、-1)を表す場合、Overflow_Flagはクリアで、Carry_Flagは無視されるため、結果の解釈は11111110です。 Sign_Flagが設定されているため、結果の符号は負です。 11111110は、符号付き整数-2の2の補数形式です。

11111111が符号なし整数の2進数255(ADD al、255)を表す場合、Carry_Flagの結果の解釈は無視できません。 Overflow_FlagとSign_Flagは無視されます。

別の例は、ビットパターン01010101とキャリーフラグが設定された8ビットレジスタです。 キャリー命令で左回転を実行した場合、最上位ビット(ビット7)がキャリーにローテーションされ、キャリーが最下位ビット(ビット0)にローテーションされたため、結果はキャリーフラグがクリアされた10101011になります。

初期のマイクロプロセッサIntel 4004およびIntel 8008には、キャリーフラグを明示的に設定およびリセットする特定の命令がありました。ただし、後のIntel 8080(およびZ80)には、ビット単位のAND、OR、またはXOR命令(キャリーフラグを使用しない)のいずれかを介して同等に高速に実行できる明示的なリセットキャリーオペコードが含まれていません。

キャリーフラグは、通常、減算演算によって実装される比較命令に従って使用され、2つの比較された値のどちらが他方よりも小さい(または大きい)かを決定できるようにします。キャリーフラグを調べる分岐命令は、しばしばBCCやBCSなどのニーモニックで表され、キャリーが明確な場合は分岐し、キャリーが設定されている場合は分岐します。この方法で使用すると、キャリーフラグは、値を符号なし整数として比較するメカニズムを提供します。これは、符号付き整数値として値を比較するメカニズムを提供するオーバーフローフラグとは対照的です。

キャリーフラグとボローフラグ

キャリーフラグは加算に対して明確に定義されていますが、減算演算にキャリーフラグを使用する一般的な使用方法は2つあります。

B、およびボロー実行しなければならない-最初に計算するときにB場合に設定、ボローフラグとしてビットを使用します。 ≥bの場合、ビットはクリアされます。 ボロー付き減算 (SBB)命令はabC = a −( b + C )を計算しボローなし減算(SUB)はボロービットがクリアされているかのように動作します。 8080、Z80、8051、x86、および68kファミリ(特に)は、借用ビットを使用します。

2番目は、 -x = not( x )+1というアイデンティティを利用して、 a - ba + not( b )+1として計算ます。キャリーフラグはこの加算に従って設定され、キャリー付き減算は a + not( b )+ C 計算し キャリーなし減算はキャリービットが設定されているかのように動作します。結果は、キャリービットは≥bの場合に設定、およびBであれば明らかであるということです。 System / 360,6502、MSP430、ARM、およびPowerPCプロセッサはこの規則を使用します。 6502は、キャリー操作なしの減算持たないため、特によく知られた例です。したがって、プログラマーは、借用が不要なすべての減算操作の前にキャリーフラグを設定する必要があります。

キャリーまたは
ビットを借りる
引き算なし
キャリー/ボロー
引く
借りて
引く
キャリー付き
C = 0 ab
= a + not( b )+ 1
ab0
= a + not( b )+ 1
a + not( b )+ 0
= ab1
C = 1 ab1
= a + not( b )+ 0
a + not( b )+ 1
= ab0

最も一般的には、最初の選択肢は「ボロー付き減算」と呼ばれ、2番目は「キャリー付き減算」と呼ばれます。ただし、両方向には例外があります。 VAX、NS320xx、およびAtmel AVRアーキテクチャはボロービット規則を使用しますが、それらのa - b - C操作を「減算付きキャリー」(SBWC、SUBC、およびSBC)と呼びます。 PA-RISCおよびPICmicroアーキテクチャはキャリービット規則を使用しますが、それらのa + not( b )+ C操作を「減算で減算」(SUBBおよびSUBWFB)と呼びます。

ST6 / ST7 8ビットマイクロコントローラーは、おそらく最も混乱しやすいものです。それらには「キャリー付き減算」命令はありませんが、減算命令によって設定されるキャリービットがあり、その規則はプロセッサモデルによって異なります。 ST60プロセッサは「キャリー」規則を使用し、ST62およびST63プロセッサは「借入」規則を使用します。