(57)【要約】【課題】  高級言語の文法に則ったソースコードを生成することができるソフトウェア変換装置を提供する。【解決手段】  ラベル検出手段１０２が、アセンブリ言語ソースコード１０１の中から先頭のラベルとｃａｌｌ文の引数となっているラベルを検出し、第１の関数分割手段１０５が、これらのラベルに関連する高級言語ソースコード１０４内の命令を関数の形式に変換し、高級言語ソースコード１０４内の命令をすべて関数に属するものにし、関数化されたｃａｌｌ文の引数となっているラベルでその関数を分割する。【選択図】    図１
2005085051.tif 000002
【特許請求の範囲】
【請求項１】
アセンブリ言語ソースコードを高級言語ソースコードに逆変換するソフトウェア変換装置において、
アセンブリ言語ソースコードの中から先頭のラベルと分岐ラベルを検出するラベル検出手段と、
前記ラベル検出手段の検出結果に応じて、検出したラベルに関連する高級言語ソースコード内の命令を関数の形式に変換し、該高級言語ソースコードを分岐ラベルで分割する第１の関数分割手段と
を備えることを特徴とするソフトウェア変換装置。
【請求項２】
請求項１記載のソフトウェア変換装置であって、
前記第１の関数分割手段により関数の形式に変換された高級言語ソースコードの中から、別の関数単位内のラベルへ分岐する分岐命令の分岐先のラベルを検出する分岐先ラベル検出手段と、
前記分岐先ラベル検出手段の検出結果に応じて、検出した前記分岐先のラベルに関連する高級言語ソースコード内の命令を関数の形式に変換し、該高級言語ソースコードを前記分岐先のラベルで分割するとともに、前記別の関数単位内のラベルへ分岐する分岐命令を関数へ分岐するための関数コールに置き換える第２の関数分割手段と
を備えることを特徴とするソフトウェア変換装置。
【請求項３】
前記第１の関数分割手段は、高級言語ソースコードの先頭のラベルを関数化するとともに該高級言語ソースコードの終端に関数終了を表す記号を挿入して該高級言語ソースコードの先頭のラベル以下の命令を関数内の命令とし、前記分岐ラベルを関数化するとともにその直前に関数の分割を表す記号を挿入して該高級言語ソースコードを分割することを特徴とする請求項１もしくは２のいずれかに記載のソフトウェア変換装置。
【請求項４】
前記第２の関数分割手段は、前記分岐先のラベルを関数化するとともにその直前に関数の分割を表す記号を挿入して該高級言語ソースコードを分割することを特徴とする請求項２乃至３のいずれかに記載のソフトウェア変換装置。
【請求項５】
前記第１の関数分割手段は、前記関数の分割を表す記号に加えて、その直前に関数化された分岐ラベルへ分岐する関数コールを挿入することを特徴とする請求項３もしくは４のいずれかに記載のソフトウェア変換装置。
【請求項６】
前記第２の関数分割手段は、前記関数の分割を表す記号に加えて、その直前に関数化された分岐先のラベルへ分岐する関数コールを挿入することを特徴とする請求項４もしくは５のいずれかに記載のソフトウェア変換装置。
【請求項７】
請求項６記載のソフトウェア変換装置であって、
前記分岐ラベルや前記分岐先のラベルの直前に配置されている命令が関数終了命令であることを検出する関数終了命令検出手段と、
前記関数終了命令検出手段による関数終了命令の検出に応じて、前記分岐ラベルや前記分岐先のラベルの直前に関数コールが挿入されないようにする不要命令省略手段と
を備えることを特徴とするソフトウェア変換装置。
【請求項８】
請求項３乃至７のいずれかに記載のソフトウェア変換装置であって、
前記分岐ラベルや前記分岐先のラベルの直前に配置されている命令がテーブルデータ命令であることを検出するテーブルデータ命令検出手段と、
前記テーブルデータ命令検出手段によるテーブルデータ命令の検出に応じて、前記関数の分割を表す記号の挿入先を前記分岐ラベルや前記分岐先のラベルの直前に代えてテーブルデータ命令の直前にし、テーブルデータ命令が関数単位外に配置されるようにするテーブルデータ配置変更手段と
を備えることを特徴とするソフトウェア変換装置。
【請求項９】
前記分岐ラベルがｃａｌｌ文の引数であることを特徴とする請求項１乃至８のいずれかに記載のソフトウェア変換装置。
【請求項１０】
前記別の関数単位内のラベルへ分岐する分岐命令がｇｏｔｏ文であることを特徴とする請求項２乃至９のいずれかに記載のソフトウェア変換装置。
【請求項１１】
前記関数終了命令がｒｅｔｕｒｎ命令またはｇｏｔｏ命令であることを特徴とする請求項７乃至１０のいずれかに記載のソフトウェア変換装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、あるマイクロコンピュータ（以下、マイコンと称す。）のＣＰＵで実行可能なアセンブリ言語で記述されたソースコード（以下、アセンブリ言語ソースコードと称す。）を、別のＣＰＵを搭載したマイコンで実行可能な高級言語（ＣやＣ＋＋など）のソースコード（以下、高級言語ソースコードと称す。）に逆変換するソフトウェア変換装置に関する。
【背景技術】
【０００２】
セット機能の多機能化にともない、組み込みマイコンのソフトウェア開発において、高級言語であるＣ言語やＣ＋＋言語などを用いてソフトウェアを開発する機会が増加している。一方で、従来から用いられてきたアセンブリ言語のソフトウェア資産を流用する機会も多く、アセンブリ言語ソースコードを高級言語ソースコードに逆変換（逆コンパイル）し、高級言語ソースコードで一元管理する必要性が高まってきている。このようなソフトウェア変換装置（逆コンパイラ）は、主に組み込みマイコンのソフトウェア開発に用いられている（例えば、特許文献１参照。）。
【０００３】
従来のソフトウェア変換装置は、アセンブリ言語の命令を対応する高級言語の命令に１対１で置き換えることで、逆変換を実施していた。
例えば、
Ｌａｂｅｌ  ｅｑｕ  ＊
ＭＯＶ  Ａ，ｒａｍ
ＡＤＤ  Ａ，＃２
ＭＯＶ  ｒａｍ，Ａ
のようなアセンブリ言語ソースコードを、
Ｌａｂｅｌ：
Ｄ１  ＝  ｒａｍ；
Ｄ１  ＋＝  ２；
ｒａｍ  ＝  Ｄ１；
のように、対応する高級言語ソースコードに変換していた。
【０００４】
しかしながら、従来のソフトウェア変換装置は、命令を１対１に置き換えるのみであるため、アセンブリ言語で記述されたｃａｌｌ文などの分岐命令を単に高級言語の関数コールに変換するのみであり、逆コンパイル後の高級言語ソースコードにはその分岐先のラベル（ｃａｌｌ文の引数となっているラベルなど）が関数に変換されることなくそのまま残っていた。そのため、逆コンパイル後の高級言語ソースコードに対してコンパイルしたとき、関数コールの分岐先の関数が存在しないためにエラーとなり、コンパイルできない場合も多かった。
【特許文献１】特表２００１−５１５２４０号公報（第９−１６頁、第一図）
【発明の開示】
【発明が解決しようとする課題】
【０００５】
本発明は、上記問題点に鑑み、逆コンパイル後の高級言語ソースコード内の先頭ラベルと分岐ラベル（ｃａｌｌ文の引数となっているラベルなど）に関連する命令を関数の形式に変換し、高級言語ソースコード内の命令をすべて関数に属するものにし、関数化した分岐ラベルでその関数を分割することにより、高級言語の文法に則ったソースコードを生成するソフトウェア変換装置を提供することを目的とする。
【０００６】
一方、このようにすべての命令が関数に属するようにし、かつ関数化した分岐ラベルでその関数を分割した場合、ラベルに分岐する命令（ｇｏｔｏ文など）の分岐先のラベルがその分岐命令の関数単位外のラベルとなり、コンパイルできなくなるおそれがある。
【０００７】
そこで、本発明は、上記問題点に鑑み、関数単位外のラベルに分岐する命令の分岐先のラベルに関連する高級言語ソースコード内の命令を関数の形式に変換し、高級言語ソースコードをその分岐先のラベルでさらに分割することにより、高級言語の文法に則ったソースコードを生成するソフトウェア変換装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の請求項１記載のソフトウェア変換装置は、アセンブリ言語ソースコードを高級言語ソースコードに逆変換するソフトウェア変換装置において、アセンブリ言語ソースコードの中から先頭のラベルと分岐ラベルを検出するラベル検出手段と、前記ラベル検出手段の検出結果に応じて、検出したラベルに関連する高級言語ソースコード内の命令を関数の形式に変換し、該高級言語ソースコードを分岐ラベルで分割する第１の関数分割手段とを備えることを特徴とする。
【０００９】
本発明の請求項２記載のソフトウェア変換装置は、請求項１記載のソフトウェア変換装置であって、前記第１の関数分割手段により関数の形式に変換された高級言語ソースコードの中から、別の関数単位内のラベルへ分岐する分岐命令の分岐先のラベルを検出する分岐先ラベル検出手段と、前記分岐先ラベル検出手段の検出結果に応じて、検出した前記分岐先のラベルに関連する高級言語ソースコード内の命令を関数の形式に変換し、該高級言語ソースコードを前記分岐先のラベルで分割するとともに、前記別の関数単位内のラベルへ分岐する分岐命令を関数へ分岐するための関数コールに置き換える第２の関数分割手段とを備えることを特徴とする。
【００１０】
本発明の請求項３記載のソフトウェア変換装置は、請求項１もしくは２のいずれかに記載のソフトウェア変換装置であって、前記第１の関数分割手段は、高級言語ソースコードの先頭のラベルを関数化するとともに該高級言語ソースコードの終端に関数終了を表す記号を挿入して該高級言語ソースコードの先頭のラベル以下の命令を関数内の命令とし、前記分岐ラベルを関数化するとともにその直前に関数の分割を表す記号を挿入して該高級言語ソースコードを分割することを特徴とする。
【００１１】
本発明の請求項４記載のソフトウェア変換装置は、請求項２乃至３のいずれかに記載のソフトウェア変換装置であって、前記第２の関数分割手段は、前記分岐先のラベルを関数化するとともにその直前に関数の分割を表す記号を挿入して該高級言語ソースコードを分割することを特徴とする。
【００１２】
本発明の請求項５記載のソフトウェア変換装置は、請求項３もしくは４のいずれかに記載のソフトウェア変換装置であって、前記第１の関数分割手段は、前記関数の分割を表す記号に加えて、その直前に関数化された分岐ラベルへ分岐する関数コールを挿入することを特徴とする。
【００１３】
本発明の請求項６記載のソフトウェア変換装置は、請求項４もしくは５のいずれかに記載のソフトウェア変換装置であって、前記第２の関数分割手段は、前記関数の分割を表す記号に加えて、その直前に関数化された分岐先のラベルへ分岐する関数コールを挿入することを特徴とする。
【００１４】
本発明の請求項７記載のソフトウェア変換装置は、請求項６記載のソフトウェア変換装置であって、前記分岐ラベルや前記分岐先のラベルの直前に配置されている命令が関数終了命令であることを検出する関数終了命令検出手段と、前記関数終了命令検出手段による関数終了命令の検出に応じて、前記分岐ラベルや前記分岐先のラベルの直前に関数コールが挿入されないようにする不要命令省略手段とを備えることを特徴とする。
【００１５】
本発明の請求項８記載のソフトウェア変換装置は、請求項３乃至７のいずれかに記載のソフトウェア変換装置であって、前記分岐ラベルや前記分岐先のラベルの直前に配置されている命令がテーブルデータ命令であることを検出するテーブルデータ命令検出手段と、前記テーブルデータ命令検出手段によるテーブルデータ命令の検出に応じて、前記関数の分割を表す記号の挿入先を前記分岐ラベルや前記分岐先のラベルの直前に代えてテーブルデータ命令の直前にし、テーブルデータ命令が関数単位外に配置されるようにするテーブルデータ配置変更手段とを備えることを特徴とする。
【００１６】
本発明の請求項９記載のソフトウェア変換装置は、請求項１乃至８のいずれかに記載のソフトウェア変換装置であって、前記分岐ラベルがｃａｌｌ文の引数であることを特徴とする。
【００１７】
本発明の請求項１０記載のソフトウェア変換装置は、請求項２乃至９のいずれかに記載のソフトウェア変換装置であって、前記別の関数単位内のラベルへ分岐する分岐命令がｇｏｔｏ文であることを特徴とする。
【００１８】
本発明の請求項１１記載のソフトウェア変換装置は、請求項７乃至１０のいずれかに記載のソフトウェア変換装置であって、前記関数終了命令がｒｅｔｕｒｎ命令またはｇｏｔｏ命令であることを特徴とする。
【発明の効果】
【００１９】
本発明によれば、アセンブリ言語を高級言語に逆コンパイル（逆変換）するに際し、アセンブリ言語にｃａｌｌ文などのラベルに分岐する命令が記述されている場合であっても、その分岐命令の分岐先のラベル（分岐ラベル）を関数化し、高級言語のソースコード内の命令をすべて関数に属するものにし、関数化した分岐ラベルでこの関数を分割するので、高級言語の文法に則ったソースコードを生成することができる。
【００２０】
また、このようにすべての命令を関数に属するものにし、かつ関数化した分岐ラベルでその関数を分割することにより、ｇｏｔｏ文などのラベルに分岐する命令の分岐先のラベルがその分岐命令の関数単位外のラベルとなった場合であっても、この分岐命令を関数コールに置き換え、その分岐先のラベルを関数化し、この関数化した分岐先のラベルでさらに高級言語ソースコードを分割するので、高級言語の文法に則ったソースコードを生成することができる。
【００２１】
また、関数化した分岐ラベルや分岐先のラベルで関数を分割するに際し、関数を分割する記号の直前にその直後の関数化したラベルへ分岐する関数コールを挿入するので、分岐することなしに高級言語ソースコードの流れの順に処理が行われる場合であっても、論理の整合性を取ることができる。
【００２２】
一方、関数化する分岐ラベルや分岐先のラベルの直前の命令が関数終了命令である場合には関数コールを挿入しないので、ソースコードのコードサイズを圧縮することができる。
【００２３】
また、関数化する分岐ラベルや分岐先のラベルの直前の命令がテーブルデータ命令である場合には、そのテーブルデータ命令の直前で関数が終了するようにするので、高級言語の文法に則ったソースコードを生成することができる。
【発明を実施するための最良の形態】
【００２４】
以下、本発明の実施の形態について、図面を交えて説明する。
図１は、本実施の形態におけるソフトウェア変換装置の構成を示す概略図である。
図１において、ラベル検出手段１０２はアセンブリ言語ソースコード１０１の中から先頭のラベルと分岐ラベル（例えば、ｃａｌｌ文の引数となっているラベル）を検出し、これらのラベルをデータベースに登録する。逆コンパイラ１０３はアセンブリ言語ソースコード１０１を逆コンパイルして高級言語ソースコード１０４に変換する。
【００２５】
第１の関数分割手段１０５は、データベースに登録されたラベルに関連する高級言語ソースコード１０４内の命令を関数の形式に変換し、高級言語ソースコード１０４を分岐ラベルで分割する。ここでは、第１の関数分割手段１０５は、高級言語ソースコード１０４の先頭のラベルを関数化するとともに高級言語ソースコード１０４の終端に関数終了を表す記号“｝”を挿入して高級言語ソースコード１０４の先頭のラベル以下の命令を関数内の命令とし、分岐ラベルを関数化するとともにその直前に関数の分割を表す記号（関数終了を表す記号）“｝”を挿入して高級言語ソースコード１０４を分割する。
【００２６】
さらに、第１の関数分割手段１０５は、分岐ラベルの直前にその分岐ラベルへ分岐する関数コールを挿入する。
また、第１の関数分割手段１０５内の関数終了命令検出手段１０６は、分岐ラベルの直前に配置されているｒｅｔｕｒｎ命令やｇｏｔｏ命令などの関数終了命令を検出する。
【００２７】
不要命令省略手段１０７は、関数終了命令検出手段１０６による関数終了命令の検出に応じて、関数コールが挿入されないようにする。
テーブルデータ命令検出手段１０８は、分岐ラベルの直前に配置されているテーブルデータ命令を検出する。
【００２８】
テーブルデータ配置変更手段１０９は、テーブルデータ命令検出手段１０８によりテーブルデータ命令が検出された場合、関数終了を表す記号“｝”の挿入先を分岐ラベルの直前からテーブルデータ命令の直前に変更し、テーブルデータ命令が後述する関数単位外に配置されるようにする。
【００２９】
また、分岐先ラベル検出手段１１０は、第１の関数分割手段１０５により関数の形式に変換された高級言語ソースコードの中から、別の関数単位内のラベルへ分岐する分岐命令の分岐先のラベルを検出する。
【００３０】
第２の関数分割手段１１１は、分岐先ラベル検出手段１１０により検出された分岐先のラベルに関連する高級言語ソースコード内の命令を関数の形式に変換し、この高級言語ソースコードを分岐先のラベルで分割するとともに、分岐命令を関数へ分岐するための関数コールに置き換える。ここでは、第２の関数分割手段１１１は、分岐先のラベルを関数化するとともにその直前に関数の分割を表す記号（関数終了を表す記号）“｝”を挿入して該高級言語ソースコードを分割する。
【００３１】
さらに、第２の関数分割手段１１１は、分岐先のラベルの直前にこの分岐先のラベルへ分岐する関数コールを挿入する。
また、第２の関数分割手段１１１内の関数終了命令検出手段１０６は、分岐先のラベルの直前に配置されているｒｅｔｕｒｎ命令やｇｏｔｏ命令などの関数終了命令を検出する。
【００３２】
不要命令省略手段１０７は、関数終了命令検出手段１０６による関数終了命令の検出に応じて、関数コールが挿入されないようにする。
テーブルデータ命令検出手段１０８は、分岐先のラベルの直前に配置されているテーブルデータ命令を検出する。
【００３３】
テーブルデータ配置変更手段１０９は、テーブルデータ命令検出手段１０８によりテーブルデータ命令が検出された場合、関数終了を表す記号“｝”の挿入先を分岐先のラベルの直前からテーブルデータ命令の直前に変更し、テーブルデータ命令が後述する関数単位外に配置されるようにする。
【００３４】
本実施の形態におけるソフトウェア変換装置は、以上のような構成からなることにより目的とする高級言語ソースコード１１２を得ることができる。
以下、該ソフトウェア変換装置の動作について、まずラベル検出手段と第１の関数分割手段の動作から詳説する。
【００３５】
図２（ａ）は、ｃａｌｌ文の検索による関数分割を説明するためのフローチャート図である。まず、ステップＳ２０１において、アセンブリ言語ソースコードから先頭のラベルと分岐ラベルであるｃａｌｌ文の引数になっているラベルをすべて検索する。次に、ステップＳ２０２において、ステップＳ２０１で検索したすべてのラベルを関数テーブル（データベース）２０４に登録する。最後に、ステップＳ２０３において、関数テーブル２０４に登録されたラベルに基づいて、アセンブリ言語ソースコードを逆コンパイルして得た高級言語ソースコード内の先頭のラベルとｃａｌｌ文の引数になっているラベルに関連する命令を関数の形式に変換する。
【００３６】
この変換処理は、以下のような処理により行う。例えばラベルＬａｂｅｌ１がｃａｌｌ文の引数になっており、関数テーブルに登録されている場合、アセンブリ言語ソースコードを逆コンパイルして得た高級言語ソースコードには、
Ｌａｂｅｌ１：
と記述されている。そこで、まずこのラベルの直前にｇｏｔｏ文を記述して、
ｇｏｔｏ  Ｌａｂｅｌ１；
Ｌａｂｅｌ１：
とした後、この“Ｌａｂｅｌ１：”の直前に関数終了を表す記号（関数の分割を表す記号）“｝”を挿入するとともに、このラベルを関数化して、
Ｌａｂｅｌ１（  ）；ｒｅｔｕｒｎ；
｝
ｖｏｉｄ  Ｌａｂｅｌ１（ｖｏｉｄ）｛
と置き換える。なお、ラベルＬａｂｅｌ１が関数化されるので、“ｇｏｔｏ  Ｌａｂｅｌ１；”は関数へ分岐するための関数コール“Ｌａｂｅｌ１（  ）；ｒｅｔｕｒｎ；”に置換される。
【００３７】
また、一番先頭のラベルも関数テーブル２０４に登録しておき、この一番先頭のラベルを関数化するとともに、ファイルの終端に関数終了を表す記号“｝”を挿入することにより、すべての命令が関数に属するようになる。
【００３８】
例えば、先頭のラベルがラベルＬａｂｅｌ１の場合、アセンブリ言語ソースコードを逆コンパイルして得た高級言語ソースコードには、
Ｌａｂｅｌ１：
と記述されており、このラベルを関数化して
ｖｏｉｄ  Ｌａｂｅｌ１（ｖｏｉｄ）｛
と置き換えるとともに、ファイルの終端に関数終了を表す記号“｝”を挿入する。
【００３９】
以上のように、ソースコード内の一番先頭のラベルを関数化してファイルの終端に関数終了を表す記号“｝”を挿入するとともに、ｃａｌｌ文の引数となっているラベル（分岐ラベル）の直前に関数終了を表す記号“｝”を挿入してこのラベルを関数化することにより、すべての命令が関数に属するようになり、かつｃａｌｌ文の引数となっているラベルで高級言語ソースコードが分割される。
【００４０】
図３は本実施の形態におけるｃａｌｌ文の検索による関数分割の一実施例である。
まず、アセンブリ言語ソースコード３０１より、先頭のラベルであるラベルＬａｂｅｌ１とｃａｌｌ文の引数であるラベルＬａｂｅｌ３を関数テーブルに登録する。
【００４１】
次に、この関数テーブルに基づいて、アセンブリ言語ソースコード３０１を逆コンパイルして得たソースコード３０２を関数分割する。すなわち、ラベルＬａｂｅｌ３の直前にｇｏｔｏ文“ｇｏｔｏ  Ｌａｂｅｌ３；”を記述してソースコード３０３とした後、ラベルＬａｂｅｌ１を関数化してファイルの終端に関数終了を表す記号“｝”を挿入するとともに、ラベルＬａｂｅｌ３の直前に関数終了を表す記号“｝”を挿入してこのラベルを関数化することにより、ラベルＬａｂｅｌ３で関数分割された高級言語ソースコード３０４を得る。
【００４２】
なお、ソースコード３０３のｇｏｔｏ文“ｇｏｔｏ  Ｌａｂｅｌ４”はラベルＬａｂｅｌ４へ分岐するｇｏｔｏ命令であるのでそのまま残され、ｇｏｔｏ文“ｇｏｔｏ  Ｌａｂｅｌ３”は関数“ｖｏｉｄ  Ｌａｂｅｌ３（ｖｏｉｄ）｛”へ分岐するｇｏｔｏ命令であるので関数コール“Ｌａｂｅｌ３（  ）；ｒｅｔｕｒｎ；”に置換される。
【００４３】
以上のようにｃａｌｌ文の検索による関数分割を行うことで、全命令が関数に属するようになる。しかしながら、この処理のみでは、関数外のラベルへ分岐するｇｏｔｏ文（分岐命令）が残る場合がある。
【００４４】
例えば、図３に示す例では、ソースコード３０４に
ｇｏｔｏ  Ｌａｂｅｌ４：
が残り、関数“ｖｏｉｄ  Ｌａｂｅｌ１（ｖｏｉｄ）｛”から関数“ｖｏｉｄ  Ｌａｂｅｌ３（ｖｏｉｄ）｛”へ分岐する構成になり、高級言語の文法に則さずに、コンパイル時に不具合が発生する。
【００４５】
そこで、本実施の形態ではこの問題を回避するために、分岐先ラベル検出手段と第２の関数分割手段により、関数外のラベルに分岐するｇｏｔｏ文の検索による関数分割を行う。
【００４６】
図２（ｂ）は、ｇｏｔｏ文の検索による関数分割を説明するためのフローチャート図である。
まず、処理開始時におけるステップＳ２１１では、関数テーブル２１４はｃａｌｌ文の検索による関数分割の処理時に得た関数テーブル２０４と同じものである。
【００４７】
次に、ステップＳ２１２において、ｃａｌｌ文の検索による関数分割後のソースコードの先頭から順に関数化されていないラベル（分岐先のラベル）を検索する。関数化されていないラベルが見つかった場合、そのラベルに分岐するｇｏｔｏ文（分岐命令）をすべて検索する。
【００４８】
続いて、ステップＳ２１３において、ステップＳ２１２にて検索されたラベルで高級言語ソースコードを関数分割するか否かの判定を行う。
この判定処理は以下のようにして行う。すなわち、関数テーブル２１４に基づいて、関数化されたラベルから次の関数化されたラベルの直前の行までを１つの関数単位とし、関数化されていないラベルとそのラベルに分岐するｇｏｔｏ文が同じ関数単位に属しているか否かを判定する。関数化されていないラベルとそのラベルに分岐するすべてのｇｏｔｏ文が同じ関数単位に属する場合は、そのラベルとｇｏｔｏ文をそのまま残し、ステップＳ２１２へ移行して次の関数化されていないラベルの検索に移る。一方、関数化されていないラベルとそのラベルに分岐するｇｏｔｏ文が別の関数単位に属する場合、ステップＳ２１４へ移行し、そのラベルに関連する高級言語ソースコード内の命令を関数の形式に変換する。本実施の形態では、このようにして別の関数単位内のラベルへ分岐する分岐命令の分岐先のラベルの検出を行う。
【００４９】
また、ステップＳ２１４における変換処理は、以下のような処理により行う。例えばラベルＬａｂｅｌ１が関数化されていないラベルであって、このラベルＬａｂｅｌ１に分岐するｇｏｔｏ文が別の関数単位に属する場合、ｃａｌｌ文の検索による関数分割後のソースコードには、
Ｌａｂｅｌ１：
と記述されている。そこで、まずこのラベルの直前にｇｏｔｏ文を記述して、
ｇｏｔｏ  Ｌａｂｅｌ１；
Ｌａｂｅｌ１：
とした後、この“Ｌａｂｅｌ１：”の直前に関数終了を表す記号（関数の分割を表す記号）“｝”を挿入するとともに、このラベルを関数化し、
Ｌａｂｅｌ１（  ）；ｒｅｔｕｒｎ；
｝
ｖｏｉｄ  Ｌａｂｅｌ１（ｖｏｉｄ）｛
と置き換え、ラベルＬａｂｅｌ１で高級言語ソースコードを関数分割する。
【００５０】
また、このようにラベルＬａｂｅｌ１が関数化されるので、ラベルＬａｂｅｌ１へ分岐する命令である“ｇｏｔｏ  Ｌａｂｅｌ１；”は関数へ分岐するための関数コール“Ｌａｂｅｌ１（  ）；ｒｅｔｕｒｎ；”に置換される。
【００５１】
このように新たにラベルを関数化した後、ステップＳ２１１へ戻ってそのラベルを関数テーブル２１４に追加登録し（関数一覧作成）、再度、先頭から関数化されていないラベルの検索を開始する。
【００５２】
以上の処理を関数化されていないラベルとそのラベルに分岐するｇｏｔｏ文がすべて同じ関数単位に属するようになるまで繰り返すことにより、高級言語の文法に則したソースコードを得ることができる。
【００５３】
このｇｏｔｏ文の検索による関数分割を図４に示す一実施例に則して説明する。図４において、ソースコード３０４は図３に示すソースコード３０４と同じものである。
まず、ソースコード３０４の先頭から順に関数化されていないラベルを検索し、ラベルＬａｂｅｌ２を検出する。次に、このラベルＬａｂｅｌ２に分岐するｇｏｔｏ文を検索する。図４に示す例ではこのラベルに関数単位の外から分岐してくるｇｏｔｏ文（別の関数単位内のラベルに分岐する分岐命令）は存在しないので、ラベルＬａｂｅｌ２では高級言語ソースコードの関数分割を行わない。
【００５４】
続いて、再度ソースコード３０４の先頭から順に関数化されていないラベルを検索し、ラベルＬａｂｅｌ４を検出する。次に、このラベルＬａｂｅｌ４に分岐するｇｏｔｏ文を検索する。図４に示す例では、ラベルＬａｂｅｌ４は関数“ｖｏｉｄ  Ｌａｂｅｌ３（ｖｏｉｄ）｛”の関数単位に属し、ラベルＬａｂｅｌ４へ分岐するｇｏｔｏ文はその関数単位とは別の関数“ｖｏｉｄ  Ｌａｂｅｌ１（ｖｏｉｄ）｛”に属するので、ラベルＬａｂｅｌ４で高級言語ソースコードの関数分割を行う。
【００５５】
すなわち、ソースコード３０４内のラベルＬａｂｅｌ４の直前にｇｏｔｏ文“ｇｏｔｏ  Ｌａｂｅｌ４；”を記述してソースコード３０５とした後、ラベルＬａｂｅｌ４の直前に関数終了を表す記号“｝”を挿入してこのラベルを関数化することにより、ラベルＬａｂｅｌ４で分割された高級言語ソースコード３０６を得る。
【００５６】
続いて、ソースコード３０６の先頭から順に関数化されていないラベルの検索を行う。図４に示す例では、関数化されていないラベルはこれ以上存在しないので、ここで作業を終了する。
【００５７】
以上のように、ｃａｌｌ文の検索による関数分割後の高級言語ソースコードから、別の関数単位内のラベルに分岐するｇｏｔｏ文（分岐命令）の分岐先のラベルを検出し、この分岐先のラベルの直前に関数終了を表す記号“｝”挿入するとともにこのラベルを関数化し、かつそのｇｏｔｏ文を関数コールに置き換えることにより、高級言語の関数の文法に則したソースコードを得ることができる。
【００５８】
なお、別の関数単位内のラベルに分岐するｇｏｔｏ文（分岐命令）の分岐先のラベルを検出するたびに関数分割を行うのではなく、すべての該当ラベルを関数テーブルに追加登録した後、関数分割するようにしてもよい。
【００５９】
このように、ｃａｌｌ文の検索による関数分割およびｇｏｔｏ文の検索による関数分割によって、全命令が関数に属し、かつ高級言語の関数の文法に則したソースコードを得ることができる。
【００６０】
しかしながら、これらの処理により本来不要な命令を追加してしまう場合がある。
例えば、図３、４に示す例では、ラベルＬａｂｅｌ３（分岐ラベル）とラベルＬａｂｅｌ４（分岐先のラベル）を関数化する際に、そのラベルの直前にｇｏｔｏ命令（関数コール）が挿入される。
【００６１】
この命令は、分岐することなしにソースコードの流れの順にＬａｂｅｌ３、Ｌａｂｅｌ４の処理が行われる場合の対策のために配置しているものである。しかし、図３、４に示す例では、これらの命令はｒｅｔｕｒｎ命令の直後に配置されることになるため実行されることは無い。
【００６２】
そこで、本実施の形態では、関数終了命令検出手段と不要命令削除手段により、関数分割する際に、分割する直前の命令（分岐ラベルや分岐先のラベルの直前の命令）がｒｅｔｕｒｎ命令やｇｏｔｏ命令のような関数終了命令の場合には、分岐ラベルや分岐先のラベルの直前にｇｏｔｏ命令を挿入しないようにする。
【００６３】
図５（ａ）は、分割する直前の命令がｒｅｔｕｒｎ命令もしくはｇｏｔｏ命令の場合の関数分割を説明するためのフローチャート図である。
まず、ステップＳ５０１おいて、ｃａｌｌ文またはｇｏｔｏ文の検索による関数分割を行うに際し、分割する直前の命令がｒｅｔｕｒｎ命令もしくはｇｏｔｏ命令であるか否かを判定する。この判定処理は、関数テーブルに基づいて行ってもよいし、関数テーブルにラベルを登録する際に行ってもよい。
【００６４】
分割する直前の命令がｒｅｔｕｒｎ命令もしくはｇｏｔｏ命令であった場合には、ステップＳ５０２において、新たに挿入したｇｏｔｏ命令を省略して、あるいはｇｏｔｏ命令を挿入することなく関数分割の処理を施し、それ以外の命令の場合にはステップＳ５０３において、ｇｏｔｏ命令をそのまま配置して関数分割の処理を施し論理の整合性を取る。
【００６５】
例えば、図３に示すソースコード３０２に対してｃａｌｌ文の検索による関数分割およびｇｏｔｏ文の検索による関数分割を行うに際し、上述したｇｏｔｏ命令を省略する処理を施すことにより、図６に示すソースコード６０１を得ることができる。このソースコード６０１は、図４に示すソースコード３０６と比較して、関数“ｖｏｉｄ  Ｌａｂｅｌ３（ｖｏｉｄ）｛”と“ｖｏｉｄ  Ｌａｂｅｌ４（ｖｏｉｄ）｛”の前に配置されている関数コール“Ｌａｂｅｌ３（）；ｒｅｔｕｒｎ；”と“Ｌａｂｅｌ４（）；ｒｅｔｕｒｎ；”が省略されている。
【００６６】
さらに、ソースコードがテーブルデータ命令を含む場合、上述したｃａｌｌ文またはｇｏｔｏ文の検索による関数分割を行うとテーブルデータ命令が関数に含まれてしまい、高級言語の文法に則さないソースコードに変換されるという問題がある。ここで、テーブルデータ命令とは、プログラム上の例えば関数の中で使用されるデータ列のみをテーブル化したものを指す。
【００６７】
例えば、図７（ａ）に示すソースコード７０１に対して、上述したｃａｌｌ文の検索による関数分割およびｇｏｔｏ文の検索による関数分割を行うと、ラベルＬａｂｅｌ４の関数化にともない、テーブルデータＴａｂｌｅ１（ｄｃ命令によりデータを２バイト分確保している）が関数内部に配置されたソースコード７０２に変換される。
【００６８】
そこで、本実施の形態では、テーブルデータ命令検索手段とテーブルデータ配置変更手段により、関数分割する際に、分割する直前の命令（分岐ラベルや分岐先のラベルの直前の命令）がテーブルデータ命令の場合には、関数の分割を表す記号（関数の終了を表す記号）“｝”の挿入先を分岐ラベルや分岐先のラベルの直前からテーブルデータ命令の直前に変更し、テーブルデータ命令の配置を関数単位外へ変更する。
【００６９】
図５（ｂ）は、分割する直前の命令がテーブルデータ命令の場合の関数分割を説明するためのフローチャート図である。
まず、ステップＳ５１１において、ｃａｌｌ文またはｇｏｔｏ文の検索による関数分割を行うに際し、分割する直前の命令がテーブルデータ命令であるか否かを判定する。この判定処理は、関数テーブルに基づいて行ってもよいし、関数テーブルにラベルを登録する際に行ってもよい。
【００７０】
分割する直前の命令がテーブルデータ命令であった場合、ステップＳ５１２において、関数終了を表す記号“｝”の挿入先を分岐ラベルや分岐先のラベルの直前からテーブルデータ命令の直前に変更して関数分割を行う。それ以外の命令の場合は、ステップＳ５１３において、そのまま関数分割を行うことにより論理の整合性を取ることが可能となる。
【００７１】
例えば、図７（ｂ）に示すソースコード７０１に対してｃａｌｌ文の検索による関数分割およびｇｏｔｏ文の検索による関数分割を行うに際し、上述したテーブルデータ命令の配置を変更する処理を施すことにより、テーブルデータＴａｂｌｅ１を関数内部に含まないソースコード７０３を得ることができる。すなわち、ソースコード７０１においてラベルＬａｂｅｌ４を関数化する際に、関数終了を表す記号“｝”の挿入先をラベルＬａｂｅｌ４の直前からテーブルデータ命令を示すラベル“Ｔａｂｌｅ１：”の直前に変更することにより、関数内部にテーブルデータ命令を含まないソースコード７０３を得ることが可能となる。
【００７２】
なお、分割する直前に配置されているテーブルデータ命令を検出し、さらにその検出したテーブルデータ命令の直前に配置されているｒｅｔｕｒｎ命令もしくはｇｏｔｏ命令を検出することで、上述のｇｏｔｏ命令を省略する処理とテーブルデータの配置を更する処理を合わせて行うようにしてもよい。
【産業上の利用可能性】
【００７３】
本発明にかかるソフトウェア変換装置は、アセンブリ言語ソースコードから高級言語の文法に則ったソースコードを生成することができるので、あるマイコンのＣＰＵで実行可能なアセンブリ言語ソースコードを、別のＣＰＵを搭載したマイコンで実行可能な高級言語のソースコードに逆変換するソフトウェア変換装置などに適用できる。
【図面の簡単な説明】
【００７４】
【図１】本発明の実施の形態におけるソフトウェア変換装置の構成を示す概略図
【図２】本発明の実施の形態におけるソフトウェア変換装置の動作を説明するためのフローチャート図（その１）（ａ）  ｃａｌｌ文の検索による関数分割を説明するためのフローチャート図（ｂ）  ｇｏｔｏ文の検索による関数分割を説明するためのフローチャート図
【図３】本発明の実施の形態におけるｃａｌｌ文の検索による関数分割の一実施を示す図
【図４】本発明の実施の形態におけるｇｏｔｏ文の検索による関数分割の一実施を示す図
【図５】本発明の実施の形態におけるソフトウェア変換装置の動作を説明するためのフローチャート図（その２）（ａ）  分割する直前の命令がｒｅｔｕｒｎ命令もしくはｇｏｔｏ命令の場合の関数分割を説明するためのフローチャート図（ｂ）  分割する直前の命令がテーブルデータ命令の場合の関数分割を説明するためのフローチャート図
【図６】本発明の実施の形態におけるｇｏｔｏ命令を省略する処理を施した場合の関数分割の一実施を示す図
【図７】本発明の実施の形態におけるテーブルデータ命令の配置を変更する処理を施した場合の関数分割の一実施を示す図
【符号の説明】
【００７５】
１０１      アセンブリ言語ソースコード
１０２      ラベル検出手段
１０３      逆コンパイラ
１０４      高級言語ソースコード
１０５      第１の関数分割手段
１０６      関数終了命令検出手段
１０７      不要命令省略手段
１０８      テーブルデータ命令検出手段
１０９      テーブルデータ配置変更手段
１１０      分岐先ラベル検出手段
１１１      第２の関数分割手段
１１２      目的とする高級言語ソースコード
【図１】
2005085051.tif 000003
【図２】
2005085051.tif 000004
【図３】
2005085051.tif 000005
【図４】
2005085051.tif 000006
【図５】
2005085051.tif 000007
【図６】
2005085051.tif 000008
【図７】
2005085051.tif 000009