FromNandの日記

自分的備忘録

【EFLAGS】CF(キャリーフラグ)について考察してみた

CFは主に符号なし計算に使われるフラグで、JA・JBといった条件分岐にしようされます。

 

CFが立つのは次の3つの場合が存在します。

  • 足し算した結果、繰上りが起こった場合
  • 引き算した結果、繰下がりが起こらなかった場合
  • SEC命令によって強制的に立てた場合

 

多くのコンピュータの内部では2の補数表現が使用されていますので、正の数同士の引き算は内部的には足し算で計算されています。

個人的にはこの部分が少し理解しにくかったです。

 

さて、「上記の足し算した結果、繰下がりが起こらなかった場合」という部分が理解しにくい方もいらっしゃると思います。

実は、2の補数表現では次のような法則が成り立ちます。

・「繰り下がりのない引き算は、内部的には繰り上がりのある足し算」

・「繰り下がりのある引き算は、内部的には繰り上がりのない足し算」

 

例として「5 - 3」と「5 - 6」を考えてみます。

 

「5 - 3」は2進数では「0101 + 1101」と考えることができます。

計算結果は「10010」となり、繰り上がりが発生しています。

しかし、10進数の世界では「5 - 3」では繰り下がりが発生しません。

つまり「繰り下がりのない引き算は、内部的には繰り上がりのある足し算」であると考えられます。

よって、CFは1にセットされます。

 

「5 - 6」は先ほどと同様に「0101 + 1010」と考えることができます。

計算結果は「1111」となり、繰り上がりは発生しません。

しかし、10進数の世界では「5 - 6 = -1」というふうに繰り下がりが発生します。

つまり、こちらも「繰り下がりのある引き算は、内部的には繰り上がりのない足し算」と考えられます。

よって、CFは0のままです。

 

 

参考「http://donkeyhacks.zouri.jp/databank/65C816/function/carry.html」「https://lipoyang.hatenablog.com/entry/20131031/p1