(57)【要約】  本発明は、コンピュータプログラムの実行を保護する方法に関するものであり、この方法は、プログラムの命令パイル内に既定値をスタックするステップと、このパイルをスタックポップするステップと、を有し、スタックポップステップは、適宜に異常実行を検出できるように適合されている。
2007516490.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータプログラムの実行を保護する方法において、
前記プログラムの命令スタック内に既定値をスタックするスタックステップと、
適宜、実行異常を検出するべく、適合された前記スタックをアンスタックするアンスタックステップと、
を含むことを特徴とする方法。
【請求項２】
前記スタックステップおよび前記アンスタックステップは、それぞれ、前記プログラムの命令の少なくとも１つのサブセットの要素と関連付けられていることを特徴とする請求項１に記載の方法。
【請求項３】
前記要素は、それぞれ、括弧の組における開き括弧と閉じ括弧であることを特徴とする請求項２に記載の方法。
【請求項４】
前記アンスタックステップは、前記プログラムまたは前記プログラムのサブルーチンのリターン命令と関連付けられていることを特徴とする請求項２に記載の方法。
【請求項５】
前記プログラムは、その実行によって前記スタックステップを実装する第１命令および／またはその実行によって前記アンスタックステップを実装する第２命令を含むプログラム言語によって作成されていることを特徴とする請求項１〜４のいずれか一項に記載の方法。
【請求項６】
前記第２命令は、前記プログラムまたは前記プログラムのサブルーチンを終了させることを特徴とする請求項５に記載の方法。
【請求項７】
前記既定値は、前記プログラムの重要な命令のサブセットを表していることを特徴とする請求項１〜６のいずれか一項に記載の方法。
【請求項８】
前記アンスタックステップにおいて前記既定値以外の値がアンスタックされた場合に実行される異常処理ステップを含む請求項１〜７のいずれか一項に記載の方法。
【請求項９】
前記プログラムは、サブルーチンに対する少なくとも１つの呼び出しを含んでいる請求項１〜８のいずれか一項に記載の方法であって、前記スタックステップは、前記呼び出しの前に実行され、前記既定値は、前記サブルーチンの実行の際に前記スタックから除去されることを特徴とする方法。
【請求項１０】
前記既定値は、異常処理関数のアドレスである請求項９に記載の方法。
【請求項１１】
前記プログラムは、サブルーチンに対する少なくとも１つの呼び出しを含んでいる請求項１〜８のいずれか一項に記載の方法であって、前記スタックステップは、前記サブルーチンの実行の際に実行され、前記既定値は、前記サブルーチンの実行の後に前記スタックから除去されることを特徴とする方法。
【請求項１２】
前記既定値は、異常処理関数のアドレスであることを特徴とする請求項１１に記載の方法。
【請求項１３】
コンピュータによって可読である情報媒体であって、
適宜に全体的または部分的に除去可能な、特に、ＣＤ−ＲＯＭ、もしくは、ハードディスクやディスケットなどの磁気媒体、あるいは、電気的もしくは光学的信号などの伝送可能な媒体などの情報媒体において、
コンピュータプログラムが電子データ処理システム内に読み込まれ、これによって実行された場合に、請求項１〜１２のいずれか一項に記載の方法を実装する前記コンピュータプログラムの命令を含んでいることを特徴とする情報媒体。
【請求項１４】
情報媒体上に保存されたコンピュータプログラムであって、
該コンピュータプログラムが電子データ処理システム内に読み込まれ、これによって実行された場合に、請求項１〜１２のいずれか一項に記載の方法を実行する命令を含んでいるコンピュータプログラム。
【請求項１５】
保護されている電子的エンティティであって、
請求項１〜１２のいずれか一項に記載の方法を実装する手段を含んでいることを特徴とする電子的エンティティ。
【請求項１６】
スマートカードであることを特徴とする請求項１５に記載の電子的エンティティ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムの実行を保護する方法と、この種の方法を実装する安全な電子的エンティティに関するものである。
【０００２】
本発明は、特に、スマートカードを保護するべく使用可能である。
【０００３】
本明細書における「コンピュータプログラムの保護」に対する言及は、コンピュータプログラムの正常な動作の変更を目的とした悪意を有する攻撃の検出と、コンピュータプログラム（特に、衛星などの非常に高度な干渉を受け易い環境内において実行されるプログラムや、例えば、心臓の移植物を制御するプログラムなどの非常に高い信頼性を必要とするコンピュータプログラム）の実行の信頼性の向上を目的とした処理と、を意味している。
【０００４】
また、「コンピュータプログラム」という表現は、採用するコンピュータ言語およびストレージ手段とは関係なしに、あらゆるプログラムを意味している。非限定的な例として、コンピュータプログラムは、機械言語、アセンブラ言語、Ｃ、Ｃ＋＋、Ｊａｖａ（登録商標）、またはＶＨＤＬによって作成可能である。プログラムは、例えば、ＲＯＭ、ＥＥＰＲＯＭ、またはハードディスクなどの永久的なメモリ、あるいは、例えば、ＲＡＭなどの揮発性のメモリ内に保存可能である。また、プログラムは、例えば、ＦＰＧＡ（Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ）やＡＳＩＣ（Ａｐｐｌｉｃａｔｉｏｎ−Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）などの集積回路の形態でも、同様に実装可能である。
【０００５】
本発明は、例えば、スマートカード、安全なＰＣＭＩＡカード（例えば、ＩＢＭの４７５８カード）、ＵＳＢキー、または１枚の頁に非接触式マイクロチップを内蔵したパスポートなどの安全な電子的エンティティ上におけるコンピュータプログラムの実行を変更することを目的とした攻撃を検出する。また、本発明は、このような攻撃に対する対策を起動する。
【０００６】
特に、本発明は、例えば、いわゆる、障害攻撃（ｆａｕｌｔ  ａｔｔａｃｋ）などの電子的エンティティの動作を妨げる攻撃を検出する。
【背景技術】
【０００７】
このような攻撃は、コンテンツを違法に変更したり、レジスタ、メモリ、もしくはバスのコンテンツを読み取ったり、あるいは、コンピュータプログラムの特定の命令を実行しないように、もしくは、それらを不正に実行するように、プロセッサに強いたりすることを目的としている。この結果、攻撃を受けたコンピュータプログラムは、本来設計されている実行方式とは非常に異なった方式で実行されることになる。
【０００８】
この種の当技術分野において既知の攻撃には、プロセッサの電源端子の１つに電圧スパイクを生成するもの、その温度を突然上昇させるもの、そのクロック周波数または供給電圧を急激に変化させるもの、ならびに、それを構成しているシリコンの一部に光のフラッシュ、レーザービームもしくは電界を印加するものが含まれる。
【０００９】
当業分野の現在の状況においては、当業者は、コンピュータプログラムを保護するための、特に、スマートカード内に障害を生成することによる攻撃と戦うための、様々な方法に関する知識を有している。
【００１０】
第１の方法は、スマートカードコンポーネント内にセンサを設置し、これらの攻撃を検出するステップを有している。
【００１１】
しかしながら、実際には、コンポーネントの表面全体にわたってセンサを配置することは不可能であるため、この種の方法の有効性は限られている。また、センサもシリコンから製造されているため、これらに干渉したり、これらが伝送する情報を変更することも可能である。
【００１２】
大部分のスマートカードオペレーティングシステムの保護に使用されている第２の従来技術による方法は、「セマフォ（ｓｅｍａｐｈｏｒｅ）」の使用に基づくものであり、これは、重要な命令の組を実行する際にメモリ領域のコンテンツを変更するステップと、このメモリ領域のコンテンツを読み取ることにより、前述の変更ステップが実行されていることを検証する検証ステップと、を含んでいる。
【００１３】
メモリ領域がまだ変更されていなければ、これは、変更ステップがまだ実行されておらず、従って、前述の重要な命令が正しく実行されていないことを意味している。
【００１４】
なお、本明細書における「セマフォ」という用語は、並行プロセスのプログラミング分野において使用されている同名のプロセスとは異なる概念を意味していることに留意されたい。
【００１５】
このソフトウェアによって実装される第２の方法は、前述の第１の方法の欠点を具備していない。
【発明の開示】
【発明が解決しようとする課題】
【００１６】
しかしながら、セマフォは、従来、作業メモリ（ＲＡＭ）内に存在する変数によって実装されており、これらの操作（配置、読み取り）は、相対的に低速であり、かつ、メモリ空間の観点から高価である。この制約は、特に、スマートカードなどの限られたリソース（メモリ、演算パワーなど）を具備するシステム上でプログラムを実行する場合に、非常に不利である。本発明は、このような欠点を具備していないソフトウェアによる方法を目的としている。
【課題を解決するための手段】
【００１７】
このために、本発明は、コンピュータプログラムの実行を保護する方法を提供し、この方法は、プログラムの命令スタック内に既定値をスタックするステップと、適宜、実行異常を検出するべく、適合されているスタックをアンスタックするステップと、を含んでいる。
【００１８】
命令スタックとは、データを一時的に保存するためのメモリ領域のことである。以降、本明細書においては、値は、それぞれ、ＰＵＳＨとＰＯＰと呼ばれる２つの特定の命令により、スタック内にスタックされ、かつ、スタックからアンスタックされる。
【００１９】
これらの命令は、例えば、１バイトなどの固定サイズの値のみを操作する。
【００２０】
スタックの使用は、ＬＩＦＯ（Ｌａｓｔ  Ｉｎ  Ｆｉｒｓｔ  Ｏｕｔ）アルゴリズムによって制御されている。
【００２１】
特に、スタックは、プロシージャのリターンアドレスを保存する（例えば、８０ｘ８６アセンブラ言語におけるＲＥＴ命令）。これは、当技術分野において周知である。
【００２２】
従って、本発明の方法は、実行スタックを使用することにより、実行異常を検出するための値を保存している。
【００２３】
実行スタックは、読み取りおよび書き込みモードにおけるアクセスが高速であり、かつ、メモリ空間の観点から低コストであるため、本発明の方法は、限られたリソースを具備するシステム上において実行されるコンピュータプログラムを保護するのに、特に適している。
【００２４】
また、この命令スタックの新しい使用法は、後述するその他の利点をも具備している。
【００２５】
好適な実施例においては、スタックおよびアンスタックステップは、それぞれ、プログラムの命令の少なくとも１つのサブセットの要素と関連付けられている。
【００２６】
例えば、スタックステップは、ファイルをオープンする「ｏｐｅｎ（ｆｉｌｅ）」命令と関連付け可能であり、アンスタックステップは、ファイルをクローズする「ｃｌｏｓｅ（ｆｉｌｅ）」命令と関連付け可能である。
【００２７】
例えば、エディタを使用してスタックおよびアンスタック動作を前述の要素（すなわち、先程の例の「ｏｐｅｎ」および「ｃｌｏｓｅ」命令）と関連付けることにより、命令の作成を自動化可能であるため、この特徴は特に有利である。
【００２８】
この好適な実施例の第１の変形においては、命令のサブセットの要素は、それぞれ、括弧の組の開き括弧と閉じ括弧である。
【００２９】
コンピュータ言語分野の知識を有する者であれば、言語理論においては、テキストが、閉じ括弧と同数の開き括弧を含んでおり、かつ、そのテキストの任意の開始地点が、閉じ括弧の数以上の数の開き括弧を含んでおれば、括弧の組が存在していることを知っている。
【００３０】
この特に有利な特徴によれば、スタックおよびアンスタックステップは、それぞれ、「（」と「）」、または、「｛」と「｝」、または、「ｂｅｇｉｎ」と「ｅｎｄ」、または、「ｒｅｐｅａｔ」と「ｕｎｔｉｌ」の各命令と関連付けることができる。
【００３１】
この好適な実施例の別の変形においては、アンスタックステップは、プログラムまたはプログラムのサブルーチンのリターン命令と関連付けられている。
【００３２】
有利なことに、この特徴によれば、（リターン命令の実行の際の）プログラムまたはサブルーチンから戻る際にこれまで実行されている通常のアンスタック動作を使用して（このときにアンスタックされる値が、プログラムの正常な実行の際にアンスタックされるものと対応していない場合に）実行異常を検出可能である。
【００３３】
本発明の別の特徴によれば、プログラムは、その実行によってスタックステップを実装する第１命令および／またはその実行によってアンスタックステップを実装する第２命令を含むプログラミング言語によって作成されている。
【００３４】
この実施例においては、新しい命令がプログラミング言語内に内蔵され、それぞれの命令は、プログラムを保護するべく、その独自の関数と、スタック関数またはアンスタック関数のいずれかを具備している。
【００３５】
先程簡単に触れた例を再度参照すれば、「ｏｐｅｎ（ｆｉｌｅ）」と呼ばれる新しい命令を生成することにより、ファイルのオープンと、プログラムの命令スタック内への既定値のスタックと、を同時に実現可能である。
【００３６】
この結果、セキュリティ機能を考慮する必要なしに、かつ、特定のソフトウェアツールを必要とすることなしに、それぞれのファイルのオープンに関するセキュリティ機能の実行がプログラマに対して保証される。
【００３７】
第２の命令は、好ましくは、プログラムまたはプログラムのサブルーチンを終了させる。
【００３８】
この実施例は、スタックおよびアンスタック命令が、内部に内蔵されるのではなく、プログラムの命令のサブセットの要素と関連付けられている前述の実施例と同一の利点を具備している。従って、これに関する詳細な説明は省略する。
【００３９】
本発明の好適な実施例においては、既定値は、プログラムの重要な命令のサブセットを表している。
【００４０】
この特徴は、本方法を使用してプログラムの命令の複数のサブセットを保護する場合に、特に有利である。
【００４１】
これにより、（実行によって別の既定値がスタックされることになる別の命令のサブセットではなく）特定の命令のサブセットが正しく実行されたことをアンスタックステップにおいて検出可能である。
【００４２】
当業者であれば、この特徴を使用することにより、試験の様々な分岐（Ｃ言語の「ｉｆ」、「ｔｈｅｎ」、「ｅｌｓｅ」タイプ）を保護可能であることを容易に理解するであろう（異なる既定値が分岐のそれぞれにおいてスタックされ、その試験の終了時点においてアンスタックステップが実行される）。
【００４３】
また、プログラムがサブルーチンを呼び出す場合には、この特徴は、サブルーチン呼び出しの後に、障害攻撃を受けることなく、サブルーチンに進入していることを、そのサブルーチンの実行の際に保証する。
【００４４】
付録ＡおよびＣを参照し、この特徴の使用法の２つの例について後程詳述する。
【００４５】
本発明の別の特徴によれば、本発明の方法は、既定値以外の値がアンスタックステップにおいてアンスタックされた場合に実行される異常処理ステップを含んでいる。
【００４６】
この特徴は、攻撃によってプログラムの正常な実行（並びに、特に、そのプログラムの関数の呼び出しまたはその実行からのリターン）が変更された場合に直ぐに異常処理ステップを実行可能であるという利点を具備している。この場合に、本方法は、特に有効である。
【００４７】
例えば、スマートカード内において本発明の方法を使用する場合には、異常処理は、そのオペレーティングシステムを破壊することによってカードを動作不能にするステップを有することができる。
【００４８】
付録Ａ、Ｃ、およびＤを参照し、この特徴の使用法の３つの例について後程詳述する。
【００４９】
プログラムがサブルーチンに対する少なくとも１つの呼び出しを含んでいる特定の一実施例においては、アンスタックステップは、その呼び出しの前に実行され、既定値は、サブルーチンの実行の際にスタックから除去される。
【００５０】
従って、この特徴は、サブルーチンが実行されており、かつ、それが正しく実行されていることをチェックする。
【００５１】
サブルーチンに対する呼び出しがスキップされていたり、または、アンスタックステップが実行されていない場合には、命令スタックは、スタックされている既定値を保持している。
【００５２】
付録ＢおよびＣを参照して後述するように、続いて、この値をアンスタックすることにより、実行異常が検出されることになる。
【００５３】
この特定の実施例においては、既定値は、好都合なことに、異常処理関数のアドレスであってよい。
【００５４】
従って、例えば、サブルーチンを実行しないという結果をもたらす攻撃の結果、サブルーチンの実行の際に既定値がアンスタックされなければ、続いて、プロセッサがその値をアンスタックすることにより、この処理関数が実行されることになる。付録Ｂを参照し、一例について後程後述する。
【００５５】
この特徴は、サブルーチンの実行を妨げるという結果をもたらすあらゆる種類の攻撃をプログラムが受けた場合に、処理機能を起動する。従って、これは、例えば、認証手順などの重要な機能を保護するために特に有用である。
【００５６】
プログラムがサブルーチンに対する少なくとも１つの呼び出しを含んでいる別の特定の実施例においては、スタック段階は、サブルーチンの実行の際に実行され、既定値は、サブルーチンの実行の後に除去される。
【００５７】
この特徴は、サブルーチンからのリターンが正しく実行されることをチェックする。
【００５８】
サブルーチンからのリターンが妨げれられた場合には、命令スタックは、スタックされた既定値を保持している。
【００５９】
付録Ｄを参照し、この特定の実施例について詳述する。
【００６０】
このもう１つの特定の実施例においては、既定値は、好都合なことに、異常処理関数のアドレスであってよい。
【００６１】
前述の理由から、この特徴は、サブルーチンの実行を妨げるという結果をもたらすあらゆる種類の攻撃をプログラムが受けた場合に、処理機能を起動する。従って、これは、例えば、認証手順などの重要な機能を保護するために特に有用である。
【００６２】
付録Ｅを参照し、この特徴の使用法の例を提示する。
【００６３】
本発明は、コンピュータによって読み取り可能であり、かつ、適宜、完全にまたは部分的に除去可能な、特に、ＣＤ−ＲＯＭ、または、ハードディスクやディスケットなどの磁気媒体、または、電気信号や光学信号などの伝送可能な媒体などの情報媒体をも提供し、この情報媒体は、プログラムが電子データ処理システム内に読み込まれ、これによって実行された場合に、先程概説した方法を実行するコンピュータプログラムの命令を含んでいる。
【００６４】
また、本発明は、情報媒体上に保存されたコンピュータプログラムをも提供し、このプログラムは、このプログラムが電子データ処理システム内に読み込まれ、これによって実行された場合に、先程概説した方法を実行する命令を含んでいる。
【００６５】
また、本発明は、先程概説した方法を実装する手段を含む安全な電子的エンティティおよびスマートカードをも目的としている。
【００６６】
情報媒体、コンピュータプログラム、およびスマートカードに固有の特定の利点および特徴については、本発明の方法を参照して前述したものと同一であるため、ここでは、再度の説明を省略する。
【００６７】
本発明のその他の態様および利点については、本発明に従って保護されるコンピュータプログラムの５つの例を含む付録Ａ〜Ｅを参照し非限定的な例として提示される特定の実施例に関する以下の説明を参照することにより、更に明らかとなろう。
【００６８】
これらのプログラムは、Ｃ言語および８０ｃ５１アセンブラ言語によって作成されている。この説明を円滑に行うために、それぞれの行の先頭には、文字列「／＊」および「＊／」に挟まれた注釈が付与されている。
【発明を実施するための最良の形態】
【００６９】
本発明のスマートカードの好適な実施例については、図１を参照して説明する。
【００７０】
付録Ａは、／＊ａ１＊／から／＊ａ３３＊／という番号が付与された３３行の命令からなるコンピュータプログラムを有しており、この実行は、本発明の方法の好適な実施例によって保護されている。
【００７１】
／＊ａ１＊／行は、命令ではない。これは、この付録Ａのプログラムが、プログラムを保護するための命令に加え、文字列「．．．」の代わりに特定数の命令を含むことができるという事実を象徴している。これは、本発明とは無関係の命令の組を表している。
【００７２】
／＊ａ２＊／行は、＃ｐｒａｇｍａ  ａｓｍというディレクティブを含んでおり、これは、後続の命令行が８０ｃ５１アセンブラ言語で作成されていることをコンパイラに通知している。
【００７３】
／＊ａ３＊／行は、付録Ａのプログラムの命令スタック内に（１６進表記された）既定値０をスタックするステップを実行する命令を含んでいる。以下においては、わかりやすくするために、「値０を／＊ａ３＊／行においてスタックする」と記述する。
【００７４】
次いで、値１を／＊ａ４＊／行においてスタックしている。
【００７５】
この説明対象の好適な実施例においては、これらの既定値００ｈおよび０１ｈは、それぞれ、２バイト符号化された（１６進表記されている）値１の上位バイトと下位バイトを表している。
【００７６】
／＊ａ５＊／行は、＃ｐｒａｇｍａ  ｅｎｄａｓｍというディレクティブを含んでおり、これは、後続の命令行が、もはや、８０ｃ５１アセンブラ言語ではなく、Ｃによって作成されていることをコンパイラに通知している。
【００７７】
前述の／＊ａ１＊／行に類似した／＊ａ６＊／および／＊ａ７＊／行は、本発明とは無関係の命令の組を表している。
【００７８】
／＊ａ８＊／行は、「ｔｅｓｔ」変数のコンテンツが「ＴＲＵＥ」に等しいかどうかを判定する試験を実行する命令を含んでいる。付録Ａのプログラムの実行時に、これが真である場合には、プロセッサは、／＊ａ８＊／行の試験の後に、／＊ａ９＊／〜／＊ａ２３＊／の命令を実行する。これは、当技術分野において周知である。
【００７９】
そうでない場合には、このプログラムは、／＊ａ２４＊／行の命令を直接実行する。
【００８０】
／＊ａ９＊／行は、前述の／＊ａ２＊／行と同一である。
【００８１】
／＊ａ１０＊／および／＊ａ１１＊／行は、前述の／＊ａ３＊／および／＊ａ４＊／行に類似している。これらは、２バイト符号化された（１６進表記されている）値１を２つのステップにおいてスタックしている。
【００８２】
／＊ａ１２＊／行は、前述の／＊ａ５＊／行と同一である。
【００８３】
前述の／＊ａ１＊／行に類似した／＊ａ１３＊／および／＊ａ１４＊／行は、本発明とは無関係の命令の組を表している。当然のことながら、これらの命令は、／＊ａ１４＊／行の後に、命令スタックを／＊ａ１３＊／の命令の前の状態に保持するという条件の下に、命令スタックを操作可能である。
【００８４】
／＊ａ１５＊／行は、前述の／＊ａ２＊／行と同一である。
【００８５】
／＊ａ１６＊／行は、その実行によって命令スタックからのアンスタックステップが実行される命令を含んでおり、アンスタックされた値は、レジスタＡ内に保存される。わかりやすくするために、以下においては、これを「／＊ａ１６＊／行において、レジスタＡ内にアンスタックする」と記述する。
【００８６】
／＊ａ１６＊／の命令の後に、レジスタＡは、スタック内にスタックされた最後の値を保存している（スタックは、ＬＩＦＯメカニズムに従って動作している）。
【００８７】
／＊ａ１７＊／行は、レジスタＡのコンテンツを値０２Ｈと比較する命令を含んでいる。通常、／＊ａ１１＊／行の命令の終了時点以降に、プログラムが、その実行において攻撃を受けていなければ、レジスタＡは、／＊ａ１１＊／行の命令においてスタックされた値０２Ｈを含んでいる。
【００８８】
従って、／＊ａ１６＊／行のアンスタックステップにより、本発明の方法による実行異常の検出が実現する。
【００８９】
／＊ａ１７＊／行の比較ステップにおいて、レジスタＡの値が値０２Ｈと異なっていると検出された場合には、付録Ａのプログラムは、／＊ａ１８＊／行の命令において、「ａｎｏｍａｌｙ」というアドレスに分岐する。
【００９０】
この説明対象の実施例においては、「ａｎｏｍａｌｙ」というアドレスは、本発明の方法の異常処理ステップのアドレスである。実際には、「ａｎｏｍａｌｙ」というアドレスは、プロセッサが直接解釈可能な１６進表記によるアドレスである。
【００９１】
一方、／＊ａ１７＊／行の比較ステップにおいて、レジスタＡが値０２Ｈを保存していると検出された場合には、付録Ａのプログラムは、／＊ａ２９＊／行の命令を実行する。
【００９２】
／＊ａ１９＊／〜／＊ａ２１＊／行は、前述の／＊ａ１６＊／〜／＊ａ１８＊／行に類似しており、
／＊ａ１９＊／行において、レジスタＡ内にアンスタックし、
／＊ａ２０＊／行において、レジスタＡを値００Ｈと比較し（値００Ｈは、／＊ａ１０＊／行においてスタックされた既定値に対応している）、
／＊ａ２０＊／行の命令を実行した際にレジスタＡが値００Ｈを含んでいない場合に、／＊ａ２１＊／行の命令において、「ａｎｏｍａｌｙ」というアドレスに分岐する。
【００９３】
一方、レジスタＡが、値００Ｈを含んでいる場合には、プログラムは、／＊ａ２２＊／行の命令を実行し、これは、前述の／＊ａ５＊／と同一である。
【００９４】
／＊ａ２４＊／および／＊ａ２５＊／行は、前述の／＊ａ１＊／行に類似しており、本発明とは無関係の命令の組を表している。
【００９５】
／＊ａ２６＊／〜／＊ａ３３＊／行は、前述の／＊ａ１５＊／〜／＊ａ２２＊／行と類似している。
【００９６】
これらは、スタックが、破壊されており、／＊ａ２７＊／行の命令を実行する直前に、それぞれ、／＊ａ４＊／および／＊ａ３＊／行内においてスタックされた既定値０１Ｈおよび００Ｈを含んでいない場合に、プログラムの実行異常を検出可能なアンスタックステップ／＊ａ２８＊／および／＊ａ３０＊／を含んでいる。
【００９７】
結論として、それぞれ、／＊ａ６＊／〜／＊ａ２５＊／および／＊ａ１３＊／〜／＊ａ１４＊／行からなる２つの命令のサブセットが保護される。
【００９８】
／＊ａ６＊／および／＊ａ２５＊／行から構成されている命令の組は、
２バイト符号化された既定値１をスタックするステップ（／＊ａ３＊／および／＊ａ４＊／行）と、
／＊ａ２７＊／および／＊ａ３０＊／行のスタックステップと、によって保護されている。
【００９９】
同様に、／＊ａ１３＊／および／＊ａ１４＊／行から構成されている命令のサブセットは、
２バイト符号化された既定値２をスタックするステップ（／＊ａ１０＊／および／＊ａ１１＊／行）と、
／＊ａ１６＊／および／＊ａ１９＊／行のスタックステップと、によって保護されている。
【０１００】
この実装は、本発明をいずれの面においても制限するものではなく、既定値１および２も、同一であってもよく、あるいは、ランダムに選択することも可能であろう。
【０１０１】
付録Ｂは、／＊ｂ１＊／〜／＊ｂ２８＊／という番号が付与された２８行の命令からなるコンピュータプログラムを含んでおり、この実行は、本発明の好適な実施例によって保護されている。
【０１０２】
／＊ｂ１＊／および／＊ｂ２＊／行は、Ｃによって作成された関数「ｆｕｎｃｔｉｏｎ」を宣言する最初の２行を構成しており、この関数は、入力パラメータとリターン値を具備していない。／＊ｂ１１＊／行は、この関数の宣言の最後の命令を含んでいる。
【０１０３】
付録Ａを参照して前述した／＊ａ１＊／行に類似した／＊ｂ３＊／行は、本発明とは無関係の命令の組を表している。
【０１０４】
／＊ｂ４＊／行は、付録Ａを参照して前述した／＊ａ２＊／行と同一である。
【０１０５】
／＊ｂ５＊／および／＊ｂ６＊／行の命令においては、２バイト符号化された既定値を２つのステップにおいてスタックするステップが実行されており、この値は、本発明の好適な実施例においては、異常処理関数ＯＳ＿ｋｉｌｌｃａｒｄのアドレスである。実際には、「ＯＳ＿ｋｉｌｌｃａｒｄ」というアドレスは、プロセッサが直接解釈可能な１６進表記のアドレスである。
【０１０６】
本方法を使用してマイクロ回路カードを保護する場合には、ＯＳ＿ｋｉｌｌｃａｒｄ関数は、例えば、そのオペレーティングシステムを破壊することによってカードの動作を禁止する。
【０１０７】
／＊ｂ７＊／行は、付録Ａを参照して前述した／＊ａ５＊／行と同一である。
【０１０８】
付録Ａを参照して前述した／＊ａ１＊／行に類似した／＊ｂ８＊／行は、本発明とは無関係の命令の組を表している。
【０１０９】
／＊ｂ９＊／行は、重要な関数である「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」を呼び出す命令を含んでおり、このコードについては、／＊ｂ１２＊／〜／＊ｂ２８＊／行を参照して説明する。
【０１１０】
サブルーチンを呼び出すと、命令のスタック内に、そのサブルーチンのリターンアドレスが自動的にスタックされることになる。これは、当技術分野においては周知である。従って、２バイト符号化されたリターンアドレスが、スタックの２つのレジスタを占有することになる。この例においては、このアドレスは、／＊ｂ１０＊／行の命令のアドレスに対応しており、関数「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」から戻る際に、この命令を実行しなければならない。
【０１１１】
一方では、／＊ｂ１２＊／および／＊ｂ１３＊／行が、他方では、／＊ｂ２８＊／行が、関数「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の宣言の最初の２行と最後の行を構成しており、この関数は、入力パラメータとリターン値を具備していない。
【０１１２】
／＊ｂ１２＊／および／＊ｂ１３＊／行の命令を実行した後に、命令スタック内にスタックされている最新の４つの値は、時系列の順に、関数ＯＳ＿ｋｉｌｌｃａｒｄのアドレスの上位バイト（／＊ｂ５＊／行）、関数ＯＳ＿ｋｉｌｌｃａｒｄのアドレスの下位バイト（／＊ｂ６＊／行）、／＊ｂ１０＊／行の第１の命令のアドレスの上位バイト、ならびに／＊ｂ１０＊／行の第１の命令のアドレスの下位バイトである。
【０１１３】
付録Ａを参照して前述した／＊ａ１＊／行に類似した／＊ｂ１４＊／行は、本発明とは無関係の命令の組を表している。
【０１１４】
付録Ａの／＊ａ１３＊／および／＊ａ１４＊／行を参照して前述したように、これらの命令は、命令スタックを／＊ｂ１４＊／の命令の前の状態に保持するものと仮定されている。
【０１１５】
／＊ｂ１５＊／行は、付録Ａを参照して前述した／＊ａ２＊／行と同一である。
【０１１６】
／＊ｂ１６＊／行において、命令スタックがレジスタＡ内にアンスタックされ、このレジスタＡのコンテンツは、その後、ステップ／＊ｂ１７＊／において、レジスタＲ７内に保存されている。
【０１１７】
同様に、／＊ｂ１８＊／行において、命令スタックがレジスタＡ内に再度アンスタックさ、このレジスタＡのコンテンツは、ステップ／＊ｂ１９＊／において、レジスタＲ６内に保存されている。
【０１１８】
従って、以上の内容に鑑み、付録Ｂのプログラムが正常に実行された場合には、／＊ｂ１９＊／行の命令を実行した後に、レジスタＲ６およびＲ７は、それぞれ、
／＊ｂ１０＊／行の第１の命令のアドレスの上位バイトと、
／＊ｂ１０＊／行の第１の命令のアドレスの下位バイトと、を含んでいる。
【０１１９】
次いで、命令スタックは、／＊ｂ２０＊／および／＊ｂ２１＊／行において、レジスタＡ内に２回アンスタックされ、この結果、付録Ｂのプログラムが正常に実行されると、サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の実行の際に、命令スタックから関数ＯＳ＿ｋｉｌｌｃａｒｄの２バイトのアドレスが除去されることになる。
【０１２０】
／＊ｂ２２＊／行において、レジスタＡ内に、レジスタＲ６のコンテンツ、すなわち、／＊ｂ１０＊／行の第１の命令の上位バイトが保存され、／＊ｂ２３＊／行のステップにおいて、この値が命令スタック内にスタックされる。
【０１２１】
まったく同一の方式で、／＊ｂ２４＊／および／＊ｂ２５＊／行において、レジスタＲ７内に保存されている／＊ｂ１０＊／行の第１の命令の下位バイトがスタックされる。
【０１２２】
／＊ｂ２６＊／行は、付録Ａを参照して前述した／＊ａ５＊／行と同一である。
【０１２３】
付録Ａを参照して前述した／＊ａ１＊／行に類似した／＊ｂ２７＊／行は、本発明とは無関係の命令の組を表している。
【０１２４】
／＊ｂ２８＊／行は、サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の最後の行である。これは、実行した際に命令スタックの最初の２つのレジスタ内に保存されているアドレスへのプログラムのジャンプを引き起こす「ＲＥＴＵＲＮ」または「ＲＥＴ」タイプの命令によってアセンブラに変換される。これは、当技術分野において周知である。
【０１２５】
実行の際に攻撃を受けなければ、本プログラムは、／＊ｂ１０＊／行の第１の命令に分岐する（この命令のアドレスは、／＊ｂ２３＊／および／＊ｂ２５＊／行においてスタックされている）。
【０１２６】
付録Ａを参照して前述した／＊ａ１＊／行に類似した／＊ｂ１０＊／行は、本発明とは無関係の命令の組を表している。
【０１２７】
／＊ｂ１１＊／行は、関数「ｆｕｎｃｔｉｏｎ」を終了させる。
【０１２８】
結論として、付録Ｂの特定の実施例においては、関数ＯＳ＿ｋｉｌｌｃａｒｄのアドレスをスタックするステップは、サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｃｎｔｉｏｎ」を呼び出す前に実行され、このアドレスは、このサブルーチンの実行の際に、／＊ｂ２０＊／および／＊ｂ２１＊／行において、スタックから除去されている。
【０１２９】
従って、この実施例は、サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」が実際に実行されたことをチェックしている。
【０１３０】
例えば、このサブルーチンに対する呼び出しが妨げられた場合、または、更に一般的には、アンスタックステップが実行されなかった場合には、命令スタックは、関数ＯＳ＿ｋｉｌｌｃａｒｄの値を保持しており、その後、例えば、リターン命令の実行時点において、この値がアンスタックされると、実行異常が検出され、異常処理関数ＯＳ＿ｋｉｌｌｃａｒｄが実行されることになる。
【０１３１】
付録Ｃは、／＊ｃ１＊／〜／＊ｃ３２＊／という番号が付与された３２行の命令からなるコンピュータプログラムを含んでおり、この実行は、本発明の方法の好適な実施例によって保護されている。
【０１３２】
／＊ｃ１＊／〜／＊ｃ１１＊／行は、命令スタック内に、関数ＯＳ＿ｋｉｌｌｃａｒｄのアドレスの代わりに、２バイト符号化された１６進表記の既定値０５Ｆ１Ｈがスタックされる点を除いて（／＊ｃ５＊／および／＊ｃ６＊／行）、付録Ｂを参照して前述した／＊ｂ１＊／〜／＊ｂ１１＊／行に類似している。
【０１３３】
このスタックステップは、この場合にも、サブルーチンｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎに対する呼び出しの前に実行されている。
【０１３４】
この特定の実施例においては、既定値０５Ｆ１Ｈは、／＊ｃ１２＊／〜／＊ｃ１９＊／行の命令から構成されたサブセットを表している。
【０１３５】
／＊ｃ１２＊／〜／＊ｃ１９＊／行は、付録Ｂを参照して説明した／＊ｂ１２＊／〜／＊ｂ１９＊／行に類似している。
【０１３６】
従って、付録Ｃのプログラムが正常に実行された場合には、／＊ｃ１９＊／行の命令の実行の後に、レジスタＲ６およびＲ７は、それぞれ、関数「ｃｉｒｉｔｉａｌ＿ｆｕｎｃｔｉｏｎ」のリターンアドレスに対応した／＊ｃ１０＊／行の第１の命令のアドレスの上位バイトと下位バイトとを含んでいる。
【０１３７】
次いで、命令スタックは、／＊ｃ２０＊／行において、レジスタＡ内にアンスタックされ、その後、このレジスタのコンテンツが、／＊ｃ２１＊／行において、Ｆ１Ｈという１６進値と比較される。
【０１３８】
通常、（特に、関数「ｃｉｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」を呼び出す時点において）プログラムが攻撃を受けていなければ、レジスタＡは、／＊ｃ５＊／行の命令においてスタックされた値Ｆ１Ｈを含んでいる。
【０１３９】
従って、／＊ｃ２０＊／行のアンスタックステップにより、本発明による実行異常の検出が実現する。
【０１４０】
／＊ｃ２１＊／行の比較ステップにおいて、レジスタＡの値が値Ｆ１Ｈと異なっていると検出された場合には、付録Ｃのプログラムは、／＊ｃ２２＊／行の命令において、「ＯＳ＿ｋｉｌｌｃａｒｄ」というアドレスに分岐する。これは、特に、（呼び出すことなしに、関数「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の実行をもたらすことになる）障害攻撃の後に発生し得るものである。
【０１４１】
従って、本発明の方法のこの実施例においては、アンスタックステップ（／＊ｃ２０＊／の命令）において、／＊ｃ６＊／の命令においてスタックされた既定値Ｆ１Ｈとは異なる値がアンスタックされた場合に、異常処理プログラムＯＳ＿ｋｉｌｌｃａｒｄが実行される。
【０１４２】
一方、／＊ｃ２１＊／行の比較ステップにおいて、レジスタＡが値Ｆ１Ｈを保持していると検出された場合には、付録Ｃのプログラムは、／＊ｃ２３＊／行の命令を実行する。
【０１４３】
／＊ｃ２３＊／〜／＊ｃ２５＊／行は、前述の／＊ｃ２０＊／〜／＊ｃ２２＊／行に類似しており、
／＊ｃ２３＊／行において、レジスタＡ内にアンスタックされ、
／＊ｃ２４＊／行において、レジスタＡを値０５Ｈと比較し（値０５Ｈは、／＊ｃ５＊／行においてスタックされた既定値である）、
／＊ｃ２５＊／行の命令の実行時点においてレジスタＡが値０５Ｈを含んでいない場合に、／＊ｃ２５＊／行の命令において、アドレス「ＯＳ＿ｋｉｌｌｃａｒｄ」に分岐する。
【０１４４】
一方、レジスタＡが値０５Ｈを含んでいる場合には、プログラムは、／＊ｃ２６＊／行の命令を実行する。
【０１４５】
いずれにせよ、／＊ｃ２０＊／および／＊ｃ２３＊／行の命令の実行により、実行スタックから既定値０５Ｆ１Ｈが除去される。
【０１４６】
／＊ｃ２６＊／〜／＊ｃ２９＊／行は、付録Ｂを参照して前述した／＊ｂ２２＊／〜／＊ｂ２５＊／行に類似している。
【０１４７】
これらを使用することにより、／＊ｃ１７＊／および／＊ｃ１９＊／行の命令を実行した際にレジスタＲ６およびＲ７内に保存された値（すなわち、それぞれ、
／＊ｃ１０＊／行の第１の命令のアドレスの上位バイトと、
／＊ｃ１０＊／行の第１の命令のアドレスの下位バイト）と、を命令スタック内にスタックしている。
【０１４８】
／＊ｃ３０＊／〜／＊ｃ３２＊／行は、付録Ｂを参照して前述した／＊ｂ２６＊／〜／＊ｂ２８＊／行に類似している。
【０１４９】
従って、攻撃を受けなかった場合には、本プログラムは、／＊ｃ１０＊／行の第１の命令に分岐する（この命令のアドレスは、／＊ｃ２７＊／および／＊ｃ２９＊／行においてスタックされている）。
【０１５０】
付録Ａを参照して前述した／＊ａ１＊／行に類似した／＊ｃ１０＊／行は、本発明とは無関係の命令の組を表しており、／＊ｃ１１＊／行は、付録Ｃの関数「ｆｕｎｃｔｉｏｎ１」を終了させる。
【０１５１】
この実施例においては、値０５Ｆ１Ｈは、異常処理関数のアドレスであってよい。／＊ｃ２０＊／〜／＊ｃ２５＊／行の試験を実行する際に攻撃が発生したとしても、この攻撃が、この異常処理関数の後続の使用によって検出されることになるため、この特定の実施例によれば、プログラムが更に保護される。
【０１５２】
この代わりに、複数の異常処理関数のアドレスを使用することも可能である（これらのアドレスのそれぞれは、重要な命令の組と関連付けられた既定値である）。
【０１５３】
付録Ｄは、／＊ｄ１＊／〜／＊ｄ３２＊／の番号が付与された３２行の命令からなるコンピュータプログラムを有しており、この実行は、本発明の方法の好適な実施例によって保護されている。
【０１５４】
この特定の実施例においては、プログラムは、／＊ｄ４＊／行において、サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」に対する呼び出しを含んでいる。
【０１５５】
この呼び出しにより、このサブルーチンのリターンアドレス（すなわち、／＊ｄ５＊／行の命令のアドレス）が自動的にスタックされることになる。
【０１５６】
サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の／＊ｄ２０＊／〜／＊ｄ２３＊／行の命令を実行する際に、レジスタＲ６およびＲ７内に、命令スタックの最初の値、すなわち、このサブルーチンの２バイト符号化されたリターンアドレスが保存される。
【０１５７】
次いで、／＊ｄ２４＊／および／＊ｄ２５＊／行において、既定値０５Ｆ１Ｈがスタックされる。
【０１５８】
この実施例においては、このスタックステップが、サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の実行の際に実行されていることに留意されたい。
【０１５９】
最終的に、／＊ｄ２７＊／および／＊ｄ２９＊／行の命令を実行する際に、レジスタＲ６およびＲ７のコンテンツがスタックされる（これらのレジスタは、前述のように、／＊ｄ５＊／行の命令のアドレスを含んでいる）。
【０１６０】
従って、付録Ｄのプログラムは、サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の終了時点において／＊ｄ５＊／行に分岐する。
【０１６１】
／＊ｄ５＊／行の命令を実行する前において、命令スタックの最初の２つの値は、通常、／＊ｄ２４＊／および／＊ｄ２５＊／行においてスタックされた既定値０５ＨおよびＦ１Ｈである。
【０１６２】
付録Ａを参照して前述した／＊ａ１＊／行に類似した／＊ｄ５＊／行は、本発明とは無関係の命令の組を表している。これらの命令は、命令スタックを／＊ｄ５＊／行の前の状態に保持するものと仮定されている。
【０１６３】
／＊ｄ７＊／〜／＊ｄ１２＊／行は、付録Ｃを参照して前述した／＊ｃ２０＊／〜／＊ｃ２５＊／行に類似しており、
／＊ｄ７＊／および／＊ｄ１０＊／行において、レジスタＡ内にアンスタックし、
／＊ｄ８＊／および／＊ｄ１１＊／行において、レジスタＡを既定値Ｆ１Ｈおよび０５Ｈと比較し、
／＊ｄ９＊／および／＊ｄ１２＊／行の命令を実行する各時点において、レジスタＡが、それぞれ値Ｆ１Ｈおよび０５Ｈを含んでいない場合には、それぞれ／＊ｄ９＊／および／＊ｄ１２＊／の命令において、アドレス「ＯＳ＿ｋｉｌｌｃａｒｄ」に分岐する。
【０１６４】
従って、例えば、アンスタックステップ／＊ｄ７＊／において、既定値Ｆ１Ｈと異なる値がアンスタックされた場合に、異常処理サブルーチンＯＳ＿ｋｉｌｌｃａｒｄが実行される。
【０１６５】
この実施例においては、既定値０５Ｆ１Ｈは、サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の実行の後に実行スタックから除去されており（別のサブルーチンの実行時点において攻撃が発生した後にではない）、攻撃の結果は、／＊ｄ６＊／〜／＊ｄ１３＊／行の実行であることに留意されたい。
【０１６６】
従って、この実装は、／＊ｄ６＊／〜／＊ｄ１３＊／行の命令が、サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の実行後に実行されることを保証している。
【０１６７】
／＊ｄ１４＊／および／＊ｄ１５＊／行は、付録Ｄのプログラムを終了させる。
【０１６８】
付録Ｅは、／＊ｅ１＊／〜／＊ｅ２８＊／という番号が付与された２８行の命令からなるコンピュータプログラムを含んでおり、この実行は、本発明の方法の好適な実施例によって保護されている。
【０１６９】
／＊ｅ１＊／〜／＊ｅ５＊／および／＊ｅ１２＊／〜／＊ｅ２８＊／行は、命令スタック内に、既定値０５Ｆ１Ｈの代わりに、異常処理関数ＯＳ＿ｋｉｌｌｃａｒｄのアドレスがスタックされる点を除いて（／＊ｅ２０＊／および／＊ｅ２１＊／行）、それぞれ、付録Ｄを参照して説明した／＊ｄ１＊／〜／＊ｄ５＊／および／＊ｄ１６＊／〜／＊ｄ３２＊／行に類似している。
【０１７０】
サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の実行の際に、スタックステップも実行されている。
【０１７１】
従って、付録Ｅのプログラムは、サブルーチン「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」の後に／＊ｅ５＊／行に分岐する。
【０１７２】
／＊ｅ５＊／行の命令を実行する前において、命令スタックの最初の２つの値は、通常、関数ＯＳ＿ｋｉｌｌｃａｒｄのアドレスの下位バイトおよび上位バイトであり、これらの既定値は、／＊ｅ２１＊／および／＊ｅ２０＊／行においてスタックされている。
【０１７３】
これらの値は、／＊ｅ７＊／および／＊ｅ８＊／行の命令を実行する際にアンスタックされる。
【０１７４】
この特定の実施例は、障害攻撃の後にではなく、呼び出された際に関数「ｃｒｉｔｉｃａｌ＿ｆｕｎｃｔｉｏｎ」が実行されることを保証している。
【０１７５】
そうでない場合には、サブルーチンの実行から戻る必然的な時点において関数ＯＳ＿ｋｉｌｌｃａｒｄのアドレスをアンスタックすることにより（具体的には、この関数を実行することにより）、実行異常を検出することができよう。
【０１７６】
／＊ｅ１０＊／および／＊ｅ１１＊／行が付録Ｅのプログラムを終了させている。
【０１７７】
図１は、本発明のスマートカード１００の好適な実施例を表している。
【０１７８】
わかりやすくするべく、マイクロ回路のコンテンツのみを図式的に示している。
【０１７９】
本発明のスマートカード１００は、従来のスマートカードのハードウェアおよびソフトウェア要素（特に、半剛体材料の支持部および電源手段）を更に含んでいる。これらは、いずれも当業分野において周知であり、これらの要素に関する説明は、ここでは省略する。
【０１８０】
本発明のマイクロ回路カード１００は、付録Ａ〜Ｅを参照して前述した方法を実行する手段を含んでいる。
【０１８１】
本明細書において説明した好適な実施例においては、これらの手段は、特に、不揮発性のＥＥＰＲＯＭ、命令スタック（ＳＴＡＣＫ）を収容するＲＡＭ、およびオペレーティングシステム（ＯＳ）を収容するＲＯＭと関連付けられたプロセッサ１１０から構成されている。
【０１８２】
半揮発性のＥＥＰＲＯＭは、特に、付録Ａ〜Ｅのプログラムを収容しており、プロセッサ１００は、これらのプログラムを読み取って実行する。
【０１８３】
また、ＥＥＰＲＯＭは、「ａｎｏｍａｌｙ」および「ＯＳ＿ｋｉｌｌｃａｒｄ」という２つのサブルーチンも収容している。
【０１８４】
付録Ａ〜Ｅのプログラムを実行する際には、レジスタＲ６、Ｒ７およびｔｅｓｔレジスタはＲＡＭ内に保存される。
【０１８５】
本明細書において説明した実施例においては、レジスタＡは、プロセッサ１１０のアキュムレータである。
【０１８６】
【表１】
2007516490.tif 000003
【０１８７】
【表２】
2007516490.tif 000004
【０１８８】
【表３】
2007516490.tif 000005
【０１８９】
【表４】
2007516490.tif 000006
【０１９０】
【表５】
2007516490.tif 000007
【図面の簡単な説明】
【０１９１】
（原文記載なし）
【図１】
2007516490.tif 000008
【国際調査報告】
2007516490.tif 000009
2007516490.tif 000010
2007516490.tif 000011
2007516490.tif 000012