(57)【要約】      （修正有）【課題】プログラム実行時にスタック領域が当初想定したメモリ領域を越えてデータ領域等を破壊し、プログラムが予期せぬ動作をしてしまうことを、ソフトウエアの負担増大を抑えながら、防止する。【解決手段】スタックポインタレジスタと、第１スタック領域の終端アドレスを設定するスタック終端レジスタと、第２スタック領域の開始アドレスを設定するための第２スタック領域開始レジスタと、プッシュ動作時にはスタックポインタレジスタのアドレスが第１スタック領域の終端に到達した時にスタックポインタレジスタのアドレスを第２スタック領域の開始アドレスに置換え、ポップ動作時にはスタックポインタレジスタのアドレスが第２スタック領域の開始アドレスに到達した時にスタックポインタレジスタのアドレスを第１スタック領域の終端アドレスに置換えるスタックポインタ制御回路とを備える。【選択図】図１
2006202268.tif 000002
【特許請求の範囲】
【請求項１】
現在のスタック領域の先頭アドレスを格納するスタックポインタレジスタと、
第１スタック領域の終端アドレスを設定するスタック終端レジスタと、
第２スタック領域の開始アドレスを設定する第２スタック領域開始レジスタと、
前記スタックポインタレジスタのアドレスが前記スタック終端レジスタに設定されているアドレスに到達した次のプッシュ動作において、該スタックポインタレジスタのアドレスを前記第２スタック領域開始レジスタに設定されているアドレスに置換え、また前記スタックポインタレジスタのアドレスが前記第２スタック領域開始レジスタに設定されているアドレスに到達した次のポップ動作において、該スタックポインタレジスタのアドレスを前記スタック終端レジスタに設定されているアドレスに置換えるスタックポインタ制御回路とを備えたことを特徴とするＣＰＵ。
【請求項２】
前記スタックポインタレジスタのアドレスが前記第１スタック領域の終端アドレス又は当該終端アドレスよりも所定値だけ第１スタック領域内のアドレスに到達した時に、内部割込要求信号を発生するスタック終端判定回路をさらに備え、
前記内部割込要求信号により移行する割込ルーチンにおいて、前記第２スタック領域を動的に確保し、該確保された第２スタック領域の開始アドレスを前記第２スタック領域開始レジスタに設定することを特徴とする請求項１記載のＣＰＵ。
【請求項３】
前記スタック終端判定回路は、プッシュ動作時とポップ動作時とでは、異なる内部割込要求信号を発生することを特徴とする請求項２に記載のＣＰＵ。
【請求項４】
前記スタック終端判定回路が、前記第２のスタック領域が確保されているか否かを示す値を記憶する第２スタック領域イネーブルフラグを備え、該イネーブルフラグの値を参照して前記内部割込要求信号を発生することを特徴とする請求項２または３記載のＣＰＵ。
【請求項５】
前記スタック終端判定回路が、前記第２のスタック領域が確保されているか否かを示す値を記憶する第２スタック領域イネーブルフラグを備え、かつ、該イネーブルフラグは、前記内部割込要求信号により移行した割込ルーチンから読み出し可能であることを特徴とする請求項２記載のＣＰＵ。
【請求項６】
前記第２スタック領域開始レジスタは、前記内部割込信号により移行した割込ルーチンにおいて書き込み可能であって、該割込ルーチンが前記第２スタック領域を動的に確保した時には該確保した第２スタック領域の開始アドレスが書き込まれ、該割込ルーチンが前記第２スタック領域を解放したときには無効な値が書き込まれ、
かつ、
前記スタック終端判定回路が、前記第２スタック領域開始レジスタへの書き込みを検知して前記イネーブルフラグの設定を行う、イネーブルフラグ制御回路をさらに含むことを特徴とする請求項４または５記載のＣＰＵ。
【請求項７】
現在のスタック領域の先頭アドレスを格納するスタックポインタレジスタと、第１スタック領域の終端アドレスを設定するスタック終端レジスタと、第２スタック領域の開始アドレスを設定する第２スタック領域開始レジスタと、前記スタックポインタレジスタのアドレスが前記第１スタック領域の終端アドレス又は当該終端アドレスよりも所定値だけ第１スタック領域内のアドレスに到達した時に、内部割込要求信号を発生するスタック終端判定回路とを備えたＣＰＵにおけるスタック領域制御方法であって、
前記内部割込要求信号により割込ルーチンに移行し、該割込ルーチンにおいて前記第２スタック領域を動的に確保し、該確保された第２スタック領域の開始アドレスを前記第２スタック領域開始レジスタに設定することを特徴とするスタック領域制御方法。
【請求項８】
前記ＣＰＵのプッシュ動作時には、前記割込ルーチンにおいて、前記第２スタック領域の動的確保および前記第２スタック領域開始レジスタへの第２スタック領域開始アドレスの設定を行い、
前記ＣＰＵのポップ動作時には、前記割込ルーチンにおいて、前記プッシュ時割込ルーチンで確保された第２スタック領域を解放することを特徴とする請求項７記載のスタック領域制御方法。
【請求項９】
前記スタック終端判定回路が、前記第２スタック領域が確保されているか否かを示す値を記憶する第２スタック領域イネーブルフラグを備え、
前記割込ルーチンにおいて、前記イネーブルフラグの値を読み出し、該イネーブルフラグの値に応じて異なる処理を行うことを特徴とする請求項７記載のスタック領域制御方法。
【請求項１０】
前記スタック終端判定回路が、前記第２スタック領域が確保されているか否かを示す値を記憶する第２スタック領域イネーブルフラグを備えるとともに、前記第２スタック領域開始レジスタへの書き込みを検知して該イネーブルフラグの設定を行う、イネーブルフラグ制御回路を含み、
前記割込ルーチンにおいて、前記第２スタック領域を動的に確保した時には該確保した第２スタック領域の開始アドレスを前記第２スタック領域開始レジスタに書き込み、前記第２スタック領域を解放したときには前記第２スタック領域開始レジスタに無効な値を書き込むことを特徴とする請求項７または９記載のスタック領域制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スタックポインタ制御回路を備えたＣＰＵ、およびＣＰＵにおけるスタック領域制御方法に関する。特に、スタックポインタレジスタを有するＣＰＵにおいて、プログラムの実行時にスタック領域が当初想定したメモリ領域を越えてデータやプログラムコードを破壊し、プログラムが予期せぬ動作をしてしまうという不具合を防止する技術に関する。
【背景技術】
【０００２】
ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）には、外部からの割込要求信号の入力や内部での例外事象等の割込要因の発生に応じて、現在実行中の処理を中断して割込処理に移行し、割込処理の終了後に再び元の処理に復帰する割込機能が備えられている。
【０００３】
一般的に割込みは、その機能を実現するための処理である割込ルーチン処理と、その割込ルーチン処理に先だって元の処理の実行時の各種レジスタの値をスタック領域（後入れ先出し方式のメモリ領域）に退避する処理を行う割込入力処理と、割込ルーチン処理の終了後に割込入力処理で退避した各種レジスタの値をスタック領域から元のレジスタに復元して前の処理に復帰する割込終了処理から構成される。このように割込入力処理で各種レジスタの値をスタック領域に退避し，割込終了処理でスタック領域に退避されている値を元のレジスタに復元することで，割込ルーチンでレジスタの値を書き換えたとしても、割込前の処理に復帰する時点で、レジスタの値は割込前のレジスタの値に復元される。すなわち、割込の前後でレジスタの値が変わらないようにすることができ、元の処理を正常に継続することができる。ここで、スタック領域にデータを格納することをプッシュ動作といい、データを取り出すことをポップ動作という。
【０００４】
一般的にＣＰＵには、現在のスタック領域の先頭アドレスを格納するスタックポインタレジスタ（以下、スタックポインタと記す）が備えられており、ＣＰＵの起動後にソフトウエアによりスタックポインタに初期値となるメモリアドレスを設定してスタック領域を使用する。
【０００５】
ＣＰＵの一例として、現在でも組込み用途に用いられることの多いＺ８０ＣＰＵのレジスタ構造を図８に示す（例えば、非特許文献１参照）。Ｚ８０ＣＰＵにはレジスタ群として、アキュムレータとして用いられるＡ，Ａ’  やフラグレジスタＦ，Ｆ’  、汎用レジスタとして用いられるＢからＬと、補助レジスタとして用いられるＢ’からＬ’と、専用レジスタとして用いられるスタックポインタ（ＳＰ）やプログラムカウンタ（ＰＣ）等が備わっている。
【０００６】
通常、スタック領域を実現するためのメモリ領域は１つであり、物理的に複数には分離されない。そのため、時として、図９に示すように、実際のプログラム実行時に、割込みやサブルーチンが重なること等によって当初想定したメモリ領域を越えてスタック領域がメモリを消費してしまうことがある。このような場合、もともと所定のメモリ領域に保持されているプログラムコード、変数などのデータが書き換わってしまうこととなり、プログラムが予期せぬ動作をしてしまうという不具合が発生することがあった。
【０００７】
このような不具合に対処するために、例えば、特許文献１には、スタックエリアの上限アドレスを格納するレジスタと、該レジスタに格納されたアドレスと記憶回路をアクセスするときのアドレスとを比較し、記憶回路をアクセスするアドレスの値が該レジスタの値より小さいときにＣＰＵに割込信号を出力するコンパレータとを備え、当該割込みによって実行されるサブルーチンによって実行中のプログラムにスタックの異常使用を認識させて、プログラムの実行を停止してプログラムの破壊を未然に防ぐという技術が開示されている。
【０００８】
また、特許文献２には、ＣＰＵにより、割込処理を起動し、スタックポインタの値を汎用レジスタに設定する処理を実行し、主メモリ上の空きエリアのアドレスをスタックポインタに設定する処理を実行するという技術が開示されている。
【非特許文献１】「トランジスタ技術  ＳＰＥＣＩＡＬ  Ｎｏ．６  特集Ｚ８０ソフト＆ハードのすべて」、ＣＱ出版社、１９８７年１１月１日（初版）、ｐ．１８、図２−１
【特許文献１】特開平７‐２１９８１３号公報
【特許文献２】特開平８−７７００４号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
しかしながら、上記特許文献１に記載の技術では、プログラムの実行を停止することによりプログラムの破壊を防止するだけであって、スタック領域が当初想定した領域を越えても正常に動作させるという技術内容ではない。
【００１０】
一方、特許文献２に記載の技術では、プロセル空間の破壊を防ぎ、システムを継続して実行することを可能としている。しかし、これを実現するためにＣＰＵによるソフトウエア処理が必要であり、処理速度が低下するという問題があった。
【００１１】
本発明は，上記事情に鑑み、スタック領域が当初想定したメモリ領域を越えてメモリ領域を消費してしまう恐れのある場合であってもプログラムの実行を停止することなく、正常な動作を継続することのできるＣＰＵおよび当該ＣＰＵを用いたスタック領域制御方法を提供することを目的とする。特に、ソフトウエアの負担増大による処理速度低下を抑制しながら、正常な動作を継続することのできるＣＰＵおよびスタック領域制御方法を提供することを目的とする
【課題を解決するための手段】
【００１２】
上記目的を達成する本発明のＣＰＵは、現在のスタック領域の先頭アドレスを格納するスタックポインタレジスタと、第１スタック領域の終端アドレスを設定するスタック終端レジスタと、第２スタック領域の開始アドレスを設定する第２スタック領域開始レジスタと、前記スタックポインタレジスタのアドレスが前記スタック終端レジスタに設定されているアドレスに到達した次のプッシュ動作において、該スタックポインタレジスタのアドレスを前記第２スタック領域開始レジスタに設定されているアドレスに置換え、また前記スタックポインタレジスタのアドレスが前記第２スタック領域開始レジスタに設定されているアドレスに到達した次のポップ動作において、該スタックポインタレジスタのアドレスを前記スタック終端レジスタに設定されているアドレスに置換えるスタックポインタ制御回路とを備えたことを特徴とする。
【００１３】
スタックポインタ制御回路を備えることにより、スタック領域が当初想定した領域を越えてメモリ領域を消費し、データを破壊する恐れのある場合にも、ソフトウエアの負担増大を抑えながら、正常な動作を継続することができる。
【００１４】
ここで、前記スタックポインタレジスタのアドレスが前記第１スタック領域の終端アドレス又は当該終端アドレスよりも所定値だけ第１スタック領域内のアドレスに到達した時に、内部割込要求信号を発生するスタック終端判定回路をさらに備え、前記内部割込要求信号により移行する割込ルーチンにおいて、前記第２スタック領域を動的に確保し、該確保された第２スタック領域の開始アドレスを前記第２スタック領域開始レジスタに設定することが好ましい。スタック終端判定回路を備え、第２スタック領域を動的に確保するため、メモリ領域の有効活用が可能である。
【００１５】
ここで、前記スタック終端判定回路は、プッシュ動作時とポップ動作時では、異なる内部割込要求信号を発生するものであることが好ましい。
【００１６】
また、前記スタック終端判定回路が、前記第２スタック領域が確保されているか否かを示す値を記憶する第２スタック領域イネーブルフラグを備え、該イネーブルフラグの値を参照して前記内部割込要求信号を発生することが好ましい。これにより、第2スタック領域が確保されているか否かに応じた処理を行うことが可能になる。
【００１７】
もしくは、該イネーブルフラグは、前記内部割込要求信号により移行した割込ルーチンから読み出し可能であることが好ましい。これにより、割込ルーチン移行後に、第２スタック領域が確保されているか否かによって異なる処理を行うことが可能になる。
【００１８】
さらに、前記第２スタック領域開始レジスタが、前記内部割込信号により移行した割込ルーチンにおいて書き込み可能であって、該割込ルーチンが前記第２スタック領域を動的に確保した時には該確保した第２スタック領域の開始アドレスが書き込まれ、割込ルーチンが前記第２スタック領域を解放したときには無効な値が書き込まれ、かつ、前記スタック終端判定回路が、前記第２スタック領域への書き込みを検知して前記第２スタック領域イネーブルフラグの設定を行う、イネーブルフラグ制御回路をさらに含むことが好ましい。イネーブルフラグ制御回路を備えることにより、ソフトウエアの負担を増大させることなく、第２スタック領域イネーブルフラグ値の適切な設定が可能となる。
【００１９】
上記目的を達成する本発明のスタック領域制御方法は、現在のスタック領域の先頭アドレスを格納するスタックポインタレジスタと、第１スタック領域の終端アドレスを設定するスタック終端レジスタと、第２スタック領域の開始アドレスを設定する第２スタック領域開始レジスタと、前記スタックポインタレジスタのアドレスが前記第１スタック領域の終端アドレス又は当該終端アドレスよりも所定値だけ第１スタック領域内のアドレスに到達した時に、内部割込要求信号を発生するスタック終端判定回路とを備えたＣＰＵにおけるスタック領域制御方法であって、前記内部割込要求信号により割込ルーチンに移行し、該割込ルーチンにおいて前記第２スタック領域を動的に確保し、該確保された第２スタック領域の開始アドレスを前記第２スタック領域開始レジスタに設定することを特徴とする。
【００２０】
確保された第2スタック領域の開始アドレスが第2スタック領域開始レジスタに設定されることにより、ＣＰＵは、ソフトウエアの負担増大を抑えながら、第2スタック領域を利用することができる。
【００２１】
ここで、前記ＣＰＵのプッシュ動作時には、前記割込ルーチンにおいて、前記第２スタック領域の動的確保および前記第２スタック領域開始レジスタへの第２スタック領域開始アドレスの設定を行い、前記ＣＰＵのポップ動作時には、前記割込ルーチンにおいて、前記プッシュ時割込ルーチンで確保された第２スタック領域を解放することが好ましい。ポップ時割込ルーチンにて第２スタック領域を解放することにより、メモリ領域のさらに有効な活用が可能である。
【００２２】
また、前記スタック終端判定回路が、前記第２スタック領域が確保されているか否かを示す値を記憶する第２スタック領域イネーブルフラグを備え、前記割込ルーチンにおいて、前記イネーブルフラグの値を読み出し、該イネーブルフラグの値に応じて異なる処理を行うことが好ましい。
【００２３】
さらに、前記スタック終端判定回路が、前記第２スタック領域が確保されているか否かを示す値を記憶する第２スタック領域イネーブルフラグを備えるとともに、前記第２スタック領域開始レジスタへの書き込みを検知して該イネーブルフラグの設定を行う、イネーブルフラグ制御回路を含み、前記割込ルーチンにおいて、前記第２スタック領域を動的に確保した時には該確保した第２スタック領域の開始アドレスを前記第２スタック領域開始レジスタに書き込み、前記第２スタック領域を解放したときには前記第２スタック領域開始レジスタに無効な値を書き込むことが好ましい。これにより、スタック終端判定回路が、ソフトウエアの負担増大を抑えながら、第２スタック領域イネーブルフラグの値の管理を行うことが可能になる。
【発明の効果】
【００２４】
本発明によるＣＰＵは、スタックポインタ制御回路を備えるので、スタック領域が当初想定した領域を越えてメモリ領域を消費し、データを破壊する恐れのある場合にも、ソフトウエアの負担増大を抑えながら、正常な動作を継続することができる。
【発明を実施するための最良の形態】
【００２５】
以下に添付の図面に示す好適実施形態に基づいて本発明のＣＰＵおよび当該ＣＰＵを用いたスタック領域制御方法を詳細に説明する。
【００２６】
図１は、本発明の一実施形態のＣＰＵの構成を示すブロック図である。図１に示すＣＰＵ１には、割込コントロール部１０、制御部２０、ＡＬＵ（算術論理ユニット）３０、レジスタ群４０、スタック終端判定回路５０が備えられている。レジスタ群４０は、本発明に直接には関係しない複数のレジスタを表すレジスタ群４００と、スタックポインタ（以下、ＳＰとも記す）４０１と、第１スタック領域（以下、当初のスタック領域を第１スタック領域という）の終端アドレスを保持するためのスタック終端レジスタ（以下、ＳＰＥ１レジスタと記す）４０２と、第２スタック領域の開始アドレスを保持するための第２スタック領域開始レジスタ（以下、ＳＰＳ２レジスタと記す）４０３とを備えている。
【００２７】
また、制御部２０は、本発明のスタックポインタ制御回路２２を備えている。スタックポインタ制御回路２２は、スタックポインタのアドレスがＳＰＥ１レジスタに設定されているアドレスに到達したときにスタックポインタのアドレスをＳＰＳ２レジスタに設定されているアドレスに置換え、スタックポインタのアドレスがＳＰＳ２レジスタに設定されているアドレスに到達したときにスタックポインタのアドレスをＳＰＥ１レジスタに設定されているアドレスに置換えるようにスタックポインタを制御する。
【００２８】
さらに、スタック終端判定回路５０は、第２スタック領域イネーブルフラグ５２を備えている。第２スタック領域イネーブルフラグ（以下、ＳＰ２ＥＮＢフラグと記す）には、第２スタック領域が確保されているか否かを示す値が記憶される。例えば、ＳＰ２ＥＮＢ＝Ｈは第２スタック領域が確保されていることを、ＳＰ２ＥＮＢ＝Ｌは第２スタック領域が確保されていない（もしくは、いったん確保された後に解放された）ことを示す。
【００２９】
なお、図１に示すブロック図には本発明に直接には関係しない回路ブロックの記載は省略している。
【００３０】
（実施例１）
図１に示したＣＰＵの動作の第１の例を説明する。
【００３１】
ＣＰＵ１の起動後にソフトウエアにより、スタックポインタに第１スタック領域の開始アドレスとなる初期値が設定されて、スタック領域の使用を開始する。一例として、図３に示されるように、アドレスＦＦＦＦｈ（１６進表示、以下同様）〜ＦＦ００ｈの範囲を第１スタック領域に設定し、ＦＦＦＦｈに近い（アドレス値の大きい）側を開始側とし、ＦＦ００ｈに近い（アドレス値の小さい）側を終端側とした場合を考える。すると、ＳＰ４０１の初期値としてはＦＦＦＥｈが設定される。そして、スタック領域が成長するに従い、スタックポインタ制御回路２２の制御により、ＳＰ４０１はＦＦＦＣｈ、ＦＦＦＡｈ、…の順に値が変化する。
【００３２】
すなわち、ここでは、一度に２アドレス分のスタック領域を使用し、ＳＰ４０１の値が２つずつ変化する場合を想定する。そして、２つのアドレスの内の終端に近い（値が小さい）方をＳＰ４０１の値とした。例えば、第１スタック領域の最初のＦＦＦＦｈ、ＦＦＦＥｈの２つのアドレスを使用する際には、ＳＰ４０１の値をＦＦＦＥｈとした。
【００３３】
本発明のＣＰＵ１では、第１スタック領域の終端アドレスを保持するためのＳＰＥ１レジスタ４０２を備えている。これを利用して、スタックポインタ制御回路２２は、第１スタック領域がどこで終了するのかを知り、スタック領域の利用を適切に制御することができる。
【００３４】
スタックポインタ制御回路２２の動作機構を図２を用いて説明する。図２はスタックポインタ（ＳＰ）制御回路２２の１例の回路ブロック図である。ＳＰ制御回路２２は、−２／＋２加減算器２２１と、切替器２２２と、比較器２２３とを備えている。また、プッシュ動作であるかポップ動作であるかを指示する制御信号が、制御部２０により比較器２２３に供給される。ここで例えば、ＳＰＥ１レジスタ４０２にはＦＦ００ｈが、ＳＰＳ２レジスタ４０３にはＦ０ＦＥｈが設定されているとする。
【００３５】
−２／＋２加減算器２２１は、プッシュ動作時にはＳＰの値を２だけ減算し、ポップ動作時にはＳＰの値を２だけ加算するものである。比較器２２３は、ＳＰの値が１つのスタック領域内で変わる場合には、−２／＋２加算器２２１の出力が切替器２２２から出力されるように切替器２２２を選択する。
【００３６】
比較器２２３は、プッシュ動作時にはＳＰＥ１レジスタ４０２に設定されたアドレスとＳＰ４０１のアドレスとを比較する。そして、ＳＰ４０１のアドレスがＳＰＥ１レジスタ４０２に設定された終端アドレス（即ち、ＦＦ００ｈ）と等しい比較結果が得られたときに、切替器２２２へ、ＳＰＳ２レジスタに設定されたアドレスを出力するように選択信号を出力する。すなわち、それ以前の動作によって第１スタック領域の終端アドレスまで利用された次のプッシュ動作においては、切替器２２２から第２スタック領域の開始アドレスがＳＰ４０１に供給され、クロックに同期して取り込まれる。これにより、ＳＰ４０１のアドレスが第２スタック領域に移り、第２スタック領域が利用される。
【００３７】
反対に、スタックがポップされる方向では、ＳＰ４０１の値がＦ０ＦＥｈとなった後、次の値はＦ１００ｈではなくＦＦ００ｈとなり、第１スタック領域にＳＰ４０１のアドレスが移ることになる。このために、比較器２２３は、ＳＰＳ２レジスタ４０３に設定されたアドレスとＳＰ４０１のアドレスを比較する。そして、両者が等しい比較結果が得られたときに、切替器２２２へ、ＳＰＥ１レジスタのアドレスを出力するように選択信号を出力する。すなわち、それ以前の動作によって第２スタック領域の開始アドレスまで利用された次のポップ動作においては、切替器２２２から第１スタック領域の終端アドレスがＳＰ４０１に供給され、クロックに同期して取り込まれる。
【００３８】
図２に示したスタックポインタ制御回路２２は、ＣＰＵ１内のハードウエアとして構成されるものである。そして、このスタックポインタ制御回路２２が、やはりハードウエアとして構成されるＳＰＥ１レジスタ４０２およびＳＰＳ２レジスタ４０３を利用して、スタックポインタの制御を行う。従って、特許文献２の場合とは異なり、ソフトウエアによる処理を必要とせず、第１および第２スタック領域の利用を実現しながら高速処理を可能とすることができる。
【００３９】
次に、スタック終端判定回路５０の動作について説明する。スタック終端判定回路は、ＳＰ４０１の値が第１スタック領域の終端に達したときに、第２スタック領域を確保し、もしくは解放するための、内部割込信号を発生する。
【００４０】
最も単純には、ＳＰ４０１の値がＳＰＥ１レジスタ４０２に設定された終端アドレスに到達した時に、第1スタック領域の終端に達したと判断をする。しかし現実には、終端アドレスよりも所定値だけ第１スタック領域内のアドレスに到達した時に、第１スタック領域の終端に達したと判断し、第２スタック領域の確保を行うための内部割込信号を発生することが好ましい。例えば、ＳＰ＝ＦＦ０４ｈからＳＰ＝ＦＦ０２ｈになった時に、スタック終端判定回路５０は第１スタック領域の終端に達したと判定する。そして、スタック終端判定回路５０は、内部割込要求信号を発生し、割込コントロール部１０に出力する。割込コントロール部１０は当該内部割込要求信号に応答して、割込信号を制御部２０に出力する。その結果、ＣＰＵ１は割込動作を行い、現在のプログラムカウンタ（ＰＣ）の値を第１スタック領域のアドレスＦＦ０１ｈ、ＦＦ００ｈに保存し、特定アドレスへジャンプする。
【００４１】
特定アドレスには、動的にメモリ領域を確保する命令又は関数、例えばＣ言語のmalloc( )に準じた命令が配置される。この命令の実行により、第２スタック領域の開始アドレスが得られる。この値をＳＰＳ２レジスタ４０３に設定する。
【００４２】
１例として、図３に示すように、メモリアドレスＦ０ＦＦｈ〜Ｆ０００ｈの範囲が第２スタック領域として確保できたとする。そして、前述のように、一度に使用する２つのアドレスの終端に近い（値が小さい）方のアドレスをＳＰ４０１の値にすることを想定して、ＳＰＳ２に設定する終端アドレスはＦ０ＦＥｈとする。
【００４３】
その後、アドレスＦＦ０１ｈ、ＦＦ００ｈに保存しておいたＰＣの値を取り出し、実行中であった元のプログラムに戻る。戻った後、スタックがＦ００２ｈからさらに成長し、ＦＦ００ｈとなった後のプッシュ動作では、スタックポインタ制御回路２２の制御により、ＳＰ４０１の値はＦＥＦＥｈではなく、ＳＰＳ２レジスタに保存しておいたＦ０ＦＥｈがロードされる。その後、メモリアドレスＦ０ＦＦｈからＦ０００ｈの第２スタック領域が使用される。
【００４４】
さらに、ポップ動作によって第２スタック領域から第１スタック領域に戻り、ＳＰ＝ＦＦ０２ｈからＳＰ＝ＦＦ０４ｈになるところで、スタック終端判定回路５０は第１スタック領域の終端に達したと判断する。この時、スタック終端判定回路５０は、プッシュ時とは異なる内部割込要求信号を発生し、割込コントロール部１０に伝達する。
【００４５】
今回はメモリアドレスがＦＦ０２ｈ→ＦＦ０４ｈのポップ動作の場合なので、先の特定アドレスとは別の特定アドレスにジャンプする。当該特定アドレスから始まる割込みルーチンには、先に動的に確保したメモリ領域を解放する命令を配置する。そうすることによって第２スタック領域として確保していたメモリ領域を、ユーザが再びスタック領域以外の目的で使用することが可能となる。その後、スタックは再び第１スタック領域においてデータの受け渡しを行うこととなる。
【００４６】
このように、第２スタック領域を、必要となったときに動的に確保し、かつ、不要となったときに解放することにより、メモリ領域を有効に利用することが可能になる。本実施例では、第２スタック領域の確保および解放には、ソフトウエア処理（内部割込ルーチン）を利用している。しかし、確保した第２スタック領域の開始アドレスはハードウエアとして構成されたＳＰＳ２レジスタ４０３に書き込まれる。従って、確保された第２スタック領域をスタックポインタ制御回路２２が利用する際には、ソフトウエア処理を必要としない。
【００４７】
本実施例において、スタック終端判定回路５０は、プッシュ動作時とポップ動作時とでは、異なる内部割込要求信号を発生する。具体的には、プッシュ動作時には第２スタック領域を確保する割込ルーチンを要求する要求信号を発生し、ポップ動作時には、確保した第２スタック領域を解放する割込ルーチンを要求する要求信号を発生する。
【００４８】
すなわち、本実施例においては、プッシュ動作において第１スタック領域の終端への到達を検出した場合には必ず第２スタック領域を確保し、ポップ動作時において第１スタック領域の終端への到達を検出した場合には必ず第２スタック領域を解放する。この場合には、図１に示した第２スタック領域イネーブル（ＳＰ２ＥＮＢ）フラグ５２は省略することができる。
【００４９】
（実施例２）
図１に示したＣＰＵの動作の第２の例を説明する。本実施例においては、スタック終端判定回路５０が、プッシュ動作時とポップ動作時とで異なるとともに、第２スタック領域が確保されているか否かによって異なる内部割込要求信号を発生する。それ以外の動作、例えば、スタックポインタ制御回路２２の動作は、第１の実施例の場合と同様である。
【００５０】
図４は、第２スタック領域イネーブル（ＳＰ２ＥＮＢ）フラグ５２を利用して行う、本実施例におけるスタック終端判定回路５０の動作の一例を示すフロー図である。
【００５１】
図４のフロー図において、スタック終端判定回路５０は、ＳＰ４０１の変化を監視する（ＳＴ１１）。そして、ＦＦ０４ｈ→ＦＦ０２ｈの変化、すなわち、プッシュ動作における第１スタック領域の終端への到達を検出した時（ＳＴ１２）には、さらに、ＳＰ２ＥＮＢフラグ５２の値を参照する（ＳＴ１３）。そして、第２スタック領域が確保されていないことを示すＳＰ２ＥＮＢ＝Ｌの値が得られた場合には、スタック終端判定回路５０は、第１の内部割込要求信号ＩＮＴ１を発生する（ＳＴ１４）。この、第１の内部割込要求信号ＩＮＴ１を受けて、割込コントロール部１０は、第１の内部割込ルーチンに移行するための信号を、制御部２０に出力する。これによって、第２スタック領域を確保する第１の内部割込ルーチンが、ＣＰＵ１において起動される（ＳＴ１５）。その後、スタック終端判定回路５０は、ＳＰ４０１の監視を継続する。一方、第２スタック領域が確保されていることを示すＳＰ２ＥＮＢ＝Ｈの値が得られた場合には、スタック終端判定回路５０は内部割込要求信号を発生しない。
【００５２】
これに対して、スタック終端判定回路５０がＦＦ０２ｈ→ＦＦ０４ｈの変化、すなわち、ポップ動作における第１スタック領域の終端への到達を検出した時（ＳＴ１６）にも、ＳＰ２ＥＮＢフラグ５２の値を参照する（ＳＴ１７）。そして、ＳＰ２ＥＮＢ＝Ｈであれば、スタック終端判定回路５０は、第２の内部割込要求信号ＩＮＴ２を発生する（ＳＴ１８）。この、第２の内部割込要求信号ＩＮＴ２を受けて、割込コントロール部１０は、第２の内部割込ルーチンに移行するための信号を、制御部２０に出力する。これによって、それ以前の動作によって確保された第２スタック領域を解放する、第２の内部割込ルーチンが、ＣＰＵ１において起動される（ＳＴ１９）。その後、スタック終端判定回路５０は、ＳＰ４０１の監視を継続する。一方、ＳＰ２ＥＮＢ＝Ｌであれば、スタック終端判定回路５０は内部割込要求信号を発生しない。
【００５３】
ここで、図４に示された処理の内、第１の内部割込ルーチンＳＴ１５および第２の内部割込ルーチンＳＴ１９は、ソフトウエアによって実装される。しかし、それ以外の、第１の内部割込要求信号ＩＮＴ１発生もしくは第２の内部割込要求信号ＩＮＴ２発生までの処理は、全て、スタック終端判定回路５０内のハードウエアによって実行される。従って、本実施例において、ソフトウエアの負担の増大を抑えながら、高速に、第２スタック領域の確保および解放を実施することができる。
【００５４】
例えば、ポップ動作における第１スタック領域の終端への到達を検出し、第２の内部割込ルーチンに移行したとしても、第２の内部割込ルーチン内での判断によって、第２スタック領域の解放を行わないことも可能である。具体的には、第2のスタック領域によるメモリ資源圧迫の程度や、高い処理速度を要求される特定処理を完了した後か否か等を判断し、その判断結果によっては、第２スタック領域の解放を行わないことが考えられる。
【００５５】
このように、第２スタック領域の解放を行わなかった場合、次に、プッシュ動作においてＳＰ４０１が第１スタック領域の端部に達したことが検出された時には、あらためて第２スタック領域の確保を行う必要が無い。このように、プッシュ動作もしくはポップ動作において第１スタック領域の終端への到達が検出されても、第２スタック領域の確保もしくは解放を行う必要があるとは限らない場合、図４に示されたようなフローにより、第２スタック領域が確保されているか否かによって異なる内部割込要求信号を発生することが必要である。ここで、図４のフローの実施のためには、スタック終端判定回路５０が、ＳＰ２ＥＮＢフラグ５２の値を制御するためのＳＰ２ＥＮＢフラグ制御回路５４（図６参照）を含むことが好ましい。
【００５６】
図５は、イネーブルフラグ制御回路がＳＰ２ＥＮＢフラグ５２の値を制御するためのフローの１例を示す。ここで、第１の内部割込ルーチンによって第２のスタック領域の確保が行われる場合には、例えばmalloc( )に準じた命令の実行によって第２のスタック領域が確保されるとともに、確保した第２スタック領域の開始アドレスをＳＰＳ２レジスタ４０３に書き込むものとする。さらに、第２の内部割込ルーチンによって第２のスタック領域の解放を行う場合には、例えば、free( )に準じた命令の実行によって第２のスタック領域の解放を行うとともに、ＳＰＳ２レジスタ４０３に、それ自身は意味のない、ダミーデータを書き込むものとする。
【００５７】
図５に示したフローにおいて、スタック終端判定回路５０は、ＳＰＳ２レジスタ４０３への書き込みを監視する（ＳＴ２１）。そして、ＳＰＳ２への書き込みが検出された時（ＳＴ２２）には、ＳＰ２ＥＮＢフラグ５２の値を参照し（ＳＴ２３）、ＳＰ２ＥＮＢフラグ５２の値がＨであればＬを書き込み（ＳＴ２４）、ＬであればＨを書き込む（ＳＴ２５）。
【００５８】
図６には、図５のフローによる制御を行うための、ＳＰ２ＥＮＢフラグ制御回路５４の１例を示す。図６のＳＰ２ＥＮＢフラグ制御回路５４において、ＳＰ２ＥＮＢフラグ５２は、フリップフロップによって実現されている。ＳＰ２ＥＮＢフラグ５２のＤ入力端子には、ＸＯＲゲート５６の出力が接続され、ＸＯＲゲート５６の一方の入力端子には入力信号ＩＮが、他方の入力端子にはＳＰ２ＥＮＢフラグ５２のＱ出力端子が接続されている。入力信号ＩＮには、ＳＰＳ２レジスタ４０３の書き込み信号が供給されている。一方、ＳＰ２ＥＮＢフラグ５２のＱ出力端子からは、制御部２０およびスタック終端判定回路５０内の内部割込信号発生回路（図示しない）に出力信号ＯＵＴが供給されている。
【００５９】
図６に示されたＳＰ２ＥＮＢフラグ制御回路５４において、ＸＯＲゲート５６の一方の入力端子にＳＰＳ２レジスタ４０３書き込み信号（１クロック幅）が供給されることによって、ＳＰＳ２レジスタ４０３への書き込みが監視される。すなわち、Ｈレベルの信号がＸＯＲゲート一方の入力端子に供給された時に、ＳＰＳ２レジスタ４０３への書き込みが検出される。そして、ＸＯＲゲート５６の他の入力端子に、ＳＰ２ＥＮＤフラグ５２のＱ出力が供給されることによって、現在のＳＰ２ＥＮＢフラグ５２の値を反転した信号が、ＸＯＲゲート５６の出力端子からＳＰ２ＥＮＢフラグ５２のＤ入力端子に供給される。この信号が、クロック信号ＣＫに同期してＳＰ２ＥＮＢフラグ５２に書き込まれる。
【００６０】
本実施例においては、スタック終端判定回路５０が、第２スタック領域が確保されているか否かによって異なる内部割込要求信号を発生する。従って、第２スタック領域の確保および解放を、より柔軟に行うことが可能である。本実施例においてはさらに、図５のフローによるＳＰ２ＥＮＢフラグ５２の制御は、図６に例示された制御回路５４のように、スタック終端判定回路５０内のハードウエアによって実施される。従って、本実施例においては、ソフトウエア（内部割込ルーチン）の負担を増大させることなく、ＳＰ２ＥＮＢフラグ５２の値の制御を行うことができる。
【００６１】
（実施例３）
スタック判定回路５０の動作のさらに他の例を記す。
【００６２】
実施例２においては、図４に示したフローによって、スタック終端判定回路５０が、ＳＰ２ＥＮＢフラグ＝Ｌである時には第１の内部割込要求信号ＩＮＴ１を発生し、ＳＰ２ＥＮＢフラグ＝Ｈである時には第２の内部割込要求信号ＩＮＴ２を発生した。すなわち、スタック終端判定回路５０が、ＳＰ２ＥＮＢフラグの値に応じて異なる内部割込要求信号を発生した。そして、第１の内部割込要求信号ＩＮＴ１および第２の内部割込要求信号ＩＮＴ２を受けて、割込コントロール部１０は、第１の内部割込ルーチンに移行するための割込信号、および、第２の内部割込ルーチンに移行するための割込信号を制御部２０に出力した。
【００６３】
しかし、スタック終端判定回路５０が発生する内部割込要求信号は同一とし、内部割込ルーチンに移行した後で、ソフトウエア処理によって、異なる処理を行うことも可能である。
【００６４】
図７には、この場合の処理フローの１例を示す。図７のフローにおいて、スタック終端判定回路５０は、ＳＰ４０１の変化を監視する（ＳＴ３１）。そして、ＦＦ０４ｈ→ＦＦ０２ｈの変化、すなわち、プッシュ動作における第１スタック領域の終端への到達を検出した時（ＳＴ３２）には、さらに、ＳＰ２ＥＮＢフラグ５２の値を参照する（ＳＴ３３）。そして、ＳＰ２ＥＮＢ＝Ｌであれば、スタック終端判定回路５０は、第１の内部割込要求信号ＩＮＴ１を発生する（ＳＴ３４）。一方、ＳＰ２ＥＮＢ＝Ｈであれば、スタック終端判定回路５０は内部割込要求信号を発生しない。
【００６５】
また、スタック終端判定回路５０がＦＦ０２ｈ→ＦＦ０４ｈの変化、すなわち、ポップ動作における第１スタック領域の終端への到達を検出した時（ＳＴ３５）にも、さらに、ＳＰ２ＥＮＢプラグ５２の値を参照する（ＳＴ３６）。そして、ＳＰ２ＥＮＢ＝Ｈであれば、スタック終端判定回路５０は、第２の内部割込要求信号ＩＮＴ２を発生する（ＳＴ３７）。一方、ＳＰ２ＥＮＢ＝Ｌであれば、スタック終端判定回路５０は内部割込要求信号を発生しない。
【００６６】
そして、ＩＮＴ１とＩＮＴ２とのＯＲをとり、内部割込要求信号ＩＮＴを発生し（ＳＴ３８）、制御部２０に出力する。これによって、ＣＰＵ１は、内部割込ルーチンに移行する（ＳＴ４０）。この内部割込ルーチンの中で、ＳＰ２ＥＮＢフラグ５２を読み出し、その値を調べる（ＳＴ４１）。ＳＰ２ＥＮＢ＝Ｌである場合には、第２スタック領域を確保し（ＳＴ４２）、ＳＰＳ２レジスタへ第２スタック領域の開始アドレスを書き込み（ＳＴ４３）。内部割込ルーチンを終える。
【００６７】
一方、ＳＴ４１においてＳP２ＥＮＢ＝Ｈであった場合には、それ以前の動作によって確保された第２スタック領域の解放が可能か否かを確認し（ＳＴ４４）、否であれば、処理的には何も行わない。第２スタック領域の解放が可である場合には、第２スタック領域の解放を行い（ＳＴ４５）、ＳＰＳ２レジスタへダミーの書き込みを行い（ＳＴ４６）、内部割込ルーチンを終える。
【００６８】
なお、本実施例においても、図５に示されたフローにより、ＳＰＳ２レジスタへの書き込みを検知したＳＰ２ＥＮＢフラグ５２の設定が行われる。
【００６９】
図７に示したフローにおいては、ソフトウエア（内部割込ルーチンＳＴ４０）がＳＰ２ＥＮＢフラグ５２の値を調べ、それに応じて異なる処理を行う。このため、図４に示したフローに比較して、より柔軟なスタック領域管理が可能である。しかも、内部割込要求信号ＩＮＴ発生まではハードウエアで処理されており、特許文献２に示された技術に比較すると、ソフトウエアの負担は小さく、高速処理が可能である。
【００７０】
なお、図７のフローを実現するためには、内部割込ルーチンからＳＰ２ＥＮＢフラグが読み出し可能とすることが必要である。例えば、他の汎用レジスタと同様に、図示しないデータバスからＳＰ２ＥＮＢフラグを読み出すことを可能とする機能が必要となる。
【００７１】
以上、本発明の実施形態について詳細に説明した。本発明が上記の具体例には限定されず、さまざまな変形、改良が可能であることは言うまでもない。
【００７２】
例えば、上記の実施形態では、スタック終端判定回路５０は、レジスタＳＰＥ１に保持されているアドレス（ＦＦ００ｈ）より２だけ大きいアドレス（ＦＦ０２ｈ）とスタックポインタＳＰ４０１の値とを比較し、内部割込要求信号を発生する。すなわち、プログラムカウンタの返り値を保存するための２バイト分のアドレスを考慮して、スタックポインタのアドレスが（ＳＰＥ１+４）から（ＳＰＥ１＋２）への遷移、または（ＳＰＥ１＋２）から（ＳＰＥ１＋４）への遷移が生じた際に割込要求信号を出力する。しかし、この際の増分するバイト数は２には限らず、ＣＰＵのサポートする命令の取り扱いデータ長に依存する。
【００７３】
また、上記の実施形態では、一度に２つのアドレスのスタック領域を使用し、その内の終端に近い(値が小さい)方のアドレスをＳＰ４０１の値とした。これに合わせて、ＳＰＥ１レジスタ４０２には、第１スタック領域の実際の終端のアドレスＦＦ００ｈをそのまま、第１スタック領域の終端アドレスとして設定した。一方、ＳＰＳ２レジスタ４０３には、第２スタック領域の実際の開始アドレスＦ０ＦＦｈから１を減じたＦ０ＦＥｈを、第２スタック領域の開始アドレスとして設定した。
【００７４】
このように、スタックポインタ制御回路２２における制御において利用するための、ＳＰＥ１レジスタ４０２への第１スタック領域の終端アドレスの設定、および、ＳＰＳ２レジスタ４０３への第２スタック領域の開始アドレスの設定は、スタック領域の利用形態およびＳＰ４０１の設定に応じて適切に行われる。その設定が、上記の実施形態の場合に限定されないことは言うまでもない。
【００７５】
また、上記の実施形態では、図３に示すように、スタックのプッシュ方向がアドレスの減少する方向としているが、スタックのポップ方向がアドレスの減少する方向に用いるものであっても良い。さらに上記の実施形態では動的に確保した第２スタック領域の終端アドレスについては考慮しなかったが、第２スタック領域の終端アドレスを設定するためのレジスタを設けて、スタックポインタの値が当該アドレスを超える恐れのある場合には、第３スタック領域を確保するようにすることも可能である。
【００７６】
また、上述の実施形態においては、内部割込ルーチンにて、メモリ領域を動的に確保する命令又は解放する命令を配置することにより、第２スタック領域として用いるメモリ領域を動的に確保し、その開始アドレスの値をＳＰＳ２レジスタ４０３に設定していた。しかし、動的にメモリ領域を確保する機構を前提とするのではなく、リセット後に、ＳＰＳ２レジスタに第２スタック領域の開始アドレスを設定してしまうアーキテクチャも可能である。この場合は、ハードウエア構成上，実現容易という意味で有利である。
【００７７】
以上のように、本発明によれば、実際のプログラムの実行時に、当初想定したメモリ領域を越えてスタック領域がメモリを消費してしまう恐れのある場合にも、プログラムを停止させることなくデータ破壊を回避し、プログラムが予期せぬ動作をしてしまうという不具合を防止することができる。さらに、このようなスタック領域の管理を、ソフトウエアの負担増大を抑えながら実現し、処理速度の低下を抑えることができる。
【図面の簡単な説明】
【００７８】
【図１】本発明の一実施形態のＣＰＵのブロック図を示す図である。
【図２】本発明のスタックポインタ制御回路の一例を示すブロック図である。
【図３】本発明のメモリ領域におけるスタック領域の使用例を示す図である。
【図４】本発明のスタック終端判定回路の動作の一例を示すフロー図である。
【図５】本発明の第２スタック領域イネーブルフラグの制御の一例を示すフロー図である。
【図６】本発明の第２スタック領域イネーブルフラグ制御回路の一例を示す回路図である。
【図７】本発明のスタック終端判定回路の動作の他の例を示すフロー図である。
【図８】従来のＣＰＵであるＺ８０のレジスタ構造を示す図である。
【図９】従来のＣＰＵにおけるメモリ領域の不具合を示す図である。
【符号の説明】
【００７９】
１  ＣＰＵ
１０  割込みコントロール部
２０  制御部
２２  スタックポインタ制御回路
２２１  −２／＋２加減算器
２２２  切替器
２２３  比較器
３０  ＡＬＵ
４０、４００  レジスタ群
４０１  スタックポインタレジスタ  
４０２  第１スタック領域終端アドレスレジスタ
４０３  第２スタック領域開始アドレスレジスタ
５０  スタック終端判定回路
５２  第２スタック領域イネーブルフラグ
５４  イネーブルフラグ制御回路
【図１】
2006202268.tif 000003
【図２】
2006202268.tif 000004
【図３】
2006202268.tif 000005
【図４】
2006202268.tif 000006
【図５】
2006202268.tif 000007
【図６】
2006202268.tif 000008
【図７】
2006202268.tif 000009
【図８】
2006202268.tif 000010
【図９】
2006202268.tif 000011