(57)【特許請求の範囲】
【請求項１】
割込み発生時に該割込み処理を起動する割込み起動手段を備えた情報処理装置において、
該割込み処理中に、レジスタファイルにおけるレジスタのスタックメモリに対する退避があった場合には、その退避のあったレジスタを特定する情報であるレジスタ特定情報を、前記スタックメモリへの退避順が特定できるように格納する退避履歴格納手段を備え、
当該割込み処理からのリターン命令を実行する際に、前記退避履歴格納手段に格納されたレジスタ特定情報を前記退避順とは逆順に取り出し、取り出したレジスタ特定情報によって特定したレジスタに対して前記スタックメモリからのレジスタ復帰を行う、ように構成され、
さらに、
前記レジスタファイルのレジスタそれぞれに対応するレジスタで構成され、全てのレジスタが前記割込み処理の起動時に初期化されてリセット状態となり、また、全てのレジスタのうち、前記レジスタファイルにおいてスタックメモリに対する退避があったレジスタに対応するレジスタがその退避時にセット状態となる退避実行フラグレジスタと、
前記割込み処理から前記レジスタファイルにおけるレジスタを書き換える命令を検出し、該命令により書き換えられるレジスタを特定するレジスタ書き換え命令検出手段と、
前記退避実行フラグレジスタのレジスタのうち、前記レジスタ書き換え命令検出手段により特定されたレジスタに対応するレジスタがリセット状態であれば、前記スタックメモリに対するレジスタの退避があると判定し、そのレジスタがセット状態であれば、前記スタックメモリに対するレジスタの退避がないと判定する退避実行判定手段と、
を備えており、
前記退避履歴格納手段は、前記退避実行判定手段によりレジスタの退避があると判定された場合に、そのレジスタを特定する情報であるレジスタ特定情報を、前記スタックメモリへの退避順が特定できるように格納する、ように構成されている
ことを特徴とする情報処理装置。
【請求項２】
前記レジスタ書き換え命令検出手段により前記割込み処理から検出された命令が、ロード操作を伴う命令である場合に、該命令におけるロードがレジスタの退避と共に行われる一方、ロード操作を伴わない命令である場合に、レジスタの退避のみが行われる、ように構成されている
ことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記退避実行フラグレジスタにおいて、前記スタックメモリに対する退避があったレジスタに対応するレジスタは、前記割込み処理における命令を解読するステージから、該解読した命令を実行するステージに移行するタイミングでセット状態となる
ことを特徴とする請求項１または請求項２に記載の情報処理装置。
【請求項４】
前記レジスタファイルにおけるレジスタが汎用レジスタである場合において、
前記退避履歴格納手段は、前記汎用レジスタの数と同数のレジスタ特定情報を格納可能に構成されていること
を特徴とする請求項１から３のいずれかに記載の情報処理装置。
【請求項５】
請求項４に記載の情報処理装置において、
前記退避履歴格納手段は、レジスタ特定情報として前記汎用レジスタのレジスタ番号を格納すること
を特徴とする情報処理装置。
【請求項６】
請求項１〜５のいずれかに記載の情報処理装置において、
当該情報処理装置はパイプライン処理を行い、
前記レジスタの書き換え命令がメモリアクセスステージでのメモリへのアクセスを行わない場合には、前記書き換えられるレジスタの内容を前記メモリアクセスステージでスタックメモリへ書き込み、前記レジスタ書き換え命令による書き換えを前記メモリアクセスステージに続くライトバックステージで行うこと
を特徴とする情報処理装置。
【請求項７】
請求項１〜６のいずれかに記載の情報処理装置において、
当該情報処理装置に予め備えられたスタックポインタとは別のスタックポインタを設け、
前記書き換えられるレジスタの内容を退避するスタックメモリは、前記別のスタックポインタの指すアドレスのメモリであること
を特徴とする情報処理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
情報処理装置等に関する。
【０００２】
【従来の技術】
従来より、メモリから命令を読み込んで実行するための処理機能を複数種類のステージに分け、並列して異なるステージの動作を行うことにより、複数の命令処理サイクルを部分的に重複したタイミングで実行するパイプライン処理方法を採用した情報処理装置が知られている。
【０００３】
そして更に、この種の情報処理装置として、割込みに対応するために、割込み処理を起動する割込み起動手段を備えた情報処理装置が知られている。
ここでこのような割込み起動手段を備えた情報処理装置の割込み発生時の基本的な動作の例について図１２を参照して以下に説明する。図１２は一般的なＣＰＵ１０１の構成を示したものであり、パイプライン処理のための制御を行うデコーダ１０２と、データやアドレス等の演算を行うデータパス１０３とから構成されている。データパス１０３は、メモリアクセスステージにてメモリからデータバスを介してデータをロードしたり、メモリにストアすべきデータをデータバスへ出力するロードストアユニット１０４と、実行ステージにて命令の内容に応じた演算を行う実行ユニット１０５と、複数の内部レジスタｒ０，ｒ１，ｒ２，…（図示省略）を内蔵したレジスタファイル１０６と、メモリからフェッチステージで読み込むべき命令のアドレスを格納及びカウントするプログラムカウンタ（以下、ＰＣ）１０９と、ＣＰＵの内部状態を示すプロセッサステータスレジスタ（以下、ＰＳＲ）１０８と、スタックメモリのアドレスを格納するスタックポインタ（以下、ＳＰ）１１０と、メモリアクセスステージにてアドレスバスへアドレスを出力するアドレスユニット１０７とを備えている。
【０００４】
割込みが発生するとＣＰＵ１０１は、ＰＳＲ１０８とＰＣ１０９をスタックメモリ（以下スタックとも称する）に退避した後、割込みベクタテーブルを参照し、指定された割込みサービスルーチン開始アドレスに分岐し、割込みサービスルーチンを実行する。
【０００５】
ここで割込み処理において、レジスタファイル１０６を書き換える処理が必要な場合は、処理に先んじてレジスタファイル１０６の値をスタックに退避する（以下「レジスタを退避する」と称する）必要がある。一般的に、このレジスタの退避は、割込んで実行する側のプログラム、すなわち割込みサービスルーチンの先頭で、命令によって明示的に、シーケンシャルに行っている。
【０００６】
【発明が解決しようとする課題】
ところで一般に、スタックからのレジスタの退避処理と復帰処理は、時間の消費を伴うと同時に、それらの時間は本来の処理においては出来れば不要にしたい時間である。特に組み込み機器制御用のマイクロコンピュータにおいては頻繁に発生する割込みに対して速やかな対応が必要とされ、しかも、それぞれの割込み処理自体は単純で簡単な処理が多い。
【０００７】
そのため上述した一般的な手法では、レジスタの退避や復帰という処理が無視できない性能低下をもたらす結果になる。またレジスタを退避する命令を割込みプログラムごとにコーディングすることは、使用メモリ量を増加させる要因となり、システムのコストを上昇させてしまうという問題がある。
【０００８】
そこで本発明は、割込み処理を起動する割込み起動手段を備えた情報処理装置において、メモリの使用量を抑えることができ、レジスタの退避や復帰にかかる時間を短縮して割込み処理の応答性を高くすることのできる情報処理装置等を提供することを目的とする。
【０００９】
【課題を解決するための手段及び発明の効果】
上述した問題点を解決するためになされた第１のレジスタ復帰方法によれば、割込み処理中でスタックメモリへのレジスタの退避を行った場合、リターン命令による割込み処理の終了処理中に、その退避したレジスタの復帰がなされる。つまり、割込み処理内においてレジスタをスタックメモリへ退避する際に、スタックメモリへ退避したレジスタの退避履歴をとることで、レジスタ復帰処理が命令によらず行うことができる。
【００１０】
したがって、割込み処理の終了前にレジスタ復帰命令を設ける必要がなくなり、単にリターン命令を設けるだけでレジスタの内容を復帰させることができる。よって、レジスタ復帰命令を格納するためのメモリの分だけメモリの使用量を抑えることができる。また少なくともレジスタ復帰命令の読み込みにかかる時間分は処理時間を短縮することが可能となる。
【００１１】
特に、例えば復帰対象のレジスタ番号を指定してレジスタ毎に復帰を行う情報処理装置の場合には、退避したレジスタの数だけレジスタ復帰命令が必要となっていたため、割込み処理内で使用するレジスタの数が多い場合、メモリの使用量が多くなってしまっていたが、第１の発明によればリターン命令のみでレジスタ復帰がなされる。したがって大幅にメモリの使用量を削減することができる。また例えば割込みベクタ等を利用し各割込み毎に異なる割込み処理ルーチンを設ける場合、各割込み処理ルーチン毎に復帰命令が必要であったため、メモリの使用量が多くなるといった問題があったが、第１の発明によればこうした問題を解決することができる。
【００１２】
特に、情報処理装置がＣＰＵの場合であって、このＣＰＵを内蔵したマイクロコンピュータ、特に多数の周辺回路を内蔵し、これら周辺回路から頻繁に割込みが発生する組込機器制御のためのマイクロコンピュータにおいて極めて有効である。
【００１３】
さらに、前述のような復帰対象のレジスタ番号を指定してレジスタ毎に復帰を行う情報処理装置の場合には、例えばレジスタ０，レジスタ１，レジスタ２の順にスタックメモリへのレジスタ退避命令を実行した場合、レジスタ復帰命令はレジスタ２，レジスタ１，レジスタ０の順でスタックメモリから復帰するよう構成する必要がある。すなわちレジスタの退避とレジスタ復帰を対応付けて行う必要があるが、プログラマがこの対応関係を誤って記述した場合に、誤っていることに気づかないと、意図した通りに情報処理装置が機能しないという問題が起こっていた。しかし第１のレジスタ復帰方法をとる情報処理装置の場合、レジスタ復帰命令が不要となるためこのような問題が発生しない。したがって、プログラムの生産性も高めることができる。特に組込機器制御のためにアセンブリ言語等の低レベルの言語でプログラムを行う場合にプログラムの生産性を高めることができる。
【００１４】
また上述した問題点を解決するためになされた第２のレジスタ退避方法によれば、割込み処理内での最初のレジスタの書き換え時にそのレジスタの書き換え前の内容が自動的にスタックメモリへ退避される。したがって、割込み処理内で、割込み処理前のレジスタの内容をスタックに退避するレジスタ退避命令が不要となる。
【００１５】
そして、例えば情報処理装置がパイプライン処理を行うものである場合には、次に示すようにして、レジスタ書き換え命令の実行パイプラインのメモリアクセスステージ処理期間中に、レジスタ書き換え命令にて書き換えられるレジスタの内容をスタックへ退避するとよい。このようにすれば、スタックへの書き換え前のレジスタの退避とレジスタの書き換えとをレジスタ書き換え命令の実行パイプライン内で行うことができる。したがって、レジスタの内容をスタックへ退避するための独立したパイプラインの消費を避けることができ、レジスタの退避にかかる時間を短縮できる。情報処理装置がパイプライン処理を行うものである場合には、一般的にレジスタ書き換え命令はパイプラインのライトバックステージでレジスタへの書き込みを行うだけで、メモリアクセスステージではメモリアクセスを行わない場合が多い。このような場合には、レジスタ書き換え命令の実行サイクル数だけでレジスタの退避も行うことができる。よって、割込み処理の応答性をさらに高めることができ、メモリ使用量を抑えることができる
なお、このようにして割込み処理内で最初のレジスタ書き換え命令から順にその書き換え前の値がスタックメモリに積まれていくため、割込み処理から元の処理へ復帰する際には、レジスタ復帰をレジスタの書き換え順と逆順に行う必要がある。このような順序をプログラマが把握し、逆順にレジスタ復帰命令をプログラマが記述して復帰させるようにすることができるが、次に示すように、第１のレジスタ復帰方法を併用するとよい。
【００１６】
すなわち、このレジスタ管理方法によれば、例えば、割込み処理における各々のレジスタについてのその割込み処理内での最初のレジスタ書き換えを検出した場合に、書き換え前のレジスタの内容をスタックメモリへ退避し、退避したレジスタを特定するための情報を退避順が特定可能なように順次記録しておき、その割込み処理からのリターン命令による割込み処理起動前の処理へ復帰する処理中に前記スタックメモリへ退避されたレジスタのデータを前記記録に基づいて元のレジスタに復帰する。
【００１７】
したがって、割込み処理ルーチンの実行を開始する前のレジスタの内容を保持するためのレジスタ退避もレジスタ復帰も明示的な命令によって行う必要が無くなり、割込み処理ルーチンには割込み処理内で行いたい本来の処理命令を設けるだけでよい。よってメモリ使用量を抑えることができ、割込み処理の応答性を高めることができる。また割込み処理ルーチンの作成時にはレジスタ退避及びレジスタ復帰の命令を記述しなくて済むため、割込み処理ルーチンの生産効率を高めることができ、誤りの無い品質の高い割込み処理ルーチンを容易に作成できるようになる。
【００１８】
そして上述した方法を採用した情報処理装置は例えば次のように構成することができる。
請求項１に記載の情報処理装置によれば、割込み処理中に、レジスタファイルにおけるレジスタのスタックメモリに対する退避があった場合に、その退避のあったレジスタを特定する情報であるレジスタ特定情報を、スタックメモリへの退避順が特定できるように退避履歴格納手段に格納し、割込み処理からのリターン命令を実行する際に、退避履歴格納手段に格納されたレジスタ特定情報を退避順とは逆順に取り出し、取り出したレジスタ特定情報によって特定されるレジスタに対してスタックからのレジスタ復帰を行う。
【００１９】
したがって、割込み処理の終了前にレジスタ復帰命令を設ける必要がなくなり、単にリターン命令を設けるだけでレジスタの内容を復帰させることができる。よって、レジスタ復帰命令を格納するためのメモリの分だけメモリの使用量を抑えることができる。また例えば、少なくともレジスタ復帰命令の読み込みにかかる時間分は処理時間を短縮することが可能となる。
【００２０】
特に、例えば復帰するレジスタ番号を指定してレジスタ毎に復帰を行う情報処理装置の場合には退避したレジスタの数だけレジスタ復帰命令が必要となっていたため、割込み処理内で使用するレジスタの数が多い場合、メモリの使用量が多くなってしまっていたが、請求項１に記載の発明によればリターン命令のみでレジスタ復帰がなされる。したがって大幅にメモリの使用量を削減することができる。また例えば割込みベクタ等を利用し各割込み毎に異なる割込み処理ルーチンを設ける場合、各割込み処理ルーチン毎に復帰命令が必要であったため、メモリの使用量が多くなるといった問題があったが、請求項１に記載の発明によればこうした問題を解決することができる。
また、この情報処理装置は、退避実行フラグレジスタを備えており、この退避実行フラグレジスタが、前記レジスタファイルのレジスタそれぞれに対応するレジスタで構成され、全てのレジスタが前記割込み処理の起動時に初期化されてリセット状態となり、また、全てのレジスタのうち、前記レジスタファイルにおいてスタックメモリに対する退避があったレジスタに対応するレジスタがその退避時にセット状態となる。
また、前記割込み処理から前記レジスタファイルにおけるレジスタを書き換える命令を検出し、該命令により書き換えられるレジスタを特定するレジスタ書き換え命令検出手段と、前記退避実行フラグレジスタのレジスタのうち、前記レジスタ書き換え命令検出手段により特定されたレジスタに対応するレジスタがリセット状態であれば、前記スタックメモリに対するレジスタの退避があると判定し、そのレジスタがセット状態であれば、前記スタックメモリに対するレジスタの退避がないと判定する退避実行判定手段と、を備えている。
そして、前記退避履歴格納手段は、前記退避実行判定手段によりレジスタの退避があると判定された場合に、そのレジスタを特定する情報であるレジスタ特定情報を、前記スタックメモリへの退避順が特定できるように格納する、ように構成されている。
また、請求項２に記載の情報処理装置は、前記レジスタ書き換え命令検出手段により前記割込み処理から検出された命令が、ロード操作を伴う命令である場合に、該命令におけるロードがレジスタの退避と共に行われる一方、ロード操作を伴わない命令である場合に、レジスタの退避のみが行われる、ように構成されている。
また、請求項３に記載の情報処理装置は、前記退避実行フラグレジスタにおいて、前記スタックメモリに対する退避があったレジスタに対応するレジスタは、前記割込み処理における命令を解読するステージから、該解読した命令を実行するステージに移行するタイミングでセット状態となる。
【００２１】
また、レジスタファイルにおけるレジスタが汎用レジスタである場合であれば、退避履歴格納手段は、請求項４に示すように、汎用レジスタの数と同数のレジスタ特定情報を格納可能に構成するとよい。このようにすれば、すべてのレジスタについてのレジスタ復帰命令が不要となる。
【００２２】
また、割込み処理のリターン命令を実行する際に復帰の必要となる可能性のあるレジスタの例としては、上述したような汎用レジスタが挙げられ、この場合には例えば
請求項５に示すように退避履歴格納手段にはレジスタ特定情報として汎用レジスタのレジスタ番号を格納して復帰すべきレジスタを特定するようにすることができる。
【００２３】
なお、多重割込みを許可する情報処理装置の場合には、次に示すように、割込み処理に対して定められている優先順位に応じた領域にレジスタ特定情報を格納しておき、各割込み処理からのリターン命令を実行する際に、実行中の割込み処理の優先順位に対応したレジスタ特定情報を用いて前記スタックからのレジスタ復帰を行うようにするとよい。このようにすれば、多重割込みを許可する情報処理装置においても、レジスタ復帰命令をすべての割込み処理ルーチン内で行う必要がなくなる。
【００２４】
そして、さらにこうした情報処理装置では第２のレジスタ退避方法を採用するとよい。例えば、次に示すように割込み処理中のレジスタの書き換え命令を検出し、その割込み処理におけるそのレジスタに対する最初の書き換えであるか否かを判定し、最初の書き換えの場合にはレジスタ特定情報を退避レジスタ特定情報格納手段に格納して、書き換えられるレジスタの内容をスタックに退避する。このようにすれば、レジスタ退避もレジスタ復帰も明示的な命令によって行う必要が無くなり、割込み処理ルーチンには割込み処理内で行いたい本来の処理命令を設けるだけでよくなる。よってメモリ使用量を抑えることができ、割込み処理の応答性を高めることができる。また割込み処理ルーチンの作成時にはレジスタ退避及びレジスタ復帰の命令を記述しなくて済むため、割込み処理ルーチンの生産効率を高めることができ、誤りの無い品質の高い割込み処理ルーチンを容易に作成できるようになる。
【００２５】
この構成における「当該書き換え命令による当該レジスタの書き換えが、当該割込み処理における当該レジスタに対する最初の書き換えであるか否か」は、例えば次に示すようなフラグレジスタの状態に応じて判定するようにすればよい。
【００２６】
そしてこのフラグレジスタは、次に示すように、割込み処理に対して定められている優先順位に応じた複数のものを設けるとよい。このようにすれば、多重割込みを許可する情報処理装置であっても、各割込み処理内での最初のスタックメモリに対するレジスタ退避であるか否かを判定することが容易にできる。
【００２７】
また、情報処理装置がパイプライン処理を行う場合には、請求項６に示すようにすれば、レジスタ書き換え命令の実行サイクル数だけでレジスタ退避も行うことができる。したがって、さらに割込み処理の応答性を高くすることができる。
【００２８】
なお、書き換えられるレジスタの内容をスタックに退避する場合、この退避先のスタックは、通常のスタックポインタの指すアドレスのスタックとしてもよいが、例えば割込み処理内で明示的な退避命令（例えばＰＵＳＨ  ｒｅｇ１）があると、割込み元の処理に復帰する際のレジスタ復帰が正しく行われなくなってしまう可能性がある。このような問題を回避するためには、例えば、割込み処理内で明示的な命令によるレジスタ退避を禁止するとよい。また、請求項７に示すようにして、書き換えられるレジスタの内容をスタックに退避する場合、通常のスタックポインタとは別のスタックポインタの指すアドレスのスタックへ退避するとよい。このようにすれば、割込み処理内で明示的な命令によるスタックへの退避があったとしても正常にレジスタ復帰を行うことができる。
【００２９】
また、このようにスタックポインタを分けることによりこうした問題を解決するのではなく、次に示すようにして、情報処理装置が実行するプログラムをソースプログラムから生成するためにコンピュータによって実行されるプログラム（例えばコンパイラ、アセンブラ、リンカなど）を構成するようにしてもよい。すなわち、実行プログラムの割込み処理ルーチンの生成時に、ソースプログラム内において明示的なスタックへのレジスタ退避命令を検出した場合にコンピュータに警告を報知させるようにプログラムを構成する。このようにすればプログラムの実行時に問題が発生する可能性があることを、プログラマがプログラムの生成時に知ることができる。よって、警告に従って例えば同一レジスタに対する２度目のスタックへのレジスタ退避命令を、スタック以外のアドレスへの格納命令（例えばストア命令）に置き換えることが容易にでき、上述した問題を解決できる。
【００３０】
【発明の実施の形態】
以下、本発明が適用された実施形態について図面を用いて説明する。なお、本発明の実施の形態は、下記の実施例に何ら限定されることなく、本発明の技術的範囲に属する限り種々の形態を採りうることは言うまでもない。
［第１実施例］
以下、本発明が適用された第１実施例の情報処理装置としてのＣＰＵ１について、図面を用いて説明する。
【００３１】
本発明による第１実施例のＣＰＵ１は、割込み処理を起動する割込み起動手段を備え、メモリ（主に図示しないＲＯＭ）から命令を読み込むＩＦ（フェッチ）ステージと、ＩＦステージで読み込んだ命令を解読するＩＤ（デコード）ステージと、ＩＤステージで解読された命令の内容に応じて、算術、論理等の演算やＩＦステージで読み込むべき命令のアドレスやメモリ（主に図示しないＲＡＭ）へアクセスする際のアドレス等を演算するＥＸ（実行）ステージと、ＩＤステージで解読された命令の内容に応じて、ＥＸステージでの演算結果をアドレスとしてメモリ（主に図示しないＲＡＭ）へのアクセス（即ち、データの読み込み或いは書き込み）を行うＭＡ（メモリアクセス）ステージと、ＩＤステージで解読された命令の内容に応じて、演算データ或いはメモリ（主に図示しないＲＡＭ）からのデータを内部レジスタに書き込むＷＢ（ライトバック）ステージとの５つのステージからなる５段パイプライン処理を行ってプログラムを実行するものであり、図１に示すように、パイプライン処理のための制御を行うデコーダ２と、データやアドレス等の演算を行うデータパス３とから構成されている。
【００３２】
データパス３は、メモリアクセスステージにてメモリからデータバスを介してデータをロードしたり、メモリにストアすべきデータをデータバスへ出力するロードストアユニット４と、実行ステージにて命令の内容に応じた演算を行う実行ユニット５と、複数の内部レジスタｒ０，ｒ１，ｒ２，…（図示省略）を内蔵したレジスタファイル６と、メモリからフェッチステージで読み込むべき命令のアドレスを格納及びカウントするプログラムカウンタ（以下、ＰＣ）９と、ＣＰＵの内部状態を示すプロセッサステータスレジスタ（以下、ＰＳＲ）８と、スタックメモリのアドレスを格納するスタックポインタ（以下、ＳＰ）１０と、メモリアクセスステージにてアドレスバスへアドレスを出力するアドレスユニット７と、スタックメモリへ退避したレジスタの退避履歴をとる退避履歴レジスタ１１とを備えている。なお、退避履歴レジスタ１１が特許請求の範囲における退避履歴格納手段に相当する。
【００３３】
退避履歴レジスタ１１は、図２に示すように、レジスタファイル６を構成する複数の内部レジスタ各々に設定されたレジスタ番号を格納するものであり、レジスタファイル６を構成する内部レジスタと同数のレジスタで構成されている。また退避履歴レジスタ１１は、初期化処理或いは割込み起動処理によってリセットされ、レジスタファイル６に設定されていないレジスタ番号がセットされる。例えば、図２に示すように、退避履歴レジスタ１１がｎ個のレジスタで構成されている場合、１番目に退避したレジスタファイル６のレジスタ番号を退避履歴レジスタ１１のレジスタＴ１に格納し、２番目に退避したレジスタファイル６のレジスタ番号を退避履歴レジスタ１１のレジスタＴ２に格納し、＜中略＞、ｎ番目に退避したレジスタファイル６のレジスタ番号を退避履歴レジスタ１１のレジスタＴｎに格納する。また退避履歴レジスタ１１の読み出しは、レジスタＴｎ、レジスタＴｎ−１、＜中略＞、レジスタＴ２、レジスタＴ１の順に行うが、リセット状態、つまり１からｎ以外の値の読み出しはスキップする。
【００３４】
次に本発明が適用された第１実施例の情報処理装置としてのＣＰＵ１の動作について図３及び図４を用いて説明する。ここでレジスタファイル６は１６個の内部レジスタｒ０からｒ１５で構成されているものとすると、退避履歴レジスタ１１も１６個のレジスタＴ１からレジスタＴ１６で構成されており、初期化処理或いは割込み起動処理によって、値「１６」がセットされる。
【００３５】
まず、図３の命令Ｉ１０から命令Ｉ１２の処理の流れにより、レジスタ退避時の動作を説明する。ＣＰＵ１は命令Ｉ１０を図４に示すようにＩＦステージでフェッチし、次のＩＤステージでデコーダ２によって命令を解読する。この解読結果から命令Ｉ１０がレジスタ０の値をスタックメモリへ退避する命令であることがわかるため、以降のステージでレジスタファイル６のレジスタ０の値を退避するとともに退避したレジスタの番号である０を退避履歴レジスタ１１のレジスタＴ１に書き込む。以下同様に命令Ｉ１１ではレジスタファイル６のレジスタ１の値をスタックメモリへ退避するとともに退避したレジスタの番号である１を退避履歴レジスタ１１のレジスタＴ２に書き込む。命令Ｉ１２ではレジスタファイル６のレジスタ２の値をスタックメモリへ退避するとともに退避したレジスタの番号である２を退避履歴レジスタ１１のレジスタＴ３に書き込む。以降命令Ｉ１３から命令Ｉ１５ではスタックへ退避したレジスタを用いた演算等が行われる。
【００３６】
次にレジスタ復帰時の動作を説明する。レジスタの復帰は元プログラムへのリターンシーケンス内で処理される。ＣＰＵ１はリターン命令Ｉ１６をデコードすると、以降のステージで退避履歴レジスタ１１を参照し、スタックメモリから順にレジスタを復帰処理する。退避履歴レジスタ１１の参照方法は退避履歴レジスタ１１のレジスタＴ１５から降順に各レジスタの値を参照していき、初期値「１６」以外の値を見つけることで復帰処理が起動される。本例では退避履歴レジスタ１１のレジスタＴ３の参照により復帰処理が起動され、スタックメモリの内容をロードした後、退避履歴レジスタ１１のレジスタＴ３に格納されていた値「２」に基づき選択されたレジスタファイル６のｒ２にロードデータを復帰する。続いてスタックメモリからのロードデータを退避履歴レジスタ１１のレジスタＴ２に格納されていた値「１」に基づき選択されたレジスタファイル６のｒ１に復帰する。続いてスタックメモリからのロードデータを退避履歴レジスタ１１のレジスタＴ１に格納されていた値「０」に基づき選択されたレジスタファイル６のｒ０に復帰する。ここで退避履歴レジスタ１１のレジスタＴ１までの参照が完了したため、スタックメモリからのレジスタ復帰処理は終了する。
【００３７】
以上詳述したように、本発明による第１実施例のＣＰＵ１では、割込み発生時において、レジスタをスタックメモリに退避する際に、スタックメモリへ退避したレジスタの番号を、退避履歴レジスタ１１に退避順に記録している。またリターン命令により元のプログラムへ戻る際に、退避履歴レジスタ１１を参照することで、スタックメモリからのレジスタ復帰を自動的に行っている。
【００３８】
このように本発明による第１実施例のＣＰＵ１によれば、スタックメモリからのレジスタ復帰処理をリターン命令だけで行うことができ、明示的なスタックからのレジスタ復帰命令によらず実行することができる。したがって割込みサービスルーチン中にはいかなるレジスタ復帰命令もコーディングする必要がなくなり、メモリ使用量を抑えることが可能となる。また、メモリからのレジスタ復帰命令の読み込みを行わずにレジスタの復帰を行うので、復帰にかかる時間が短縮され割込み処理の応答性を高くすることができる。
【００３９】
なお上述した構成をとる場合、１の割込み処理内では、レジスタファイル６の同一のレジスタについての複数回のスタックへのレジスタ退避を行わないようにする必要がある。例えば図３の命令Ｉ１３と命令Ｉ１４の間に「レジスタ０をスタックに退避する」という命令がある場合、図２に示す退避履歴レジスタ１１のレジスタＴ４に０が書き込まれてしまい、命令Ｉ１６でのレジスタ復帰が正しく行われないからである。これを解決するためには、例えばプログラマが、割込み処理内では割込み前の処理におけるレジスタの値を退避するため以外にはスタックへの退避を行わないようにプログラムを作成するようにすればよい。
【００４０】
しかしプログラマがこれを守らない場合には、プログラマが意図したように動作しなくなってしまう。そこで、このようなプログラム（命令列）が生成されないようにコンパイラやアセンブラ、リンカなどを構成すればよい。すなわち、例えばソースコード内で、割込みサービスルーチン開始アドレスから配置するように指示された部分を検出し、その検出した部分について、同一レジスタに対する複数回のスタックへの退避を行わないようにプログラムを生成する。例えばアセンブラで対応するのであれば、アセンブラによる処理では、割込みサービスルーチン開始アドレスから配置されたソースコード内で同一レジスタに対する２度目のレジスタ退避命令を検出した場合に、そのレジスタ退避命令をスタック以外のメモリ上の領域へのレジスタ退避命令に変更する。そして対応するレジスタ復帰命令を検出した場合にこのメモリ上の領域からのレジスタ復帰命令に変更する。このようにすれば、プログラマが注意しなくても正常に動作させることのできるプログラムを生成できる。なお命令の変更を行うのではなく、こうしたソースコード内の命令を検出した場合に警告を発するようにしてプログラマに修正を促してもよい。またレジスタ退避命令の前に例えば条件分岐等があり、どのレジスタ退避命令が最初のレジスタ退避命令か特定できない場合などには警告を発するようにするとよい。
【００４１】
また、コンパイラやアセンブラで、こうしたプログラムが生成されないようにするのではなく、ＣＰＵ１のハードウェアによって対応するようにしてもよい。すなわち例えば図５に示すようにＳＰ１０とは別のスタックポインタであるＳＰＩ１３を設け、割込み処理内での２度目のスタックへのレジスタ退避命令をデコーダ２がデコードした場合には、退避履歴レジスタ１１への格納は行わず、またＳＰ１０ではなくＳＰＩ１３の指すアドレスへレジスタを退避する。そして対応するレジスタ復帰命令を検出した場合には、ＳＰＩ１３の指すアドレスからレジスタを復帰する。このようにすれば、ソフトウェア（例えばコンパイラ，アセンブラ，リンカなど）で対応することなくプログラマが意図した通りに動作する。なお、ＳＰ１０を利用する命令とＳＰＩ１３を利用する命令を別の命令として定義して明示的に区別して利用するようにしてもよい。
［第２実施例］
次に、本発明が適用された第２実施例の情報処理装置としてのＣＰＵ１について、図面を用いて説明する。図６は、本発明が適用された第２実施例のＣＰＵ１の内部構成を表すブロック図である。前記第１実施例との相違点は、デコーダ２に割込みの多重度を設定する多重度設定レジスタ１２を備え、退避履歴レジスタ１１を、割込みレベル数分だけ持つようにした点であり、図７に表すように、多重度設定レジスタ１２により、退避履歴レジスタ１１を選択するような構成としている。
【００４２】
多重度設定レジスタ１２は、初期化処理により例えば０にリセットされ、割込みの起動処理によってインクリメント、例えば＋１され、割込みの終了処理によってディクリメント、例えば−１される。
割込みが発生するとＣＰＵ１は、ＰＳＲ８とＰＣ９をスタックメモリに退避した後、例外処理ベクタテーブルを参照し、指定された割込みサービスルーチン開始アドレスに分岐し、割込みサービスルーチンを実行する。この一連の割込み起動処理により、多重度設定レジスタ１２はインクリメント、例えば＋１され、１が設定される。すると退避履歴レジスタ１１のうち、レジスタＴ１−０からレジスタＴ１−ｎが選択される。以下、退避履歴レジスタ１１を用いたレジスタファイル６の退避及び復帰にかかる基本的な動作は、前記第１実施例と同じであるため、省略する。
【００４３】
例えば、この割込みサービスルーチン処理中に、優先順位の高い別の割込みが発生した場合、本発明が適用された第２実施例のＣＰＵ１は、ＰＳＲ８とＰＣ９をスタックに退避した後、割込みベクタテーブルを参照し、指定された割込みサービスルーチン開始アドレスに分岐し割込みサービスルーチンを実行する。この一連の割込み起動処理により、多重度設定レジスタ１２がインクリメント、例えば＋１され、２が設定される。すると退避履歴レジスタ１１のうち、レジスタＴ２−０からレジスタＴ２−ｎが選択される。以下、退避履歴レジスタ１１を用いたレジスタファイル６の退避及び復帰にかかる基本的な動作は、前記第１実施例と同じであるため、省略する。
【００４４】
更に例えば、この割込みサービスルーチン処理中に、優先順位の高い別の割込みが発生した場合も同様に、一連の割込み起動処理により、多重度設定レジスタ１２がインクリメントされ、多重度設定レジスタ１２の内容に対応した退避履歴レジスタ１１が選択される。
【００４５】
次に割込みサービスルーチンの処理が完了し、割込みが終了すると、多重度設定レジスタ１２がディクリメントされ、多重度設定レジスタ１２の内容に対応した退避履歴レジスタ１１が選択される。つまり、自身より高い優先度の割込みにより、処理が中断されたとしても、退避履歴レジスタ１１の内容が保護されるため、引き続き処理を行うことが可能となる。
【００４６】
以上詳述したように、本発明による第２実施例のＣＰＵ１では、退避履歴レジスタ１１を複数セット設け、多重度設定レジスタ１２により、多重化された割込み毎に、退避履歴レジスタ１１を選択的に使用している。
よって、本発明による第２実施例のＣＰＵ１によれば、多重割込みを許可するマイクロコンピュータにおいても、スタックメモリからのレジスタ復帰処理を命令によらず確実に実行することができ、割込みサービスルーチン中にはいかなるレジスタ退避命令もコーディングする必要がなくなり、メモリ使用量を抑えることが可能となる。また、メモリからのレジスタ復帰命令の読み込みを行わずにレジスタの復帰を行うので、復帰にかかる時間が短縮され割込み処理の応答性を高くすることができる。
［第３実施例］
第３実施例の情報処理装置としてのＣＰＵ１は、各レジスタについて割込み処理内での最初のレジスタの書き換えを検出し、書き換え前のレジスタの内容を自動的に退避するものである。
【００４７】
本発明が適用された第３実施例の情報処理装置としてのＣＰＵ１について、図面を用いて説明する。図８は、本発明が適用された第３実施例のＣＰＵ１の内部構成を表すブロック図である。
図８に示すように、デコーダ２は前記第１実施例の構成に加え、レジスタファイル６を書き換える命令を検出し、命令によって書き換えられるレジスタの番号を後述する退避レジスタ番号格納手段１８に送るレジスタ書き換え命令検出手段１５と、レジスタ書き換え命令検出手段１５により出力されたレジスタ番号が、起動された割込み処理において初めて検出されたものであるかどうかを判別するための退避実行フラグレジスタ１６と、レジスタを退避するか否かを判定する退避実行判定手段１７と、退避するレジスタの番号を格納する退避レジスタ番号格納手段１８と、後述する退避アドレス算出ユニット１４の出力と、後述する実行ユニット５の出力を選択出力するアドレス選択手段１９とを備える。
【００４８】
退避実行フラグレジスタ１６は、図９に示すように、レジスタファイル６を構成する複数の内部レジスタ各々に対応した１ビットのレジスタで構成され、リセット或いは割込み起動時に初期化され（リセット状態）、対応する内部レジスタの退避の実行によりセットされる（セット状態）。
【００４９】
そして、データパス３は、図１に示すように、第１実施例と同様にメモリアクセスステージにてメモリからデータバスを介してデータをロードしたり、メモリにストアすべきデータをデータバスへ出力するロードストアユニット４と、実行ステージにて命令の内容に応じた演算を行う実行ユニット５と、複数の内部レジスタｒ０，ｒ１，ｒ２，…（図示省略）を内蔵したレジスタファイル６と、メモリからフェッチステージで読み込むべき命令のアドレスを格納及びカウントするプログラムカウンタ（以下、ＰＣ）９と、ＣＰＵの内部状態を示すプロセッサステータスレジスタ（以下、ＰＳＲ）８と、スタックメモリのアドレスを格納するスタックポインタ（以下、ＳＰ）１０と、メモリアクセスステージにてアドレスバスへアドレスを出力するアドレスユニット７と、スタックメモリへ退避したレジスタの退避履歴をとる退避履歴レジスタ１１に加え、退避先のアドレスを算出する退避アドレス算出ユニット１４を備える。
【００５０】
割込みが発生するとＣＰＵ１は、ＰＳＲ８とＰＣ９をスタックに退避した後、割込みベクタテーブルを参照し、指定された割込みサービスルーチン開始アドレスに分岐し割込みサービスルーチンを実行する。フェッチした命令のデコードステージにて命令を解読するとともに、レジスタ書き換え命令検出手段１５が起動される。レジスタ書き換え命令検出手段１５の起動は、ＰＳＲ８をモニタすることで制御され、具体的にはＰＳＲ８のうち、例外処理実行状態を示すフラグによって制御される。レジスタ書き換え命令検出手段１５は、
［１］レジスタを書き換える命令であり、かつロード操作を伴う命令ではない。
［２］レジスタを書き換える命令であり、かつロード操作を伴う命令である。
［３］レジスタを書き換える命令ではない。
の３つの場合に分けて検出し、その検出結果により以降の動作が異なるものとなる。以下［１］から［３］の順に動作を説明する。
【００５１】
［１］レジスタを書き換える命令であり、かつロード操作を伴う命令ではない場合。
レジスタ書き換え命令検出手段１５は、レジスタを書き換える命令であり、かつロード操作を伴う命令ではない命令を検出した場合、検出結果および書き換えられるレジスタの番号を退避実行判定手段１７へ出力する。退避実行判定手段１７は、この検出結果と書き換えられるレジスタの番号に対応する退避実行フラグレジスタ１６の内容をもとに、レジスタファイル６をスタックへ退避するか否かを判定する。すなわち、書き換えられるレジスタの番号に対応する退避実行フラグレジスタ１６がリセット状態であればスタックへの退避を行うと判定し、セット状態であればスタックへの退避を行わないと判定する。
【００５２】
ここで退避実行フラグレジスタ１６が、リセット或いは割込み起動時に初期化されている場合（リセット状態の場合）には、スタックへの退避を行うように判定され、退避するレジスタファイル６のレジスタ番号を、退避レジスタ番号格納手段１８に格納し、第１実施例のレジスタ退避の場合と同様にして退避履歴レジスタ１１にも格納する。なお退避実行フラグレジスタ１６については、デコードステージから実行ステージへ移行するタイミングで、書き換えられるレジスタの番号に対応するフラグレジスタだけをセットする。続く実行ステージでは、実行ユニット５により命令本来の演算を実行するとともに、退避アドレス算出ユニット１４により退避先のアドレスを算出する。続くメモリアクセスステージは、本来の命令により使用されることはないステージであるが、アドレス選択手段１９が退避アドレス算出ユニット１４の出力を選択し、ロードストアユニット４はこのアドレス選択手段１９で選択されたアドレスへ、退避レジスタ番号格納手段１８に格納されている番号の内部レジスタのデータを退避する。続くライトバックステージでは、実行ステージでの演算結果を、内部レジスタへ格納する。
【００５３】
一方、退避実行フラグレジスタ１６が、セット状態の場合には、スタックへの退避を行わないように判定され、通常の命令として実行する。
したがって、既に退避実行した内部レジスタを再度書き換える命令を検出した場合には、退避実行フラグレジスタ１６がセット状態であるため、再度退避実行されることはない。
【００５４】
［２］レジスタを書き換える命令であり、かつロード操作を伴う命令である場合。
レジスタを書き換える命令であり、かつロード操作を伴う命令である命令を検出した場合は、メモリアクセスステージの動作のみが［１］と異なる。つまり、ロード操作を伴う命令では、メモリアクセスステージを本来の命令が使用するため、レジスタの退避と命令におけるロードがシーケンシャルに行う。
【００５５】
［３］レジスタを書き換える命令ではない場合。
この場合、レジスタの退避にかかわる一切の処理は行われず、命令本来の処理のみを実行する。
以上詳述したように、本発明による第３実施例のＣＰＵ１では、割込みサービスルーチン中の命令が、レジスタファイル６を書き換える命令であるか否かを検出し、書き換える命令である場合にはその書き換えが当該割込みサービスルーチン内での当該レジスタに対する最初の書き換えであるか否かを退避実行フラグレジスタ１６に状態に基づいて判定し、当該レジスタに対する最初の書き換えであると判定された場合には、命令のメモリアクセスステージで、対象となるレジスタファイル６の内容を、自動的にスタックへ退避する。
【００５６】
したがって、例えば第１実施例の図３に示した命令Ｉ１３の「レジスタ０に即値ａをセット」というレジスタ０の書き換えを検出した場合には、レジスタ０の値は即値ａをセットする前にスタックへ退避される。命令Ｉ１４，Ｉ１５でも同様に各レジスタの書き換え前にそのレジスタの内容がスタックへ退避される。その結果、第１実施例の命令Ｉ１０〜Ｉ１２のようなレジスタ退避命令が不要となる。すなわち、第３実施例のＣＰＵ１によれば、図３のＩ１３〜Ｉ１６のみで割込みサービスルーチンを構成できる。なお、命令Ｉ１６におけるレジスタ復帰は第１実施例と同様に行われる。
【００５７】
このように、本発明による第３実施例のＣＰＵ１によれば、命令の実行とスタックへの退避を並行して実行することができ、レジスタ退避命令のフェッチや実行が不要となり、割込み処理の応答性を高めることが可能となる。また割込みサービスルーチン中にはいかなるレジスタ退避命令もレジスタ復帰命令もコーディングする必要がなくなり、メモリ使用量を抑えることが可能となる。
【００５８】
なお上述した構成をとる場合、割込み処理内では、明示的なレジスタ退避命令（例えばＰＵＳＨ  ｒｅｇ１）によるスタックへのレジスタ退避を行わないようにする必要がある。このようなレジスタ退避命令の実行は禁止するように構成してもよいが、図５に示して説明したスタックポインタＳＰＩ１３を備え、明示的なレジスタ退避命令によるスタックへの退避はスタックポインタＳＰ１０の指すアドレスへ行う一方、レジスタ書き換えによる自動的な退避はスタックポインタＳＰＩ１３の指すアドレスへ行うようにするとよい。
【００５９】
また、このような明示的なレジスタ退避命令が割込み処理ルーチン内に含まれないプログラムを生成するようにコンパイラ、アセンブラ、リンカなどを構成してもよい。すなわち、例えばソースコード内で、割込みサービスルーチン開始アドレスから配置するように指示された部分を検出し、その検出した部分について、明示的なレジスタ退避命令を他の命令に置き換えるなどしてスタックへの退避を行わないようにプログラムを生成する。例えばアセンブラによる処理において、割込みサービスルーチン開始アドレスから配置されたソースコード内で明示的なレジスタ退避命令を検出した場合に、その明示的なレジスタ退避命令をスタック以外のメモリ上の領域へのレジスタ退避命令（例えばストア命令）に変更する。そして対応するレジスタ復帰命令を検出した場合にこのメモリ上の領域からのレジスタ復帰命令に変更する。このようにすれば、プログラマが注意しなくても正常に動作させることのできるプログラムを生成できる。なお命令の変更を行うのではなく、こうしたソースコード内の命令を検出した場合に警告を発するようにしてプログラマに修正を促してもよい。
［第４実施例］
次に、本発明が適用された第４実施例の情報処理装置としてのＣＰＵ１について、図面を用いて説明する。図１０は、本発明が適用された第４実施例のＣＰＵ１の内部構成を表すブロック図である。前記第３実施例との相違点は、図１１に表すように、退避実行フラグレジスタ１６を複数セット設け、図１０及び図１１に表すようにデコーダ２に、割込みの多重度を示す割込み多重度設定手段２１と、割込み多重度設定手段２１の内容により複数セットある退避実行フラグレジスタ１６の中から割込み多重度に対応した退避実行フラグレジスタ１６を選択する退避実行フラグレジスタ選択手段２０を設けた点である。ここで割込み多重度設定手段２１は、リセットにより初期化され、割込みの起動によりインクリメントされ、割込みの終了によりディクリメントされる。以下に動作を説明する。
【００６０】
割込みが発生するとＣＰＵ１は、ＰＳＲ８とＰＣ９をスタックに退避した後、割込みベクタテーブルを参照し、指定された割込みサービスルーチン開始アドレスに分岐し割込みサービスルーチンを実行する。ここで割込みの起動により、割込み多重度設定手段２１が、初期状態、例えば０からインクリメント、例えば＋１され、１が設定される。このとき、退避実行フラグレジスタ選択手段２０は、割込み多重度設定手段２１の内容に対応した退避実行フラグレジスタ１６を選択する。以降、基本的な動作については、前記第３実施例で詳説したものと全く同様であるため、省略する。
【００６１】
例えば、ここでこの割込みサービスルーチン処理中に、優先順位の高い別の割込みが発生した場合、本発明が適用された第４実施例のＣＰＵ１は、ＰＳＲ８とＰＣ９をスタックに退避した後、割込みベクタテーブルを参照し、指定された割込みサービスルーチン開始アドレスに分岐し割込みサービスルーチンを実行する。ここで割込みの起動により、割込み多重度設定手段２１が、インクリメント、例えば＋１され、２が設定される。このとき、退避実行フラグレジスタ選択手段２０は、割込み多重度設定手段２１の内容に対応した退避実行フラグレジスタ１６を選択する。以降、基本的な動作については、前記第１実施例で詳説したものと全く同様であるため、省略する。
【００６２】
更に例えば、ここでこの割込みサービスルーチン処理中に、優先順位の高い別の割込みが発生した場合も同様に、割込みの起動により、割込み多重度設定手段２１がインクリメントされ、割込み多重度設定手段２１の内容に対応した退避実行フラグレジスタ１６を選択する。
【００６３】
次に割込みサービスルーチンの処理が完了し、割込みが終了すると、割込み多重度設定手段２１がディクリメントされ、割込み多重度設定手段２１の内容に対応した退避実行フラグレジスタ１６を選択する。つまり、自身より高い優先度の割込みにより、処理が中断されたとしても、退避実行フラグレジスタ１６の内容が保護されるため、引き続き処理を行うことが可能となる。
【００６４】
以上詳述したように、本発明による第４実施例のＣＰＵ１では、退避実行フラグレジスタ１６を複数セット設け、割込み多重度設定手段２１により、多重化された割込み毎に、退避実行フラグレジスタ１６を選択的に使用する。よって、本発明による第４実施例のＣＰＵ１によれば、多重割込み発生時においても、スタックへの退避を確実に行うことができ、割込み処理の応答性を高めるとともに、メモリ使用量を抑えることが可能となる。
【図面の簡単な説明】
【図１】第１実施例のＣＰＵの内部構成を表すブロック図である。
【図２】第１実施例のＣＰＵの退避履歴レジスタの内部構成を表すブロック図である。
【図３】第１実施例のＣＰＵの割込みサービスルーチンのプログラム例を示す説明図である。
【図４】第１実施例のＣＰＵの命令実行パイプライン動作例を示す説明図である。
【図５】第１実施例の別例のＣＰＵの内部構成を表すブロック図である。
【図６】第２実施例のＣＰＵの内部構成を表すブロック図である。
【図７】第２実施例のＣＰＵの退避履歴レジスタの内部構成を表すブロック図である。
【図８】第３実施例のＣＰＵの内部構成を表すブロック図である。
【図９】第３実施例のＣＰＵの退避実行フラグレジスタの内部構成を表すブロック図である。
【図１０】第４実施例のＣＰＵの内部構成を表すブロック図である。
【図１１】第４実施例のＣＰＵの退避実行フラグレジスタの内部構成を表すブロック図である。
【図１２】従来のＣＰＵの内部構成を表すブロック図である。
【符号の説明】
１，１０１…ＣＰＵ（情報処理装置）
２，１０２…デコーダ
３，１０３…データパス
４，１０４…ロードストアユニット
５，１０５…実行ユニット
６，１０６…レジスタファイル
７，１０７…アドレスユニット
８，１０８…ＰＳＲ（プロセッサステータスレジスタ）
９，１０９…ＰＣ（プログラムカウンタ）
１０，１１０…ＳＰ（スタックポインタ）
１１…退避履歴レジスタ
１２…多重度設定レジスタ
１３…ＳＰＩ（別のスタックポインタ）
１４…退避アドレス算出ユニット
１５…レジスタ書き換え命令検出手段
１６…退避実行フラグレジスタ
１７…退避実行判定手段
１８…退避レジスタ番号格納手段
１９…アドレス選択手段
２０…退避実行フラグレジスタ選択手段
２１…割込み多重度設定手段
【図１】
0003931646.tif 000002
【図２】
0003931646.tif 000003
【図３】
0003931646.tif 000004
【図４】
0003931646.tif 000005
【図５】
0003931646.tif 000006
【図６】
0003931646.tif 000007
【図７】
0003931646.tif 000008
【図８】
0003931646.tif 000009
【図９】
0003931646.tif 000010
【図１０】
0003931646.tif 000011
【図１１】
0003931646.tif 000012
【図１２】
0003931646.tif 000013