実際のプログラムでは,図1の様な構造となる.一番左のSTARTから ENDのラインがメインルーチンである.そして,処理Aから処理Dのラインが,それぞれサ ブルーチンとなっている.このようにサブルーチンが集まり,プログラムができあがる. 実際の動作は,呼び出されたサブルーチンが順次動作し,プログラムが実行される.
サブルーチンはプログラムの部品であると先程述べた.それが部品となるためには,他の プログラムにも転用可能である必要がある.ボルトは機械要素の部品である.これは,自 動車にも使えるし,飛行機,冷蔵庫などあらゆるものに使える.自動車にしか使えないボ ルトとなると用途が限られ,部品としては役割が小さくなる.部品として有用になるため には,汎用性が重要となる.サブルーチンも同じで,これが有用となるためにはどのプロ グラムでも使えるようにしなくてはならない.
このような観点から,教科書 [1]の[例題7]のプログラムを見る.そのプ ログラムはリスト1の通りで,最大値を検索サブルーチンを使ったプ ログラムとなっている.9〜20行がサブルーチンである.このサブルーチンの部分を他の プログラムで使おうとすると,DATAとMAXの部分を書き直す必要がある.プロ グラム毎に書き直す必要があるので汎用性があるとは言い難い.あまり良いサブルーチン とは言えない.
サブルーチンのプログラムを書き換えることなく,他のプログラムでも使えるようにしな くてはならない.そのためには,重要なデータ,ここではDATAやKOSUU, MAXを引数として受け渡しすればよい.実際のプログラム方法は,教科書のList5-8 で学習する.
[caption=サブルーチンを使ったプログラム例,label=prog:List_5_7] program/text_list_5_7e.cas
サブルーチンにデータを渡す方法は,2種類ある.アドレス渡しと値渡しで ある.図2のようにメモリーにデータがあるとする.アドレス #0042のデータ#1234 をサブルーチンで処理する場合,それを渡す必要があ る.この場合,
どちらの方法を使うかは,処理の内容により異なる.諸君が経験を積めば,どちらを使う べきか分かるだろう.ここでは,そこまで踏み込まないことにする.
すでに,[例題7]までの学習は完了している.ここでは,[例題7]から[例題8]への進化の 過程を学習する.ここでの進化は,最大値を捜す関数の独立性を高め,サブルーチンを書 き換えることなく,他のプログラムに移植可能にしたことである.それを可能にするため には,サブルーチン内では,DATAやKOSUU,MAXという文字を書かないこ とである.しかし,これらはサブルーチンでの処理上,極めて重要なデータとなっている ので,そのデータの内容はサブルーチンに伝える必要がある.このような場合,引数を使 うのが常套手段である.教科書のList 5-8では,次節に示すように,汎用レジスターを使っ てデータの受け渡しをしている.このようにすると,呼び出し側でレジスターに入れる変 数を変えるだけで,サブルーチンはどのようなルーチンからでも呼び出しができるように なる.
汎用的なサブルーチンは,どんなプログラムからでも呼び出しができるようにしなくては ならない.[例題10]のList5-10では,割り算のサブルーチンが使われており,これは頻繁 に使われるので,レジスターを使ってデータを渡している.どんな呼び出し元であれ,レ ジスターの値を変えるだけで,サブルーチンに処理を依頼できる.
汎用レジスターのGR1とGR2,GR3を使って,サブルーチンで処理に必要な データDATAやKOSUU,MAXを送っている.こうすると,他のルーチンから もデータの先頭アドレスと個数,最大値を格納するアドレスを送れば,このサブルーチン が処理できる.ほかのルーチンでのラベル名が異なっても,このサブルーチンが使えるの である.
サブルーチンでは,GR1〜GR5を使って処理をしている.サブルーチンが終了す るときには,メインルーチンで使っているこれらのレジスターを元に戻さなくてはならな い.サブルーチンがメインルーチンの動作に関与する可能性が生じるからである.そのた めに,次のような動作が必要である.
メインルーチン | サブルーチン | |
DATA | データの先頭アドレス | 未使用 |
KOSUU | データ数が格納されたアドレス | 未使用 |
MAX | 最大値を格納するアドレス | 未使用 |
GR1 | データ数 | データ数-1 |
GR2 | データの先頭アドレス | 比較するデータのアドレス |
GR3 | 最大値を格納するアドレス | 最大値を格納するアドレス |
GR4 | 未使用 | カウンター(比較済みデータ数-1) |
GR5 | 未使用 | 比較するデータ |