MYマイコンを作る(9) 
    オーバーフローを考える


 MYマイコンであるComet2eにあるフラグレジスタ(Flag Register:FR)のオーバーフローフラグ(Overflow Flag:OF)について考えます。

 フラグレジスタ(Flag Register:FR)は、OF(Overflow Flag),SF(Sign Flag),ZF(Zero Flag)と呼ぶ3 個のビットからなり,演算命令などの実行によって次の値が設定されます。
●SF,ZFの設定条件

 OF,SFの設定条件は、次の通りです。
 ・SFは、演算結果の符号ビット(ビット番号15 )をセットします。
 ・ZFは、演算結果が零(16ビット共 0 )のとき1をセットします。


●オーバーフローを考える

 オーバーフローは、演算結果が表現できる範囲内に収まらなかったことを言います。
 MYマイコンComet2eの数値は16ビットなので、表現できる範囲は次になります。
 ・符号付なら−32768 〜 32767
 ・符号無しなら0 〜 65535

 次に、「表現できる範囲内」を見ます。16ビットでは、桁数が多くなるので、解りやすく3ビットで見ます。

3ビットでの符号付き数値表現
−1 −2 −3 −4
011 010 001 000 111 110 101 100

3ビットでの符号無し数値表現
111 110 101 100 011 010 001 000


算術演算命令のオーバーフロー


算術演算
内容
オーバー
フロー
の発生
内容
正数+正数 数値により
発生する
演算結果は、正の方に増加する。
この演算結果が「表現できる範囲外」になればオーバーフローが発生する。
●3ビットの数値表現で見てみます
 ・2+1=3を見ます、2進数表現は010b+001b=011bです。
  結果の3(011b)は、「表現できる範囲内」なので、オーバーフローは
  発生しません。
 ・2+2=4の2進数表現は010b+010b=100bです。
  結果の100bは、10進表示では−4なので間違っています。
 「表現できる範囲外」なので、オーバーフローが発生します。
正数−正数 発生しない 整理すれば、正数と負数の加算になる。
演算結果の絶対値は小さくなるのでオーバーフローは発生しません。
負数−負数
負数+負数 数値により
発生する
演算結果は、負の方に増加する。
この演算結果が「表現できる範囲外」になればオーバーフローが発生する
●3ビットの数値表現で見てみます
 ・−2−1=−3を見ます、2進数表現は110b+001b=101bです。
  結果の−3(101b)は、「表現できる範囲内」なので、オーバーフローは
  発生しません。
 ・−3−3=−6の2進数表現では101b−011b=010bです。
  結果の010bは、10進表示では2なので間違っています。
 「表現できる範囲外」なので、オーバーフローが発生します。


算術演算命令の演算例

  1 001b   2 010b   2 010b   3 011b
  +  +     +  +     +  +     +  +  
  1 001b   1 001b   2 010b   3 011b
  ↓  ↓     ↓  ↓     ↓  ↓     ↓  ↓  
  2 010b   3 011b   4 100b   6 110b
  演算結果:○   演算結果:○   演算結果:×   演算結果:×

 ・左端は、1+1=2の場合です。演算結果は、010bなので「表現できる範囲内」です。
 ・左から2番目、2+1=3の演算結果は、011bなので「表現できる範囲内」です。
 ・左から3番目、2+2=4の演算結果は、100bになります。
  演算結果の100bは、上の「3ビットでの符号付き数値表現」を見ると「−4」です。
  「4」が求める数値ですが、「−4」になっています、「表現できる範囲外」です。
 ・右端、3+3=6の演算結果は、110bになり、これも「表現できる範囲外」です。
  「3」は、表現できる正の最大数です。


  3 011b   0 000b  −3 101b  −4 100b
  −  −     −  −     +  +     +  +  
  1 001b   3 011b   3 011b   0 000b
  ↓  ↓     ↓  ↓     ↓  ↓     ↓  ↓  
  2 010b  −3 101b   0 000b  −4 100b
  演算結果:○   演算結果:○   演算結果:○   演算結果:○

 ・左端、 3−1=2の演算結果は、010bなので「表現できる範囲内」です。
 ・左から2番目、0−3=−3の演算結果は、101bなので「表現できる範囲内」です。
 ・左から3番目、−3+3=0の演算結果は、000bなので「表現できる範囲内」です。
 ・右端、−4+0=−4の演算結果は、100bなので「表現できる範囲内」です。


 −1 111b  −2 110b  −3 101b  −4 100b
  −  −     −  −     −  −     −  −  
  1 001b   1 001b   3 011b   3 011b
  ↓  ↓     ↓  ↓     ↓  ↓     ↓  ↓  
 −2 110b  −3 101b  −6 010b  −7 001b
  演算結果:○   演算結果:○   演算結果:×   演算結果:×

 ・左端、−1−1=−2の演算結果は、110bなので「表現できる範囲内」です。
 ・左から2番目、−2−1=−3の演算結果は、101bなので「表現できる範囲内」です。
 ・左から3番目、−3−3=−6の演算結果は、010bになります。
  演算結果の010bは、上の「3ビットでの符号付き数値表現」を見ると「2」です。
  「−6」が求める数値ですが、「2」になっています、「表現できる範囲外」です。
 ・右端、−4−3=−7の演算結果は、001bになり、これも「表現できる範囲外」です。

 整理をすると
 ・正の数値と正の数値を加算した場合、オーバーフローすると負の数値になる。
 ・右端の3+3=6のように、表現できる正の最大数と正の最大数でも負の数値になる。
 ・正の数値−正の数値、負の数値+正数値の演算結果は、全て「表現できる範囲内」です。
 ・負の数値から負の数値を減算した場合、オーバーフローすると正の数値になる。
 ・右端の−4−3=−7のように、表現できる負の最大数と正の最大数でも正の数値になる。


