- - PR -
われわれは日常、結果の取り扱いについて特に意識することなく、引き算を行っている。電卓や表計算ソフト、高級言語などを使用して10進数の引き算を行う場合、結果として表示される数値をただ単に読み取ればよい。しかし、そうした日常の常識は、アセンブラの世界においては、しばしば通用しない。今回は、「コンピュータが引き算を行う」ということが意味するものを理解しよう。
足し算と引き算の違い
足し算(加算)と引き算(減算)には、さまざまな違いがある。
加算では、「足される数」と「足す数」の順序を入れ替えても結果は変わらない(交換則が成立する)。「3+5」と「5+3」の結果は、同様に「8」である。また、正の整数同士の足し算の結果は、必ず正の整数になる(正の整数の集合は、足し算に関して閉じている)。
これらはどちらも、減算に関しては当てはまらない。「引かれる数」と「引く数」を入れ替えれば、結果は変わってしまう。「3−5」の結果は「−2」で、「5−3」の結果は「2」である。また、正の整数同士の減算の結果は、正の整数であるとは限らない。「“引かれる数” < “引く数”」の場合には、結果は負の整数になる。
コンピュータに減算を行わせるためには、足し算を行わせる場合以上に、工夫と注意が必要である。算数の宿題を電卓で片付ける小学生のように、「表示された数字をそのまま書き写す」というわけにはいかないのだ。10進数の演算命令を持たないアセンブリ言語でプログラミングを行う場合、減算は実行するにも結果を読み取るにも「大人の知恵」が必要である。電卓ならば小学生でも扱える。では、大人であるわれわれは“電卓のプロセッサの内部で行われている計算”を理解しようではないか。
整数の減算を行うプログラム
以下に、AVRアセンブリ言語で整数の減算を行うプログラム(リスト1)とその処理の流れを示す(図1)。
; Copyright 2008 Denno Neko Yashiki |
リスト1 整数の減算を行うプログラム |
図1 リスト1「整数の減算を行うプログラム」のフロー図
前回解説した加算プログラムとの違いは、「加算ではなく減算を行う」と「結果が負になった場合には適切な処理を行う」の2点である。
「AVR Studio」でこのプログラムをアセンブルし、シミュレータで実行していくと(AVR Studioとシミュレータの使用法は、前シリーズ「マイコン制御基礎以前 第8回」を参照していただきたい)、
;------------------------------------------------------------------- |
の直後、レジスタAこと「R19」へ「2」が格納されることを確認できる(図2)。
図2 レジスタAこと「R19」へ「2」が格納される
「sub A,B」では、レジスタAの内容からレジスタBの内容を引く減算が行われ、計算結果はAに格納される。このプログラムの実行形式を書き込んだATmega16を「STK500」に装着すると、動画1のように、「PORT B」の0番ピンに接続したLEDが2回点滅する。 同じATmega16を自作LEDフラッシャボードに装着すると、同じく「PORT B」の0番ピンに接続したLEDが2回点滅する(動画2)。なお、マイコンにプログラムを書き込む方法については前シリーズ「マイコン制御基礎以前 第8回」、LEDフラッシャボードの制作については前シリーズの第4〜6回を参照いただきたい。
ではここで、プログラムの同じ個所を
;------------------------------------------------------------------- |
と変更し、同じようにアセンブルを行い、シミュレータを動かして結果を見てみよう。「sub A,B」の直後、レジスタAことR19の内容は図3ようになる。
図3 レジスタAことR19の内容
「5−7=−2」のはずが、「5−7=0xFE(10進数の254)」となってしまう。8ビットの2進数が表現できる数の範囲は、10進数で0〜255である。整数の正負を表現するには「+」または「−」の符号が必要である。マイコンは誤って「5−7=254」と表示しているわけではなく、正しく計算を行い、結果である「−2」を「254」と表現してしまうのだ。問題は、扱っている数の中に「符号」という概念が存在しないことにある。
関連記事 半導体/エレクトロニクス
組み込み開発フォーラム 新着記事
- 【問題19】 N進同期カウンタの設計(2008/6/12)
- コンピュータに引き算をさせるには?(2008/6/11)
- メーカーを悩ませる組み込み機器の想定外の使われ方(2008/6/9)
- ウインドリバーの車載インフォテインメント向けLinux(2008/6/6)
- 【問題18】 カルノー図によるカウンタ回路の設計(2008/6/5)
- エレクトロニクスを制する者は、カーエレを制す(2008/5/30)
- フィンランド発UI統合開発環境、日本上陸!(2008/5/30)
- 【問題17】 非同期カウンタと同期カウンタ(2008/5/29)
- ワンセグ対応、T-Kernelの新プラットフォーム発表(2008/5/29)
- 電圧定格2200Vの新ESBTファミリ発表(2008/5/28)
- 混沌とする2008年世界半導体市場その先行きは?(2008/5/27)
- 出荷4億個を突破したICの「グリーン」効果とは(2008/5/27)