(57)【要約】【課題】  アセンブリコード（命令）から変換したコード数を削減するとともに、変換における工数を削減することにある。【解決手段】  マイコンで実行されるアセンブリ言語で記述された命令群を高水準言語で記述されたコード群へ変換するソースコード変換部を有するアセンブリコード変換装置であって、前記命令群から制御フローグラフを生成し、前記制御フローグラフにおける前記マイコン内のレジスタの更新命令と参照命令を抽出し、前記抽出において対応する参照命令の無い更新命令を到達定義として算出するレジスタ参照・更新命令解析部と、前記到達定義に基づき、前記対応する参照命令の無い更新命令から変換されたコードを前記ソースコード変換部の変換した前記コード群から削除するレジスタ更新コード削減部と、を有する。【選択図】  図１
2015197821.tif 000002
【特許請求の範囲】
【請求項１】
マイコンで実行されるアセンブリ言語で記述された命令群を高水準言語で記述されたコード群へ変換するソースコード変換部を有するアセンブリコード変換装置であって、
前記命令群から制御フローグラフを生成し、前記制御フローグラフにおける前記マイコン内のレジスタの更新命令と参照命令を抽出し、前記抽出において対応する参照命令の無い更新命令を到達定義として算出するレジスタ参照・更新命令解析部と、
前記到達定義に基づき、前記対応する参照命令の無い更新命令から変換されたコードを前記ソースコード変換部の変換した前記コード群から削除するレジスタ更新コード削減部と、
を有することを特徴とするアセンブリコード変換装置。
【請求項２】
前記レジスタ参照・更新命令解析部は前記レジスタの値を前記変換のときに決定できる参照命令を抽出し、
前記レジスタ更新コード削減部は前記決定できる参照命令から変換されたコードを前記決定できるレジスタの値に固定したコードへ置き換えること
を特徴とする請求項１に記載のアセンブリコード変換装置。
【請求項３】
前記ソースコード変換部は前記命令群からマイコン内のステータスレジスタの更新と参照を含む前記コードへ変換し、
前記レジスタ参照・更新命令解析部は前記ステータスレジスタの更新を伴う命令と参照を伴う命令を抽出し、対応する参照を伴う命令の無い前記更新を伴う命令と、前記ステータスレジスタの値を前記変換のときに決定できる前記参照を伴う命令とを到達定義として算出し、
前記レジスタ更新コード削減部は前記対応する参照を伴う命令の無い前記更新を伴う命令から変換されたコードの中の前記ステータスレジスタを更新するコードを前記コード群から削除し、前記決定できる参照を伴う命令から変換されたコードの中の前記ステータスレジスタを参照するコードを前記決定できるステータスレジスタの値に固定したコードへ置き換えること
を特徴とする請求項１または２に記載のアセンブリコード変換装置。
【請求項４】
前記ソースコード変換部は前記命令群からマイコン内のプログラムカウンタの更新と参照を含む前記コードへ変換し、
前記レジスタ参照・更新命令解析部は前記プログラムカウンタの更新を伴う命令と参照を伴う命令を抽出し、対応する参照を伴う命令の無い前記更新を伴う命令と、前記プログラムカウンタの値を前記変換のときに決定できる前記参照を伴う命令とを到達定義として算出し、
前記レジスタ更新コード削減部は前記対応する参照を伴う命令の無い前記更新を伴う命令から変換されたコードの中の前記プログラムカウンタを更新するコードを前記コード群から削除し、前記決定できる参照を伴う命令から変換されたコードの中の前記プログラムカウンタを参照するコードを前記決定できるプログラムカウンタの値に固定したコードへ置き換えること
を特徴とする請求項１〜３のいずれか１項に記載のアセンブリコード変換装置。
【請求項５】
前記レジスタあるいはステータスレジスタの前記更新および参照はビット単位であることを特徴とする請求項１〜４のいずれか１項に記載のアセンブリコード変換装置。
【請求項６】
前記レジスタの代わりに前記マイコン内のメモリ領域あるいは前記マイコン外のメモリ領域であることを特徴とする請求項１〜５のいずれか１項に記載のアセンブリコード変換装置。
【請求項７】
前記命令群に含まれる相対アドレス方式あるいは間接アドレス方式の命令に対してアドレス番地の候補を決定するアドレス候補決定部と、
前記決定されたアドレス番地の候補を前記命令群に挿入するアドレス候補挿入部と、
を更に有し、
前記ソースコード変換部は前記命令群に含まれるアドレス番地の候補を候補数に応じた分岐のコードへ更に変換すること
を特徴とする請求項１〜６のいずれか１項に記載のアセンブリコード変換装置。
【請求項８】
前記命令群に含まれる相対アドレス方式あるいは間接アドレス方式の命令に対してアドレス番地の候補を決定するアドレス候補決定部と、
前記決定されたアドレス番地の候補を前記命令群に挿入するアドレス候補挿入部と、
を更に有し、
前記ソースコード変換部は前記命令群に含まれるアドレス番地の候補が単一である場合に、前記候補のアドレス番地に応じたコードへ更に変換すること
を特徴とする請求項１〜６のいずれか１項に記載のアセンブリコード変換装置。
【請求項９】
前記レジスタ参照・更新命令解析部は前記命令群に含まれるＩ／Ｏ制御レジスタの参照命令を抽出し、
前記抽出した参照命令により得られる前記Ｉ／Ｏ制御レジスタの値の影響が前記マイコン内のレジスタに残る命令を抽出するＩ／Ｏ制御コード抽出部
を更に有することを特徴とする請求項１〜８のいずれか１項に記載のアセンブリコード変換装置。
【請求項１０】
複数のレジスタを備えるマイコン内のレジスタ毎に更新命令と参照命令の組をすべて抽出し、複数の前記組の中で更新命令から参照命令までのステップ時間が他の組と時間的に一部または全部が重複する組であって、時間的に途切れることのなく重複する組すべてにおける最初のステップ時間の更新命令と最後のステップ時間の参照命令とを抽出すること
を特徴とする請求項１〜９のいずれか１項に記載のアセンブリコード変換装置。
【請求項１１】
前記最初のステップ時間の更新命令から最後のステップ時間の参照命令までの間の命令を１つのサブルーチンへ変換すること
を特徴とする請求項１０に記載のアセンブリコード変換装置。
【請求項１２】
マイコンで実行されるアセンブリ言語で記述された命令群を高水準言語で記述されたコード群へ変換するアセンブリコードの変換方法であって、
前記命令群から制御フローグラフを生成するステップと、
前記制御フローグラフにおける前記マイコン内のレジスタの更新命令と参照命令を抽出するステップと、
前記抽出において対応する参照命令の無い更新命令を到達定義として算出するステップと、
前記到達定義に基づき、前記対応する参照命令の無い更新命令から変換されたコードを記コード群から削除するステップと、
を有することを特徴とするアセンブリコードの変換方法。
【請求項１３】
前記命令群に含まれる相対アドレス方式あるいは間接アドレス方式の命令に対してアドレス番地の候補を決定するステップと、
前記決定されたアドレス番地の候補を前記命令群に挿入するステップと、
前記ソースコード変換部は前記命令群に含まれるアドレス番地の候補を候補数に応じた分岐のコードへ変換するステップと、
を更に有することを特徴とする請求項１２に記載のアセンブリコードの変換方法。
【請求項１４】
前記命令群に含まれるＩ／Ｏ制御レジスタの参照命令を抽出するステップと、
前記抽出した参照命令により得られる前記Ｉ／Ｏ制御レジスタの値の影響が前記マイコン内のレジスタに残る命令を抽出するステップと、
を更に有することを特徴とする請求項１２または１３に記載のアセンブリコードの変換方法。
【請求項１５】
複数のレジスタを備えるマイコン内のレジスタ毎に更新命令と参照命令の組をすべて抽出するステップと、
複数の前記組の中で更新命令から参照命令までのステップ時間が他の組と時間的に一部または全部が重複する組であって、時間的に途切れることのなく重複する組すべてにおける最初のステップ時間の更新命令と最後のステップ時間の参照命令とを抽出するステップと、
を更に有することを特徴とする請求項１２〜１４のいずれか１項に記載のアセンブリコードの変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はアセンブリコード変換装置およびその変換方法に関するものである。
【背景技術】
【０００２】
ソフトウェアの記述言語としてアセンブリ言語が古くから広く使用されている。アセンブリ言語はマイコンが直接実行可能な機械語を人間に分かりやすい形式で記述するための言語であり、低水準言語等とも呼ばれ、その表現はマイコンのアーキテクチャに依存する。このため、あるマイコンのアセンブリ言語で記述されたアセンブリコードを、別のマイコンで動作できるような形式へ直接変換することは困難であり、アセンブリコードをＣ言語等の高水準言語への書き直し(逆コンパイル)が必要である。
【０００３】
特許文献１には、あるマイコンのアセンブリ言語で記述されたアセンブリコードを、Ｃ言語等の高水準言語へ変換する技術が開示されている。特許文献１に開示された技術によると、アセンブリ言語で記述された一命令(ニーモニック)を、直接対応するＣ言語形式へ変換することができる。たとえば、”MOV R1, R2”というニーモニック(汎用レジスタＲ１の内容を汎用レジスタＲ２へコピーする命令)があれば、以下のようなＣ言語表記へ当てはめて置き換える。
unsigned long R1, R2;
R2 = R1;
また、ソフトウェアの最適化は広く行われており、例えば非特許文献１には制御フローグラフのデータフロー解析から到達定義を得て最適化する技術が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００４-２５２８０７号公報
【非特許文献１】中田育男著、「コンパイラの構成と最適化」、株式会社朝倉書店、 p282-333
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１に開示された技術を用いればアセンブリコードをＣ言語へ変換することは可能である。しかしながら、マイコン内部処理も含めた動作も完全に再現してしまい、Ｃ言語への変換において冗長なコードを生成してしまう可能性がある。
【０００６】
たとえば、MOV命令の実行結果によっては、マイコン内のＣＰＵ（Central Processing Unit）が有するステータスレジスタ(コンディションコードレジスタ、フラグレジスタ等とも呼ばれるが、以下、ステータスレジスタとする)の内容を更新する場合がある。ステータスレジスタは、通常、暗黙的にハードウェアで処理され、命令実行終了毎で命令実行結果に応じた値が格納される。一方、ステータスレジスタはマイコン間で互換性がなく、異なるアーキテクチャのマイコン間で対応付けることは困難である。また、ステータスレジスタだけでなく、プログラムカウンタもマイコンに依存する。そして、命令によっては、ステータスレジスタやプログラムカウンタを参照するものもあり、ステータスレジスタやプログラムカウンタの処理を省くことはできない。
【０００７】
特許文献１に開示された技術は、ハードウェアとして再現できない部分についてＣ言語等の高水準言語を用いてソフトウェアとして記述する技術であり、”MOV R1, R2”は以下のように変換される。
unsigned long R1, R2;
struct {
unsigned char Zero : 1;    //ゼロフラグ(演算結果が0の場合に1)
unsigned char Negative : 1;//ネガティブフラグ(演算結果が負の場合に1)
unsigned char Carry : 1;  //キャリーフラグ(演算結果にキャリーが発生した場合に1)
(省略)
} StatReg;                //ステータスレジスタを表す構造体
R2 = R1;
//以下はステータスレジスタ更新処理
if(R2 != 0) StatReg.Zero = 1;
else StatReg.Zero = 0;
if(R2 < 0)  StatReg.Negative = 1;
else  StatReg.Negative = 0;
(省略)
//以下はプログラムカウンタ更新処理  ADDRLENは隣接する命令のメモリ位置間の長さ
ProgCont += ADDRLEN;
このような変換となるため、一命令辺りの高水準言語で記述されたコード数が増加してしまう。命令あたりのコード数が増加することは、移行前のマイコン上において一命令で動作していた命令が移行先のマイコンでは複数の命令になるため、アセンブリコードを記録するROM（Read Only Memory）容量や、処理時間の増大を招いてしまう。そして、移行先のマイコンとして高性能なマイコンを用いることとなり、結果的に移行先マイコンの単価が高くなってしまう。
【０００８】
そこで、本発明の目的は、アセンブリコード（命令）から変換したコード数を削減するとともに、変換における工数を削減することにある。
【課題を解決するための手段】
【０００９】
本発明に係る代表的なアセンブリコード変換装置は、マイコンで実行されるアセンブリ言語で記述された命令群を高水準言語で記述されたコード群へ変換するソースコード変換部を有するアセンブリコード変換装置であって、前記命令群から制御フローグラフを生成し、前記制御フローグラフにおける前記マイコン内のレジスタの更新命令と参照命令を抽出し、前記抽出において対応する参照命令の無い更新命令を到達定義として算出するレジスタ参照・更新命令解析部と、前記到達定義に基づき、前記対応する参照命令の無い更新命令から変換されたコードを前記ソースコード変換部の変換した前記コード群から削除するレジスタ更新コード削減部と、を有することを特徴とする。  
また、本発明はアセンブリコードの変換方法としても把握される。
【発明の効果】
【００１０】
本発明によれば、アセンブリコードから変換したコード数を削減でき、変換における工数を削減できる。
【図面の簡単な説明】
【００１１】
【図１】アセンブリコード変換装置の構成の例を示す図である。
【図２】命令変換ライブラリの例を示す図である。
【図３】レジスタ参照・更新命令解析部の構成の例を示す図である。
【図４】アセンブリコード変換装置の処理フローチャートの例を示す図である。
【図５】ニーモニックの識別子付与とＣ言語化の例を示す図である。
【図６】制御フローグラフ生成とレジスタ判定の例を示す図である。
【図７】到達定義の例を示す図である。
【図８】冗長なレジスタ更新を削除する処理フローチャートの例を示す図である。
【図９】相対・間接アドレス方式対応のアセンブリコード変換装置の構成の例を示す図である。
【図１０】アドレス候補決定部の構成の例を示す図である。
【図１１】相対・間接アドレス方式対応のアセンブリコード変換装置の処理フローチャートの例を示す図である。
【図１２】相対・間接アドレス方式のアセンブリコードのＣ言語化の例を示す図である。
【図１３】Ｉ／Ｏ制御対応のアセンブリコード変換装置の構成の例を示す図である。
【図１４】Ｉ／Ｏ制御に関する命令を抽出する処理フローチャートの例を示す図である。
【図１５】Ｉ／Ｏ制御コード抽出部の処理フローチャートの例を示す図である。
【図１６】Ｉ／Ｏ制御対応のアセンブリコード変換装置が生成したデータの例を示す図である。
【図１７】汎用レジスタの生存期間とサブルーチンとの関係の例を示す図である。
【図１８】サブルーチンを判定する処理フローチャートの例を示す図である。
【発明を実施するための最良の形態】
【００１２】
以下、図面を用いて好ましい実施例を説明する。
【実施例１】
【００１３】
(構成の説明)
図１はアセンブリコード変換装置の構成の例を示す図である。なお、以下の説明では高水準言語としてＣ言語を前提に説明するが、Ｃ言語以外の高水準言語であってもよい。図１に示すアセンブリコード変換装置１００は、ニーモニック識別部１１０、レジスタ参照・操作命令解析部１２０、ソースコード変換部１３０、レジスタ更新コード削減部１４０、および命令変換ライブラリ１５０から構成される。
【００１４】
ニーモニック識別部１１０は入力されたアセンブリコードＩＮ１１のニーモニック（命令）を識別するための識別子（ニーモニック識別子）を付与するものである。レジスタ参照・更新命令解析部１２０は入力されたアセンブリコードＩＮ１１からステータスレジスタやプログラムカウンタを含めたＣＰＵ内レジスタのデータ変化（データフロー）を解析するものである。ソースコード変換部１３０はアセンブリコードＩＮ１１のアセンブリコードをＣ言語で記述されたコード(以降、Ｃ言語コード)へ変換するものである。レジスタ更新コード削減部１４０はレジスタ参照・更新命令解析部１２０が生成した解析結果を元に、ソースコード変換部１３０が生成したＣ言語コードから冗長なレジスタ更新処理を削減し、最適化されたＣ言語コードＯＵＴ１２を生成するものである。
【００１５】
命令変換ライブラリ１５０はニーモニックをＣ言語形式へ変換するルールを定めたテーブルである。命令変換ライブラリ１５０の例を図２に示す。命令変換ライブラリ１５０はニーモニック構文規則１５１とそれに対応するＣ言語表記法１５２の対応表となっており、アセンブリコードＩＮ１１中のニーモニックを対応するＣ言語表記へ変換するための情報である。この情報は予め操作者が図示を省略した入力装置から手動で入力し記憶してもよいし、マイコン製造メーカ等の提供する電子情報を入力し記憶しても良い。
【００１６】
図３にレジスタ参照・更新命令解析部１２０の構成の例を示す。レジスタ参照・更新命令解析部１２０は、アセンブリコードＩＮ１１の構文を解析して制御フローグラフを生成する制御フローグラフ生成部１２１と、アセンブリコードＩＮ１１で利用されるニーモニックの構文から各命令の実行によって更新されるレジスタまたは参照されるレジスタを判定する参照・更新レジスタ判定部１２２と、制御フローグラフ生成部１２１が生成した制御フローグラフから、レジスタの値の更新(定義)や参照処理が実行される可能性を判定するレジスタ操作解析部１２３を有する。
【００１７】
ここで、レジスタ操作解析部１２３の解析結果ＯＵＴはレジスタの到達定義(以降、到達定義)と呼ばれ、例えば非特許文献１等にも記載されたデータフロー解析アルゴリズムによって決定される。レジスタ操作解析部１２３が生成した到達定義は、任意の命令実行時において、当命令を実行時におけるレジスタの値を定義する可能性がある命令の情報を有する。加えて、任意の命令実行時に定義したレジスタを参照する命令の情報を有する。すなわち、到達定義によって、ステータスレジスタやプログラムカウンタを含めた任意レジスタが参照される時点における値を決定する命令がどの命令であるかを求めることができる。
【００１８】
レジスタ更新コード削減部１４０は、レジスタ参照・更新命令解析部１２０が生成したレジスタの到達定義から、ある命令によって更新されたレジスタの値が、他の命令によって参照されることがないことを確認した後に、ソースコード変換部１３０が生成したＣ言語コードから当該参照されることのないレジスタを更新する処理に相当するコードを削除する。
【００１９】
(処理の説明)
以上で説明した構成における処理例を図４に示したフローチャートにしたがい説明する。変換対象であるアセンブリコードＩＮ１１を、アセンブリコード変換装置１００に入力し、最適化されたＣ言語コードＯＵＴ１２を出力するまでの処理のフローチャートの例を図４に示す。本処理例では、アセンブリコード変換装置１００がアセンブリコードＩＮ１１の入力を受けた際、アセンブリコードＩＮ１１に文法上の問題がないか確認（Ｓ４００）した後、ニーモニック識別部１１０にてアセンブリコードＩＮ１１内のニーモニックに識別子を付与する（Ｓ４１０）。
【００２０】
なお、識別子は独自に設定する処理にしてもよいし、入力されたアセンブリコードＩＮ１１の行番号等の入力ファイル固有の情報を用いる処理でもよい。また、アセンブリコード１１に文法上の問題がある場合は処理を終了する。ニーモニックの識別子を付与（Ｓ４１０）した後、以下の処理を独立に実行する。図４においてはＳ４２０とＳ４３０との両方への分岐として示す。
【００２１】
(処理１) ニーモニックを対応するＣ言語表記へ変換する（Ｓ４３０）。生成したＣ言語コードは、テキストファイルとして保存する。また、ニーモニックの識別子を元に、変換元のニーモニックと、変換後のＣ言語コードの対応関係を把握できるようにする。アセンブリコードＩＮ１１(ｔｅｓｔ．ａｓｍ)の入力から識別子を付与するイメージと、Ｃ言語コードＯＵＴ１４（ｔｅｓｔ．ｃ）に変換した後で対応関係を保持するイメージの例を図５に示す。この例では、ニーモニック識別子をＣ言語コードＯＵＴ１４（ｔｅｓｔ．ｃ）中にコメントとして残してある。なお、Ｃ言語コードＯＵＴ１４は冗長なコードを含む点においてＣ言語コードＯＵＴ１２とは異なる。
【００２２】
(処理２)レジスタ参照・更新命令解析部１２０にて、制御フローグラフを生成する（Ｓ４２０）。制御フローグラフを生成した後、アセンブラコードＩＮ１１中のニーモニックが参照または更新するレジスタを判定する(Ｓ４２１)。たとえば、”MOV R1, R2”というニーモニックがあれば、当命令実行時に参照するレジスタはＲ１であり、更新されるレジスタはＲ２の他、ステータスレジスタとプログラムカウンタがある。
【００２３】
ここで、判定に必要な情報はマイコンの仕様書等に規定されている。マイコンの仕様書等が書類であれば操作者がその内容を図示を省略した入力装置から手動で入力してもよいし、マイコンの仕様書等が電子情報であってそのまま判定に使用できるものであれば予め記憶させておいてもよい。このようにして得られた情報は各ニーモニックに紐付けて保持する。Ｓ４２０とＳ４２１の処理のイメージの例を図６に示す。図６においてアセンブリコード１５ではニーモニックに識別子付与済みと仮定し、更新情報１６ではＪＭＰ（ジャンプ）命令後にステータスレジスタ（ＳｔａｔＲｅｇ）を更新すると仮定している。
【００２４】
その後、制御フローグラフを元に到達定義を計算し、得られた到達定義をファイルに出力する（Ｓ４２２）。ファイル出力した到達定義のデータ構成例を図７に示す。カラム７１０はニーモニック識別部１１０が各命令に対して割り当てたニーモニック識別子である。このニーモニック識別子の個数とアセンブリコードＩＮ１１中のニーモニック数は一致し、アセンブリコードＩＮ１１内の並びと同じ順序で並ぶ。カラム７２０は、ニーモニック識別子に対応するニーモニックの内容が格納される。
【００２５】
カラム７３０は、当命令すなわちカラム７２０に示したニーモニック識別子の命令によって更新したレジスタが使用される可能性のあるニーモニックの情報が格納される。カラム７３０は二つのサブカラム７３１および７３２を有している。サブカラム７３１は、識別子を振り分けられた個々のニーモニックに対して、参照・更新レジスタ判定部１２２が生成した情報の内、更新されるレジスタの情報が格納される。なお、図７に示したテーブルの例では一つのセルに対して一つのレジスタが割り当てられる。
【００２６】
サブカラム７３２は、サブカラム７３１に示したレジスタ毎で、当命令によって更新したレジスタの値が参照される可能性のあるニーモニック一覧をニーモニック識別子として表す。なお、レジスタ毎で参照される可能性があるニーモニックは複数存在することもある。また、レジスタ名を変数名として、レジスタをメモリのアドレスとしてもよい。メモリはマイコンに内蔵されたメモリでもよいし、マイコンの外に接続したメモリでもよい。図７に示すカラム７３０の内容は、参照・更新レジスタ判定部１２２にて得られた情報、および到達定義の計算結果に問題が無ければ、容易に導出可能である。
【００２７】
以上の処理１、２が完了した後、処理１で得られたＣ言語コードＯＵＴ１４および処理２で得られた到達定義により、Ｃ言語コードＯＵＴ１４から冗長なコードを削除する処理を実行する（Ｓ４４０）。この処理はレジスタ更新コード削減部１４０にて実行される。
【００２８】
冗長なコードを削減する処理のフローチャートの例を図８に示す。先ず、レジスタ更新コード削減部１４０は既に説明した処理１および処理２で生成した個々のファイルを読み込む（Ｓ８００）。読み込んだ後に、Ｃ言語コードＯＵＴ１４内のニーモニック識別子を取得し、最適化対象のニーモニックを処理可能とする（Ｓ８１０）。対象となるニーモニックの識別子から、対応する到達定義を参照し、図７に示したデータを取得する（Ｓ８２０）。
【００２９】
対象ニーモニックの到達定義を参照し、命令の実行によって更新されるレジスタが存在するかどうか判定する（Ｓ８３０）。これは、サブカラム７３１の内容をチェックすることで判定できる。更新されるレジスタが存在する場合、サブカラム７３２の内容を判定し、当命令によって更新したレジスタの内容が、他の命令で参照される可能性があるかどうかチェックする（Ｓ８４０）。
【００３０】
参照される可能性がない場合、Ｃ言語コードＯＵＴ１４中の当該レジスタを更新する処理に相当するコードを削除する（Ｓ８５０）。Ｓ８４０およびＳ８５０の処理は、同一ニーモニックにおいて、更新されるレジスタすべてに対して実行する（Ｓ８６０）。
以上の処理（Ｓ８１０〜Ｓ８６０）は、ニーモニック単位で実行されＣ言語コードＯＵＴ１４中の全ニーモニックに対して実行される（Ｓ８７０）。以上の処理によって、冗長なレジスタ更新処理が削減されたＣ言語コードＯＵＴ１２が生成される。
【００３１】
また、Ｓ８５０の処理は、レジスタ単位だけでなく、ビット単位で処理することもできる。これは、図７に示した到達定義のサブカラム７３１の内容を、ビット単位に拡張することで容易に実現できる。ビット単位でＳ８５０を実行することで、ステータスレジスタの更新処理を更に削減でき、さらに冗長処理が少ないコードを生成することができる。
【００３２】
以上は、ステータスレジスタを例に説明したが、プログラムカウンタにおいても、同様の処理を適用でき、命令毎で実行されるプログラムカウンタの冗長な更新処理を削減できる。例えば、アセンブリコードＩＮ１１中で、プログラムカウンタをベースとした相対アドレス方式（プログラムカウンタ相対アドレス方式）を利用していないことが、アセンブリ変換装置１００から得られた到達定義から判断可能である。したがって、プログラムカウンタが参照される可能性があるニーモニックの存在有無で容易に判断できる。
【００３３】
(効果の説明)
以上の処理によって、Ｃ言語化されたアセンブリコードから、ステータスレジスタやプログラムカウンタ等が冗長なレジスタとなった場合に冗長なレジスタ更新処理を削減できる。その効果として、命令単位のＣ言語コード数を削減することができ、移行先マイコンのＣＰＵクロック数や命令を記録するＲＯＭ容量を少なくできる。その結果的として、移行先マイコン性能の制限を緩和でき、より安価なマイコンでアセンブリコードの移行を実現できる。
【００３４】
（追加効果）
また、レジスタ値を更新する命令によっては、当レジスタを参照する命令実行時点のレジスタ値を決定することが可能な場合もある。例えば、以下のようなMOV命令があり、MOV命令実行後のＲ０の内容をステータスフラグに反映するＣＰＵがあるとする。
MOV H’0000, R0
この場合、ステータスレジスタの値として、ゼロフラグ(StateFlag.Zero)が１となることは明らかである。したがって、ゼロフラグを判定する分岐処理は不要となり、Ｃ言語コードでは、StateFlag.Zero=1を必ず実行するようなコードを挿入するだけでよい。レジスタ参照・更新命令解析部１２０がゼロフラグを判定する分岐命令を抽出し、レジスタ更新コード削減部１４０が分岐命令を削除し、必ず実行するようなコードを挿入してもよい。このような場合、レジスタ値を絶対値に置き換えたＣ言語コードを生成する方が、移行先マイコン向けのコンパイラ等でマシンコードに置き換えた際に、より少ないクロック数で実行可能な即値命令として表現できるため、効率的なコードが生成できる。
【実施例２】
【００３５】
(本実施例の適用対象)
マイコンのＣＰＵがサポートするアドレッシングモードは、大きく、絶対アドレス方式、相対アドレス方式、間接アドレス方式に分類される。絶対アドレス方式はメモリ番地を直接指定する方式であり、マイコン間でメモリマップの対応が明確である場合は、その対応関係を元に機械的に変換して問題がない。一方、相対アドレス方式と間接アドレス方式は命令実行時点でのレジスタが保持する値が必要となる。また、移行元マイコンにおいて、相対アドレス方式と間接アドレス方式で必要となるレジスタの値は、移行元マイコンのメモリマップを基準としている。例えば、以下に示すアセンブリコードがあるとする。
MOV H’0124, R1  //汎用レジスタR1に0x0124をコピー
JMP @R1        //R1の内容が表すアドレス番地へジャンプ
上記の例では、JMP命令実行時に、アドレス番地0x0124へジャンプする処理を実行し、アドレス番地0ｘ0124に示す命令を実行する。ところが、メモリマップが異なる他のマイコンでは、ジャンプ後に実行する命令はアドレス番地0x0124にあることは稀であり、他のアドレス番地であることが殆どである。汎用レジスタの値そのものをアドレス番地にするだけではなく汎用レジスタの値にオフセットを加算してアドレス番地とする場合や、専用レジスタであるプログラムカウンタの値にオフセットを加算してアドレス番地とする場合も同様である。したがって、相対アドレス方式や間接アドレス方式を利用した命令実行時は、命令実行時に対応する移行先マイコンのアドレスを決定する必要がある。しかし、相対アドレス方式や間接アドレス方式は、複数のアドレス番地が候補として指定される場合、実際にプログラムを実行しないと決定できないケースもあり、ソースコードのみでアドレス値を決定することは困難である。
【００３６】
(構成の説明)
本実施例におけるアセンブリコード変換装置９００の構成例を図９に示す。アセンブリコード変換装置９００は、ニーモニック識別部１１０、ソースコード変換部１３１、図示を省略したレジスタ更新コード削減部１４０、命令変換ライブラリ１５０、アドレス候補決定部９１０、およびアドレス候補挿入部９２０から構成される。アセンブリコード変換装置１００と同じ符号を付けた構成は、アセンブリコード変換装置１００と同じものである。ただし、ソースコード変換部１３１は、アセンブリコード変換装置１００のソースコード変換部１３０が実行する処理に加え、アドレス候補挿入部９２０が挿入したアドレス情報を参照し、対応するＣ言語コードを生成する。
【００３７】
アドレス候補決定部９１０の構成の例を図１０に示す。アドレス候補決定部９１０は、入力された到達定義から、間接アドレス方式または相対アドレス方式として実行する命令を取得する間接・相対アドレス方式命令取得部９１１、および内部でカラム７２０記載のニーモニックの内容を解釈し、解釈したニーモニックに対応するレジスタ値の加減算処理等のＣＰＵの演算処理を解析する命令パーサ（parser）９１２を有しており、到達定義のカラム７２０の内容からレジスタが取り得る具体的な値を導出する機能を有する。アドレス候補挿入部９２０は、アドレス候補決定部９１０にて得られた候補値をアセンブリコードＩＮ２１へ挿入する機能を有する。
【００３８】
(処理の説明)
図９に示した構成による処理例を図１１に示す。Ｓ１１００からＳ１１２２までの処理は、それぞれＳ４００からＳ４２２までの処理と対応し、同じ処理を実行する。その後、Ｓ１１２２の処理で得られた到達定義を元に、アドレス候補決定部９１０にて、間接アドレス方式または相対アドレス方式を利用した命令実行時において取り得る値を計算する(Ｓ１１２３)。その際、対象命令実行時において、参照するレジスタの値がどの命令によって決定されたか判断する必要があるが、これは図７に示した到達定義のフォーマットから求めることができる。
【００３９】
参照するレジスタの値が決定された後に、レジスタ参照・更新命令解析部１２０が生成した到達定義２３から、間接アドレス方式で実行する命令または相対アドレス方式で実行する命令の実行時のレジスタが取り得る値を命令パーサ９１２にて計算し、値の候補を取得する。得られた候補値は、アドレス値候補２４として、アドレス候補挿入部９２０へ渡される。Ｓ１１２３にて得られたアドレス値候補２４は、アドレス候補挿入部９２０にて入力されたアセンブリコードＩＮ２１（ニーモニック識別部１１０の出力）に挿入する（Ｓ１１３０）。挿入の処理は、該当する命令と同じ行にコメントとして挿入する処理や、ニーモニック識別子に紐付けて別ファイルとして管理する処理等がある。前者の処理で生成したコードの例を、図１２中のアセンブリコードＩＮ２５に示す。
【００４０】
Ｓ１１４０では、間接アドレス方式または相対アドレス方式を用いた命令を、対応するＣ言語コードへ変換する処理を実行する。実行の入力と出力の例を図１２に示す。この例では、”JMP @R1”の命令を、switch文として表しており、レジスタＲ１の内容に応じて、ジャンプする先を個別に設定している。ここで、L_0xXXXXはアドレス番地0xXXXXに配置された処理に相当する内容が記載されたラベルである。
【００４１】
以上ではジャンプ命令を例に挙げたが、以上の説明は間接アドレス方式または相対アドレス方式を用いたすべての命令においても成り立つ。例えば、以下のような命令の場合、汎用レジスタＲ１には汎用レジスタＲ０が保持する値に対応するアドレス番地のメモリ領域に保持された値をコピーする処理を実行する。
MOV @R0, R1
この命令をＣ言語へ置き換えた場合、以下のようになる。
R1 = * trans_memaddr(R0);
unsigned long * trans_memaddr(unsigned long Rx){
switch(Rx){
case 0xXXXX:            //移行元マイコン(16bit)のアドレス値候補の一つ
return (unsigned long *)0xXXXXXXXX; //0xXXXXに対応する移行先マイコン(32bit)のアドレス値
case 0xYYYY:             //移行元マイコン(16bit)のアドレス値候補の一つ
return (unsigned long *)0xYYYYYYYY; //0xYYYYに対応する移行先マイコン(32bit)のアドレス値
…
}
}
この例ではメモリマップの異なる移行元マイコンの１６ｂｉｔアドレス値から移行先マイコンの３２ｂｉｔアドレス値へ変換してコピーする処理を実行する。そして、このように図１１に示す処理によって、アドレスが取り得る値の候補を見積もることで、相対アドレス方式または間接アドレス方式を利用したすべての命令に対応可能となる。以上の例ではアドレス番地の候補が複数の場合を例に説明したが、アドレス番地の候補が一意である場合、絶対アドレス方式と同様に扱う。
【００４２】
(効果の説明)
本構成によると、間接アドレス方式および相対アドレス方式を用いた命令を、機械的に高水準言語へ置き換える処理を実現する。そのため、移行に係る工数を削減することができる。
【実施例３】
【００４３】
(本実施例の適用対象)
あるマイコンがＩ／Ｏ制御方式として、メモリマップドＩ／Ｏ方式を採用している場合、Ｉ／Ｏ制御はメモリ空間にＩ／Ｏ専用レジスタを割り当て、そのレジスタの値を読み書きすることで制御する。この方式は、マイコンのＣＰＵ内部回路を簡素化できるため、多くのマイコンで採用されている。
【００４４】
一方、Ｉ／Ｏ制御はＬＳＩ（Large-Scale Integration）チップすなわちハードウェアに依存する部分であり、一般的に高水準言語へ直接変換できない。また、変換できるとしても、デバイスドライバとして記述されるため、結果的に個々のマイコンに依存してしまう。そのため、Ｃ言語化する際は、Ｉ／Ｏ専用レジスタに書き込む値を把握し、その情報を元に、移行先マイコンのＩ／Ｏ仕様に応じて対応する必要がある。しかし、この作業を人手で行った場合、非常に多くの工数がかかる場合がある。
【００４５】
(構成の説明)
本実施例におけるアセンブリコード変換装置１３００の構成例を図１３に示す。アセンブリコード変換装置１３００は、ニーモニック識別部１１０、レジスタ参照・更新命令解析部１２０、Ｉ／Ｏ制御コード抽出部１３１０、およびＩ／Ｏ制御レジスタライブラリ１３２０から構成される。ニーモニック識別部１１０およびレジスタ参照・更新命令解析部１２０は、アセンブリコード変換装置１００内の同じ符号の構成と同じ処理を実行する。
【００４６】
Ｉ／Ｏ制御コード抽出部１３１０は、Ｉ／Ｏ制御に関する命令を抽出する。この抽出は、Ｉ／Ｏ制御レジスタ単位で行われ、対象のＩ／Ｏ制御レジスタを更新する命令の他、Ｉ／Ｏ制御レジスタの値の決定に関与する命令も含めて抽出する。また、Ｉ／Ｏ制御レジスタに代入する値の決定に関与する命令の他、Ｉ／Ｏ制御レジスタから取得した値を利用する命令も含めて抽出する。
Ｉ／Ｏ制御レジスタライブラリ１３２０は、移行元マイコンのＩ／Ｏ制御レジスタの一覧情報が格納されている。具体的には、Ｉ／Ｏ制御レジスタのアドレス番地や、ラベル名(一つのＩ／Ｏレジスタに複数のラベル名が割り当てられている場合もある)が格納されている。また、Ｉ／Ｏ制御レジスタライブラリ１３２０の内容は、ＬＳＩチップに依存するため、ＬＳＩチップのバージョンやロット毎で異なる場合もある。
【００４７】
(処理の説明)
アセンブリコード変換装置１３００による処理例を図１４に示す。Ｓ１４００からＳ１４２２までの処理は、それぞれ図４のＳ４００からＳ４２２までの処理と対応し、同等の処理を実行する。ただし、Ｓ１４２１では、レジスタの値として、Ｉ／Ｏ制御レジスタも含めて判定する。Ｉ／Ｏ制御レジスタの一覧情報はＩ／Ｏ制御レジスタライブラリ１３２０から取得する。Ｓ１４３０ではＩ／Ｏ制御コード抽出部１３１０にて、Ｓ１４２２で得られた到達定義から、Ｉ／Ｏ制御レジスタに関する命令を抽出する処理を実行する。
【００４８】
Ｉ／Ｏ制御コード抽出部１３１０すなわちＳ１４３０の詳細な処理の例を図１５に示す。先ず、ニーモニック識別子が付与されたアセンブリコード、および到達定義のファイルをそれぞれ読み込む（Ｓ１５００）。その後、到達定義からＩ／Ｏ制御レジスタを直接参照、または更新する命令を抽出する（Ｓ１５１０）。抽出した命令が、Ｉ／Ｏ制御レジスタの値を更新する命令である場合、更新する値を決定する命令を到達定義から導出する（Ｓ１５２０）。これは、更新したレジスタが参照される可能性があるニーモニック(図７におけるカラム７３０)を辿ることで導出できる。Ｉ／Ｏ制御レジスタの値を参照する命令の場合も、更新する命令と同様に、到達定義から導出できる。
【００４９】
Ｉ／Ｏ制御レジスタを参照する命令の抽出条件として、抽出対象の命令が、Ｉ／Ｏ制御レジスタの情報を有することとする。例えば、以下のようなコードがあるとする。左端の番号はニーモニック識別番号（識別子）とする。
01  MOV @IO_REG, R1  //Ｉ／Ｏ制御レジスタIO_REGから値を取得し、汎用レジスタＲ１へ格納
02  MOV R1, R2  //汎用レジスタＲ２に汎用レジスタＲ１の値を代入する
03  ADD H’20, R2  //汎用レジスタＲ２の値に、0x20を加算
04  MOV H’FF, R2 //汎用レジスタＲ２の値に、0ｘFFを代入
この例の場合、ADD命令実行後の汎用レジスタＲ２は、取得したＩ／Ｏ制御レジスタの情報を有している。一方、ADD命令の次のMOV命令実行後の汎用レジスタＲ２は、取得したＩ／Ｏ制御レジスタとは関係がない情報である。このため、Ｉ／Ｏ制御に関する命令はニーモニック識別番号０１から０３までの命令が該当する。このような、レジスタ値の影響関係も、到達定義によって導出できる。なお、Ｉ／Ｏ制御レジスタに関する処理を抽出する際は、そのレジスタの内容を参照する命令と、更新する命令とで切り分けることが望ましい。
【００５０】
Ｓ１５１０からＳ１５３０までの処理は、Ｉ／Ｏ制御レジスタライブラリ１３２０に記載されたＩ／Ｏ制御レジスタすべてに対して実行される（Ｓ１５３０）。この処理によって出力されたファイルＯＵＴ３２が含むデータの例を図１６に示す。カラム１６１０はＩ／Ｏ制御レジスタの一覧である。その内容はＩ／Ｏ制御レジスタライブラリから取得する。セル一つあたり、アドレス番地とラベル名の情報を有する。ラベル名が複数ある場合はそれらの情報も有する。
【００５１】
例えば、0xFF01番地に、８ビットタイマの制御レジスタが割り当てられ、それに“8BIT_TIMER”というラベルが付与されている場合、セルにはアドレス番地0xFF01とラベル“8BIT_TIMER”が格納される。0xFF02番地にモータのトルク値を取得するＤＡ変換器の制御レジスタは割り当てられ、“DA_CON1”と“MOTOR_TORQ”というラベルが付与されている場合、セルにはアドレス番地0xFF02とラベル“ DA_CON1”、“ MOTOR_TORQ”が格納される。なお、行数はメモリ空間に割り当てられたＩ／Ｏ制御レジスタの総数と一致する。
【００５２】
カラム１６２０はカラム１６１０のＩ／Ｏ制御レジスタを直接参照する命令のニーモニック識別子である。カラム１６３０はカラム１６２０のニーモニック識別子が対応するニーモニックの内容を表す。カラム１６４０は、対象の命令が、Ｉ／Ｏ制御レジスタの値を参照するか、または更新するかを表すフラグである。カラム１６５０は対象の命令が関与するＩ／Ｏ制御に関与する命令一覧である。これは関与する命令をニーモニック識別子として網羅している。
【００５３】
カラム１６５０に網羅された命令は、入力されたアセンブリコードＩＮ３と統合することもできる。統合した際に、当ニーモニックがＩ／Ｏ制御レジスタである諭旨をソースコード変換部１３０へ通知することができるようになる。
【００５４】
(効果の説明)
カラム１６５０の内容を参照することで、Ｉ／Ｏ制御レジスタの操作に関わる命令をすべて抽出できる。これらの情報は、移行先マイコンの周辺回路の仕様に合わせこむ際に、参照可能な命令である。必要な情報を部分的に抽出する作業を自動化できるため、周辺回路の互換仕様を合わせる際の工数を削減することができる。
【実施例４】
【００５５】
(本実施例の適用対象)
アセンブリ言語ではローカル変数と呼ばれる概念は存在しないが、Ｃ言語等の高水準言語ではローカル変数が扱われる。高水準言語から機械語を生成するツールであるコンパイラが最適化を実行する際、グローバル変数でなく、ローカル変数でなければ、最適化できない場合がある。一方、アセンブリ言語は、汎用レジスタやメモリ空間を直接制御する仕様であり、高水準言語で例えると、グローバル変数として扱っていることと同等である。すなわち、機械的に高水準言語へ変換した場合、汎用レジスタはグローバル変数として定義され、移行先マイコンのコンパイラによる最適化処理の効果を受けにくくなる。
【００５６】
これに対し、以下に説明する処理を適用することで、汎用レジスタの生死状況を把握することができ、最適なサブルーチン化の基準を設けることが可能となる。サブルーチン化の基準を設けることで、Ｃ言語化する際に、汎用レジスタのローカル変数化を、各変数の生存期間が最小化できるように設定できる。その結果として、移行先マイコン開発環境のコンパイラを用いた際、より最適なコードを生成でき、移行先マイコンの性能を抑えることができる。
【００５７】
(処理の説明)
ローカル変数化はアセンブリコード変換装置１００が生成する到達定義により実現できる。各汎用レジスタの更新と、更新された値が最後に参照される関係をグラフ化した例を図１７に示す。図１７に示す縦軸はプログラムのステップ数を単位とする汎用レジスタの生存期間とする。ここでは、ステップ数の増加方向を下方向としてある。すなわち、ステップ数はプログラム開始から何ステップ目であるかを表し、この意味ではプログラム内の静的な特定時間や位置を表すとともに、ステップを単位とする時間であるステップ時間を表す。横軸は汎用レジスタの一覧を示してある。これはプログラム中で利用されている汎用レジスタの種類に準ずる。また、図１７に示すグラフは、ステップ数と到達定義中のニーモニック識別子で対応付けることで、求めることができる。
【００５８】
点１７０１は汎用レジスタの値が定義されるポイントを示す。また、点１７０２は点１７０１にて定義された値を最後に参照するポイントを示す。点１７０２は汎用レジスタＲ０の点１７０１からの到達定義により取得することができる。このようなポイントを使用し、図１７のサブルーチンとなるsub1()１７０３を例に、サブルーチンを判定する処理例を図１８に示す。Ｓ１８０１ではsub1()１７０３の開始位置と終了位置を変数として初期化し、Ｓ１８０２にて汎用レジスタＲ０における生存期間(tR0_1)の値を代入する。ここでは、sub1()１７０３の開始位置にtR0_1の開始位置１７０４を、sub1()１７０３の終了位置にtR0_1の終了位置１７０５を代入する。
【００５９】
次に、他の汎用レジスタ(ここではＲ１、Ｒ２)における生存期間(tR1_1、tR2_1)の開始位置（終了位置）を参照し、それぞれの開始位置（終了位置）がtR0_1時の値を下回る（上回る）場合、値を更新する（Ｓ１８０３〜Ｓ１８０８）。例えばsub1()１７０３の終了位置が点１７０５の時点で汎用レジスタＲ１の参照終了位置である点１７０６を比較すると（Ｓ１８０６）、点１７０６の方が点１７０５よりステップ数の位置としては大きいため、点１７０６が新たなsub1()１７０３の終了位置とする（Ｓ１８０７）。
【００６０】
以上の処理を実行した後、次の汎用レジスタの生存期間の開始位置(tRX_2)が、sub1()の終了位置より上回るかどうか確認し、上回ることが確認できた場合は、その点をsub1()の開始位置、終了位置とする。逆に下回った場合は、sub1()の終了位置がＮ（２，３，・・・，Ｎ）番目の汎用レジスタの生存期間(tRX_N)の開始位置を上回るまで、Ｓ１８０４〜Ｓ１８１０の処理を繰り返す（Ｓ１８１２〜Ｓ１８１３）。
【００６１】
以上により、プログラム内で使用される各変数の生存期間を最小とするサブルーチン化の基準（範囲）を決定することができる。その結果として、ローカル変数を効率的に定義した高水準言語で記述されたコードを生成することができ、移行先マイコンの開発環境におけるコンパイラの最適化機構を最大限に活用できる。結果的に、移行先マイコンにとって効率的なマシンコードを生成できる。また、以上の処理は、汎用レジスタに限らず、メモリ空間やステータスレジスタ等のＣＰＵ専用レジスタにおいても有効である。
【実施例５】
【００６２】
実行されることがない処理をブロック単位で削減することもできる。例えば、以下のような命令がある場合、CMP命令実行時のレジスタ値をアセンブリコード変換装置１００の生成した到達定義から予測することで、分岐発生の有無を予め判断できる。この例では０ｘＡＡと０ｘＦＦの比較となり、Ｌａｂｅｌ１に対応する処理は実行することが決してないため、Ｌａｂｅｌ１以下の処理を変換する必要がなくなる。
MOV H’00AA, R0 //汎用レジスタＲ０に０ｘＡＡを代入
CMP R0, H’00FF //Ｒ０の値と０ｘＦＦの差分を取り、処理結果をステータスフラグへ反映
BGT Label1 //Ｒ０の内容が０ｘＦＦより大きければ、Ｌａｂｅｌ１へ分岐
この結果、既に存在するアセンブリコードから冗長な分岐処理を削減することができ、Ｃ言語コードのコード数を削減できる。
【符号の説明】
【００６３】
１００、９００、１３００：アセンブリコード変換装置
１１０：ニーモニック識別部
１２０：レジスタ参照・更新命令解析部
１３０、１３１：ソースコード変換部
１４０：レジスタ更新コード削減部
１５０：命令変換ライブラリ
９１０：アドレス候補決定部
９２０：アドレス候補挿入部
１３１０：Ｉ／Ｏ制御コード抽出部
１３２０：Ｉ／Ｏ制御レジスタライブラリ
【図１】
2015197821.tif 000003
【図２】
2015197821.tif 000004
【図３】
2015197821.tif 000005
【図４】
2015197821.tif 000006
【図５】
2015197821.tif 000007
【図６】
2015197821.tif 000008
【図７】
2015197821.tif 000009
【図８】
2015197821.tif 000010
【図９】
2015197821.tif 000011
【図１０】
2015197821.tif 000012
【図１１】
2015197821.tif 000013
【図１２】
2015197821.tif 000014
【図１３】
2015197821.tif 000015
【図１４】
2015197821.tif 000016
【図１５】
2015197821.tif 000017
【図１６】
2015197821.tif 000018
【図１７】
2015197821.tif 000019
【図１８】
2015197821.tif 000020