「マイコンなんてこわくない」の第3回をお届けする(このような企画に至った経緯はこちら。別ウインドウが立ち上がります)。初日2日目に続き,セミナー「マイコン入門」もいよいよ3日目の最終日。急に授業内容が難しくなる中,筆者は何とか理解しようとするものの・・・・。

 8月3日,いよいよ最終日。今日も朝から暑い。しかも,2日目の後半から一気に理解が怪しくなってきたせいか,何となく足取りが重い。

 講義は予定時刻にスタート。もちろん,欠席者はなく生徒は合計で14人。そんな中,講師の湯浅一志氏が「ここは重要ですよ」と前置きした上で説明が始まったのが,「サブ・ルーチン」に関するもの。ルーチンとは,プログラム(処理)そのものを示す。「メイン・ルーチン」とサブ・ルーチンと分けることで,プログラムの大きな手順はメイン・ルーチンに記述しておき,細かい作業に関してはサブ・ルーチンに記述して,その都度呼び出して利用する,ということができる。

図1●サブ・ルーチンを利用するとプログラムが簡素になる。
図1●サブ・ルーチンを利用するとプログラムが簡素になる。 (画像のクリックで拡大)

 サブ・ルーチンの有効な使い方が,同じ計算を何回も繰り返すような処理をする場合。例えば,1回目の計算を行った後で,その計算結果をデータとしてセットして2回目の計算,続いて3回目といったように,繰り返し計算をする場合を考える(図1)。このような場合,そのままメイン・ルーチンだけにプログラムを記述していくと,だらだらと長くなってしまう。その点,計算する部分だけをサブ・ルーチンとして用意しておき,必要なときに呼び出すようにすれば,プログラムが非常に簡素なものとなる。

 このサブ・ルーチンを使うためには「CALL」と「RET」の二つのニモニックが必要となる。CALL命令によってサブ・ルーチンを呼び出して実行。そして呼び出されたサブ・ルーチンの最後の行には必ずRETと記入しておくことで,元のメイン・ルーチンに戻っていくことになる。

 任意の位置にあるプログラムに飛ぶ,という点だけ考えると,前日に学んだ分岐命令と似た動きをするように思う。大きな違いとなるのは,CALL命令ではサブ・ルーチンを実行した後に,自動的に元にいた場所まで戻ってくる点。分岐命令では,これができないために,戻りたいときはメモリ・アドレスを記述するなどの処理が必要となる。CALL命令では,戻り先のアドレスをスタックエリアという退避領域に保存しておいてくれるのだ。

2行になったメイン・プログラム

 ここで,サブ・ルーチンを理解するために,昨日の最後に作成したプログラムを改良する問題を解く。

(3)7セグメントLEDの制御
手動切り替えによる表示切り換え制御
問題(2)を元にして,7セグメントLEDへの表示処理部分をサブ・ルーチン化しなさい。 *16進数の値は,P15から入力すること。
*表示桁の切り替えには,プッシュスイッチ(PB0)を用いること。

 図2がプログラムの解答例だ(プログラムの高解像度の画像データを開く場合はこちら)。

図2●7セグメントLEDの制御プログラム(3)

 メインのプログラムはわずか2行。単に「DISP7SEG」というラベル名のサブ・ルーチンを呼び出して実行しているだけ。そしてDISP7SEGの部分に表示処理部分が記述してあるが,それは昨日の問題においてメイン・ルーチン部分に書かれたプログラムをごっそり持ってきただけ。全体のプログラム自体,増えたような気もするが,サブ・ルーチンにはこういったこともあると理解する。(次のページへ