マイコン制御基礎の基礎

マイコン制御基礎の基礎(5)

マイコンはどうやって足し算をしているのか?

みわよしこ(執筆協力:山本栄一、小椋秀一、宇野雄騎)  2008/5/16

マイコン制御プログラムを自由自在に書けるようになろう! 前シリーズ「マイコン制御基礎以前」に続く本シリーズでは、アセンブリ言語の解説を中心に基礎力固めを目指す。(編集部)

- PR -

 本連載のこれまでの4回で、自作LEDフラッシャボードを思いどおりに動かし、シミュレータと「AVR JTAGICE mkII」を用いて開発とデバッグを行えるようになった。センシングと制御の仕組みについてさらに学習を進めるために、まずは自作ボードを用いて、演算の基本を極めて原始的な方法によって身に付けよう。今回は足し算(加算と半加算)について解説する。

10進数整数の加算を復習する

 足し算(加算)で重要なのは、「6+7=13」のように繰り上がりが発生するパターンだ。小学校1年生のとき(あるいはそれ以前)に学んでいるはずだが、ここでは繰り上がりを一応復習してみよう。

 繰り上がりは、当たり前の話だが、けた上がりに対応して発生する。けたが上がるということは、1けたの数字の加算であれば、1のけたの合計が10を超えるということだ。この場合、小学1年生だったら、「6」から指を7回折って「13」にたどり着くところだろう。

 10進数の1のけたには、0〜9の10個の数字がある。実は加算を行うために必要なのは、

  • 結果として1のけたの数字は何になるか
  • けたが上がったかどうか

の2つの情報だけである。整数の1のけたは0〜9のどれかなので、1のけたの数字が「3」になった場合、加算の結果は、けた上がりが行われなければ「3」、けた上がりがあれば「13」となる。けた上がりの有無を判断しない場合に加算の結果が「3」となったら、「3」なのか「13」なのか不明なのだが、そのどちらかではある。

 10進数の「1のけた」に相当する部分だけの加算を「半加算」と呼ぶ。半加算の結果は「6+7=3」となり、小学1年生のテストであれば「10のけたを忘れた」ということで減点対象になるが、別途「けた上がりあり」と判断されているのであれば、結果を「13」と修正できる。

「キャリーフラグ」とは?

 8ビットの2進数を扱っている場合、正の数を表現するのであれば、表現できる範囲は0〜255である。「128+129」という計算を行うと、結果は「257」となり、この範囲では表現できない。

 「257」を2進数で表現すると、「100000001」となり、2進数では9ビットである。8ビットの2進数を扱っている場合、扱えるのは下位の「00000001」のみである。加算の結果が10進数の「1」であるか「257」であるかは、実は結果の「00000001」からは判断できない。ただし、半加算と組み合わせれば、9ビット目へのけた上がりがない場合に「1」、けた上がりがある場合に「257」であることが判明する(注1)。ここで、結果が「1100000001(10進数の769)」や「1000000001(10進数の513)」である可能性は考えなくてよい。なぜなら、8ビットの2進数の範囲で表現できる最大の数は「255」なので、2つの数の加算の結果は、最大で「255+255=510」である。

 CPUには大抵「Cフラグ」と呼ばれるフラグがある。これは「Carry」、つまりけた上がりを示している。扱っている数値が8ビットの2進数である場合、加算の結果が256以上になると、Cフラグが「立って」0から1になる。8ビットの2進数で扱える正の整数を加算すると、結果は「0+0」〜「255+255」の範囲に収まる。10進数で0〜510、2進数で0〜111111110の範囲となる。これらはすべて、8ビットの2進数とキャリーフラグの組み合わせで表現できる。

注1:そもそも2進数の加算は、各けたの加算と半加算の組み合わせによって成立している。
参考: 完全マスター! 電子回路ドリル II(9)【問題9】ゲート回路の簡単化
  • 連載バックナンバー
  • 全記事インデックス
  • 組み込み開発トップ
  • MONOistトップ

メールマガジン

アイティメディアの提供サービス

ホワイトペーパー(TechTargetジャパン/閲覧には会員登録が必要です)

スキルアップ/キャリアアップ(JOB@IT)

スポンサーからのお知らせ

ESEC2008 特集ページ開設

Windows Embeddedコーナー

Windows Embedded
Windows Embedded専門コーナー誕生。Windows CEやXP Embeddedに関する技術情報を提供します。

@IT MONOist 求人情報