論理演算命令のオーバーフロー


論理演算
内容
オーバー
フロー
の発生
内容
正数+正数 数値により
発生する
演算結果は、正の方に増加する。
この演算結果が「表現できる範囲外」になればオーバーフローが発生する。
●3ビットの数値表現で見てみます
 ・2+5=7を見ます、2進数表現は010b+101b=111bです。
  結果の7(111b)は、「表現できる範囲内」なので、オーバーフローは
  発生しません。
 ・2+6=8の2進数表現は010b+110b=000bです。
  結果の000bは、10進表示では0で間違っています。
 「表現できる範囲外」なので、オーバーフローが発生します。
正数−正数 数値により
発生する
被減数<減数の場合、演算結果は負数になります。
論理演算では負数は「表現できる範囲外」なのでオーバーフローします。
●3ビットの数値表現で見てみます
 ・7−7=0を見ます、2進数表現は111b−111b=000bです。
  結果の0(000b)は、「表現できる範囲内」なので、オーバーフローは
  発生しません。
 ・6−7=−1の2進数表現は110b−111b=111bです。
  結果の111bは、10進表示では7で間違っています。
 「表現できる範囲外」なので、オーバーフローが発生します。


論理演算命令の演算例


  1  001b   2  010b   2  010b   7  111b
  +   +     +   +     +   +     +   +  
  1  001b   5  101b   6  110b   7  111b
  ↓   ↓     ↓   ↓     ↓   ↓     ↓   ↓  
  2 0010b   7 0111b   8 1000b  14 1110b
   演算結果:○    演算結果:○    演算結果:×    演算結果:×

 ・左端は、1+1=2の場合です。演算結果は、010bなので「表現できる範囲内」です。
 ・左から2番目、2+5=7の演算結果は、111bなので「表現できる範囲内」です。
 ・左から3番目、2+6=8の演算結果は、000bで、十進数は「0」です。
  「8」が求める数値ですが、「0」になっています、「表現できる範囲外」です。
  この場合、000bの上にキャリーが出る事に注目してください。
 ・右端、7+7=14の演算結果は、110bになり、これも「表現できる範囲外」です。
  「7」は、表現できる正の最大数です。
  この場合、000bの上にキャリーが出る事に注目してください。


  7  111b   7  111b   6  110b   0  000b
  −   −     −   −     −   −     −   −  
  1  001b   7  111b   7  111b   7  111b
  ↓   ↓     ↓   ↓     ↓   ↓     ↓   ↓  
  6 1110b   0 1000b  −1 0111b  −7 0001b
   演算結果:○    演算結果:○    演算結果:×    演算結果:×

 ・左端は、7−1=6の場合です。演算結果は、110bなので「表現できる範囲内」です。
 ・左から2番目、7−7=0の演算結果は、000bなので「表現できる範囲内」です。
 ・左から3番目、6−7=−1の演算結果は、111bで、十進数は「7」です。
  「−1」が求める数値ですが、「7」になっています、「表現できる範囲外」です。
  この場合、000bの上にキャリーが無い事に注目してください。
 ・右端、0−7=−7の演算結果は、001bになり、これも「表現できる範囲外」です。
  「7」は、表現できる正の最大数です。
  この場合、001bの上にキャリーが無い事に注目してください。


 整理をすると
 ・正の数値と正の数値を加算した場合、「表現できる範囲外」になるとキャリーが出る
 ・右端の7+7=14の様に、表現できる正の最大数と正の最大数の場合でもキャリーが出る。
 ・正の数値から正の数値を減算した場合、「表現できる範囲外」になるとキャリーは無い
 ・右端の0−7=−7の様に、演算結果が表現できる負の最大数の場合でもキャリーは無い


オーバーフローを検出条件

 以上の検討内容からオーバーフロー検出条件は得ることができます。
 ・算術演算命令の場合、正の数値+正の数値→負の数値なら「表現できる範囲外」。
          又、負の数値−正の数値→正の数値なら「表現できる範囲外」。
 ・演算命令の場合、正の数値+正の数値→キャリー有りなら「表現できる範囲外」。
        又、正の数値−正の数値→キャリー無しなら「表現できる範囲外」。


ホームへ戻る