ハードウェアの仕組みとソフトウェア処理 ―― マイコンの動作を理解する

宮崎 仁

2.実行制御のための機構

● 実行アドレスを書き換える分岐命令

 マイコンは,実行すべき命令のアドレスを保持する特別なレジスタを持ち,命令を取り出すたびにレジスタの値を自動的に加算して,次の命令に進む仕組みを持ちます.これによって,アドレスの順に命令を実行できます.このレジスタはさまざまな呼び方がありますが,ここでは「命令アドレス・レジスタ」と呼ぶことにしましょう.

 マイコンの命令実行でもう一つ重要な機能は,前方のアドレスや後方のアドレスに分岐する機能です(図4).いくつかの処理から一つを選んで実行(分岐)したいときは,実行したい処理の先頭アドレスまで分岐します.同じ処理を繰り返し実行(ループ)したいときは,実行したい処理の末尾アドレスから先頭のアドレスに戻るように分岐します.


図4 実行アドレスを書き換える分岐命令

例えば,番地3から取り込んだ命令が「番地1に分岐せよ」だった場合を考える.命令実行ユニットは,命令アドレス・レジスタの値を番地1に書き換える.これによって,命令3の次に命令4ではなく,命令1が実行されることになる.

 

 特に,演算結果に従って別のアドレスに分岐する条件分岐の機能が重要です.条件分岐を用いることによって,「もしAだったらBの処理を行い,AでなかったらCの処理を行う」というように,物事を判断してそれに対応した処理を行うことができます.この機能があるため,マイコンは単なる計算機ではなくて,知能を持った機械として用いることができます.

 分岐機能を実現するために,マイコンには命令アドレス・レジスタを所定の値に書き換える命令が備わっています.この命令を実行すれば,その次の命令は書き換えられた新しいアドレスから取り込むことになります.これは,分岐(ジャンプ)命令と呼ばれます.

● 演算結果を判断する仕組み=フラグと条件分岐

 CPUが演算命令を実行すると,指定されたデータ(汎用レジスタやメモリに置かれる場合が多い)をALUに送って演算を行い,結果を指定された記憶場所(汎用レジスタやメモリ)に保存します.このとき,演算結果が持つ特徴を,フラグ・レジスタ(またはステータス・レジスタ)と呼ばれる特別なレジスタに書き込みます(図5).




図5 演算結果の特徴を保持するフラグ・レジスタ
演算命令を実行すると,結果の値を汎用レジスタに保持し,結果の特徴をフラグ・レジスタに保持する.フラグ・レジスタは,さまざまなフラグ・ビットの集まりである.

 

 例えば演算結果が0だった場合,フラグ・レジスタの中のゼロ・フラグと呼ばれる1ビットが'1'になります.演算結果が負の数になった場合,フラグ・レジスタの中のネガティブ・フラグと呼ばれるビットが'1'になります.演算によってけた上がりが生じた場合,フラグ・レジスタの中のキャリ・フラグと呼ばれるビットが'1'になります.演算結果が汎用レジスタのビット数を超えてしまった場合,フラグ・レジスタの中のオーバフロー・フラグと呼ばれるビットが'1'になります.

 分岐(ジャンプ)命令の中で,特に条件分岐命令と呼ばれるものがあります(図6).これは,フラグ・レジスタの中の特定のフラグを参照して,その値によって分岐するかしないかを決めるものです.例えば,ゼロ・フラグが'1'(すなわち演算結果が0)なら分岐する命令,ゼロ・フラグが'0'(すなわち演算結果が0でない)なら分岐する命令,ネガティブ・フラグが'1'(すなわち演算結果が負)なら分岐する命令,ネガティブ・フラグが'0'(すなわち演算結果が正)なら分岐する命令というように,フラグごとに細かく命令が作られています.


図6 条件分岐
番地3の演算命令を行い,結果が0なら番地7以降を,そうでなければ番地5の命令を実行して番地9へ分岐する例を示している.

 

 この条件分岐命令によって,マイコンは演算結果をすばやく判断し,それに対応する処理を実行できます.

 たいていの高級言語では,if~else文を用いて,「もしAならBを実行,そうでなければCを実行」というようなコードを記述することができますが,それはすべてこの条件分岐の機能を用いて実現されます.

組み込みキャッチアップ

お知らせ 一覧を見る

電子書籍の最新刊! FPGAマガジン No.12『ARMコアFPGA×Linux初体験』好評発売中

FPGAマガジン No.11『性能UP! アルゴリズム×手仕上げHDL』好評発売中! PDF版もあります

PICK UP用語

EV(電気自動車)

関連記事

EnOcean

関連記事

Android

関連記事

ニュース 一覧を見る
Tech Villageブログ

渡辺のぼるのロボコン・プロモータ日記

2年ぶりのブログ更新w

2016年10月 9日

Hamana Project

Hamana-8最終打ち上げ報告(その2)

2012年6月26日