(57)【要約】【課題】アセンブラソースプログラムに含まれる拡張マクロ命令を基本命令と拡張命令とに展開する際に、冗長な拡張命令を省略してプログラムステップ数を可及的に減らした最適な機械語プログラムに変換すること。【解決手段】アセンブラソースプログラムをプロセッサ５で実行可能な機械語プログラムに変換するアセンブラ装置１では、アセンブラソースプログラムに含まれる拡張マクロ命令（Ｘｌｄ命令及びＸｊｎｚ命令）を、基本命令（ｌｄ命令及びｊｎｚ命令）と拡張命令（ｅｘｔ命令）とに展開する。次いで、展開したｅｘｔ命令について、オペランドの数値データを判断して冗長な命令を省略するｅｘｔ命令の最適化を行い、このｅｘｔ命令の最適化によってラベルのアドレスが変更された場合、再度、ｅｘｔ命令の最適化を行う。【選択図】図１
2009134523.tif 000002
【特許請求の範囲】
【請求項１】
アセンブリ言語で記述されたアセンブラソースプログラムを機械語プログラムに変換するコンパイラ装置であって、
前記アセンブラソースプログラムに記述されている命令のうち、基本命令とオペランドのビット数の拡張指示命令とを併合した拡張マクロ命令を検出する検出部と、
前記検出された拡張マクロ命令を、該当する基本命令と当該基本命令のオペランドのビット数を拡張する所定数の拡張指示命令とに展開する展開部と、
前記展開部により展開された後のプログラムに記述されている各命令行のアドレスを算出し、当該プログラムに記述されている命令のうちのジャンプ命令のジャンプ先アドレスを算出するジャンプ先アドレス算出部と、
前記展開部により展開された拡張指示命令であって、前記算出されたジャンプ先アドレスをオペランドとして示すためのビット数を拡張する拡張指示命令のうち、冗長な拡張指示命令を判別して省略する最適化処理を行う最適化処理部と、
前記最適化処理部による最適化処理が行われた後のプログラムに記述されている各命令行のアドレスを算出し、当該プログラムに記述されている命令のうちのジャンプ命令のジャンプ先のアドレスを再算出するジャンプ先アドレス再算出部と、
を備えたコンパイラ装置。
【請求項２】
前記展開部が、前記検出された拡張マクロ命令を、該当する基本命令と、当該基本命令に予め定められている拡指示張命令の最大使用可能数の拡張指示命令とに展開する請求項１に記載のコンパイラ装置。
【請求項３】
前記最適化処理部による最適化処理と、前記ジャンプ先アドレス再算出部によるジャンプ先アドレスの再算出との一連の処理を繰り返し実行する請求項１又は２に記載のコンパイラ装置。
【請求項４】
アセンブリ言語で記述されたアセンブラソースプログラムを機械語プログラムに変換するコンパイラ方法であって、
前記アセンブラソースプログラムに記述されている命令のうち、基本命令とオペランドのビット数の拡張指示命令とを併合した拡張マクロ命令を検出することと、
前記検出された拡張マクロ命令を、該当する基本命令と当該基本命令のオペランドのビット数を拡張する所定数の拡張指示命令とに展開することと、
前記展開された後のプログラムに記述されている各命令行のアドレスを算出し、当該プログラムに記述されている命令のうちのジャンプ命令のジャンプ先アドレスを算出することと、
前記展開された拡張指示命令であって、前記算出されたジャンプ先アドレスをオペランドとして示すためのビット数を拡張する拡張指示命令のうち、冗長な拡張指示命令を判別して省略する最適化処理を行うことと、
前記最適化処理が行われた後のプログラムに記述されている各命令行のアドレスを算出し、当該プログラムに記述されている命令のうちのジャンプ命令のジャンプ先アドレスを再算出することと、
を含むコンパイラ方法。
【請求項５】
前記展開は、前記検出された拡張マクロ命令を、該当する基本命令と、当該基本命令に予め定められている拡指示張命令の最大使用可能数の拡張指示命令とに展開することである請求項４に記載のコンパイラ方法。
【請求項６】
前記最適化処理と前記ジャンプ先アドレスの再算出との一連の処理を繰り返し実行する請求項４又は５に記載のコンパイラ方法。
【請求項７】
請求項４〜６の何れか一項に記載のコンパイラ方法をプログラム実行可能なプロセッサに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アセンブリ言語で記述されたアセンブラソースプログラムを機械語プログラムに変換するコンパイラ装置及びコンパイラ方法に関する。
【背景技術】
【０００２】
特許文献１には、アセンブラ言語で記述（コーディング）されたアセンブラソースプログラムを、特定のプロセッサが実行可能な機械語プログラムに変換するアセンブラ（コンパイラ）の技術が開始されている。この特許文献１によれば、アセンブラによって、アセンブラソースプログラム中に含まれる拡張マクロ命令は、該当する基本命令と拡張指示命令とに変換される。具体的には、ｌｄ命令（ロード命令）を拡張したＸｌｄ命令（拡張ロード命令）については、ｌｄ命令に１〜３つのｅｘｔ命令（拡張指示命令）を組み合わせることで、扱える即値データのビット数が拡張される。また、このアセンブラでは、アセンブラソースコード中のＸｌｄ命令が、基本命令であるｌｄ命令と拡張命令である１〜３つのｅｘｔ命令とに展開されるが、シンボルを介してメモリアクセスを行うＸｌｄ命令の場合、シンボルアドレス定義ファイルに記述されたシンボルのアドレスのビット数から必要なｅｘｔ命令の数が判断されて展開される。
【特許文献１】特開平１０−３１２２９２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００３】
しかしながら、ロード命令以外の命令についても拡張命令を使用したいという要求がある。例えば、ジャンプ命令を拡張した拡張マクロ命令である拡張ジャンプ命令を使用する場合、上述の特許文献１の技術をそのまま適用することができず、冗長な拡張命令に展開せざるを得ない場合がある。ジャンプ先のラベルがプログラム後方の位置に定められている場合を想定すると理解できる。すなわち、全ての拡張マクロ命令は基本命令と１以上の拡張命令とに展開される。このため、ジャンプ命令の位置とジャンプ先の位置との間に他の拡張マクロ命令が含まれていると、展開時点ではジャンプ先のアドレスが確定せず、冗長な拡張指示命令に展開せざるを得ない。
【０００４】
本発明は、上記事情に鑑みてなされたものであり、アセンブラソースプログラムに含まれる拡張マクロ命令を基本命令と拡張命令とに展開する際に、冗長な拡張命令を省略してプログラムステップ数を可及的に減らした最適な機械語プログラムに変換することを目的としている。
【課題を解決するための手段】
【０００５】
上記課題を解決するための第１の発明は、アセンブリ言語で記述されたアセンブラソースプログラムを機械語プログラムに変換するコンパイラ装置であって、前記アセンブラソースプログラムに記述されている命令のうち、基本命令とオペランドのビット数の拡張指示命令とを併合した拡張マクロ命令を検出する検出部と、前記検出された拡張マクロ命令を、該当する基本命令と当該基本命令のオペランドのビット数を拡張する所定数の拡張指示命令とに展開する展開部と、前記展開部により展開された後のプログラムに記述されている各命令行のアドレスを算出し、当該プログラムに記述されている命令のうちのジャンプ命令のジャンプ先アドレスを算出するジャンプ先アドレス算出部と、前記展開部により展開された拡張指示命令であって、前記算出されたジャンプ先アドレスをオペランドとして示すためのビット数を拡張する拡張指示命令のうち、冗長な拡張指示命令を判別して省略する最適化処理を行う最適化処理部と、前記最適化処理部による最適化処理が行われた後のプログラムに記述されている各命令行のアドレスを算出し、当該プログラムに記述されている命令のうちのジャンプ命令のジャンプ先のアドレスを再算出するジャンプ先アドレス再算出部とを備えたコンパイラ装置である。
【０００６】
また、第４の発明は、アセンブリ言語で記述されたアセンブラソースプログラムを機械語プログラムに変換するコンパイラ方法であって、前記アセンブラソースプログラムに記述されている命令のうち、基本命令とオペランドのビット数の拡張指示命令とを併合した拡張マクロ命令を検出することと、前記検出された拡張マクロ命令を、該当する基本命令と当該基本命令のオペランドのビット数を拡張する所定数の拡張指示命令とに展開することと、前記展開された後のプログラムに記述されている各命令行のアドレスを算出し、当該プログラムに記述されている命令のうちのジャンプ命令のジャンプ先アドレスを算出することと、前記展開された拡張指示命令であって、前記算出されたジャンプ先アドレスをオペランドとして示すためのビット数を拡張する拡張指示命令のうち、冗長な拡張指示命令を判別して省略する最適化処理を行うことと、前記最適化処理が行われた後のプログラムに記述されている各命令行のアドレスを算出し、当該プログラムに記述されている命令のうちのジャンプ命令のジャンプ先アドレスを再算出することとを含むコンパイラ方法である。
【０００７】
この第１又は第４の発明によれば、アセンブラソースプログラムを機械語プログラムに変換するコンパイラにおいて、アセンブラソースプログラムに記述されている拡張マクロ命令が基本命令と拡張指示命令とに展開され、この展開された後のプログラムに記述されている命令のうちのジャンプ命令のジャンプ先アドレスが算出される。そして、展開された拡張指示命令であって、ジャンプ命令のジャンプ先アドレスをオペランドして示すためのビット数を拡張する拡張指示命令のうち、冗長な拡張指示命令を判別して省略する最適化処理が行われる。つまり、例えばジャンプ命令を拡張指示命令で拡張する拡張マクロ命令を展開する場合、展開時点では、このジャンプ命令のジャンプ先アドレスが確定しないために冗長な拡張指示命令に展開したとしても、その後に最適化処理を行うことで、展開された拡張指示命令の数は、最終的には必要な最小数となる。これにより、アセンブラソースプログラムに含まれる拡張マクロ命令を冗長な命令に展開することなく、変換後の機械語プログラムの最適化を図ることが可能となる。
【０００８】
第２の発明は、第１の発明のコンパイラ装置であって、前記展開部が、前記検出された拡張マクロ命令を、該当する基本命令と、当該基本命令に予め定められている拡指示張命令の最大使用可能数の拡張指示命令とに展開するコンパイラ装置である。
【０００９】
また、第５の発明は、第４の発明のコンパイラ方法であって、前記展開は、前記検出された拡張マクロ命令を、該当する基本命令と、当該基本命令に予め定められている拡指示張命令の最大使用可能数の拡張指示命令とに展開することであるコンパイラ方法である。
【００１０】
この第２又は第５の発明によれば、拡張マクロ命令は、該当する基本命令とこの基本命令に予め定められている拡張指示命令の最大使用可能数の拡張子指示命令とに展開される。このように、拡張マクロ命令の展開時には最大数の拡張指示命令に展開することで、拡張指示命令の数が足りなくなるといった不具合を発生させることが無い。
【００１１】
第３の発明は、前記最適化処理部による最適化処理と、前記ジャンプ先アドレス再算出部によるジャンプ先アドレスの再算出との一連の処理を繰り返し実行するコンパイラ装置である。
【００１２】
また、第６の発明は、第４又は第５の発明のコンパイラ方法であって、前記最適化処理と前記ジャンプ先アドレスの再算出との一連の処理を繰り返し実行するコンパイラ方法である。
【００１３】
この第３又は第６の発明によれば、冗長な拡張指示命令を省略する最適化処理と、ジャンプ命令のジャンプ先アドレスの再算出との一連の処理が、繰り返し実行される。最適化処理によって冗長な拡張指示命令が省略されることで、それ以降の命令のアドレスが変更され、その結果、ジャンプ命令のジャンプ先アドレスが変更されることがあるが、再度最適化処理を行うことで、変換後の機械語プログラムの更なる最適化が図れる。
【００１４】
第７の発明は、第４〜第６の何れかの発明のコンパイラ方法をプログラム実行可能なプロセッサに実行させるためのプログラムである。
【００１５】
この第７の発明によれば、このプログラムに従った演算処理をコンピュータに実行させることで、第４〜第６の何れかの発明と同様の効果を奏することができる。
【発明を実施するための最良の形態】
【００１６】
［構成］
図１は、本実施形態におけるアセンブラ装置（コンパイラ装置）１の構成を示す図である。同図によれば、アセンブラ装置１は、例えば汎用コンピュータによって実現され、処理部１０と、記憶部２０と、入力部３０と、表示部４０とを備えて構成される。このアセンブラ装置１は、アセンブリ言語でコーディング（記述）されたソースプログラムを、プログラマブルシーケンサ（Programmable Sequencer）の一種であるプロセッサ５で実行可能な機械語プログラムに変換するアセンブラとして機能する。
【００１７】
プロセッサ５は、１６Ｋバイトのプログラム領域と６４Ｋバイトのデータ領域とを有する８ビットのマイクロプロセッサであり、アセンブラ装置１によって生成された機械語プログラムに従った処理を実行する。つまり、プロセッサ５は８ビットのマイクロプロセッサであるので、アセンブラ装置１は、プロセッサ５が実行可能な８ビット固定長の機械語コードで構成される機械語プログラムを生成する。
【００１８】
また、本実施形態のアセンブラでは、基本命令に対する命令の拡張機能を有している。すなわち、基本命令に拡張命令（拡張指示命令）を組み合わせることで、基本命令のオペランドの数値データのビット数を拡張（増加）することができる。そして、基本命令と拡張命令との組合せは、１つの拡張マクロ命令で記述される。本実施形態では、拡張マクロ命令として、ｌｄ命令（ロード命令）に拡張命令であるｅｘｔ命令を組み合わせて命令拡張した「Ｘｌｄ命令」のほかに、ジャンプ命令についても拡張マクロ命令を使用可能である。但し、以下では、説明の簡明化のために、ジャンプ命令の一例としてｊｎｚ命令にｅｘｔ命令を組み合わせて命令拡張した「Ｘｊｎｚ命令」を取り挙げて説明する。基本命令には１又は複数の拡張命令を組み合わせることができ、この組み合わせることができる拡張命令の数は、基本命令の種類によって定められている。本実施形態では、ｌｄ命令及びｊｎｚ命令ともに、最大３個のｅｘｔ命令を組み合わせることができる。
【００１９】
また、拡張命令で拡張可能な数値データのビット数（ビットインデックス）は、次のように定められている。図２は、拡張命令で拡張可能なビットインデックスを示す図である。同図（ａ）は、ｌｄ命令の場合を示している。ｌｄ命令には、最大３つのｅｘｔ命令（１）〜（３）を組み合わせることができる。なお、アセンブラソースプログラムにおいて、これらの命令は、「ｅｘｔ命令（３）」、「ｅｘｔ命令（２）」、「ｅｘｔ命令（１）」、「ｌｄ命令」の順に続けて記述する。ｌｄ命令では、オペランドに３ビット幅の数値データを指定可能に定められており、この数値データの０〜２ビット目（下位３ビット）を指定する。そして、ｅｘｔ命令（１）では、この数値データの３〜７ビット目を指定し、ｅｘｔ命令（２）では、８〜１２ビット目を指定し、ｅｘｔ命令（３）では、１３〜１５ビット目（上位３ビット）を指定する。これにより、ｌｄ命令では、ｅｘｔ命令を組み合わせることで、最大１６ビットの数値データを扱うことができる。
【００２０】
また、同図（ｂ）は、ｊｎｚ命令の場合を示している、ｊｎｚ命令には、最大３つのｅｘｔ命令（１）〜（３）を組み合わせることができる。なお、アセンブラソースプログラムにおいて、これらの命令は、「ｅｘｔ命令（３）」、「ｅｘｔ命令（２）」、「ｅｘｔ命令（１）」、「ｊｎｚ命令」の順に続けて記述する。ｊｎｚ命令では、オペランドに３ビット幅の数値データを指定可能に定められており、この数値データの０〜２ビット目（下位３ビット）を指定する。そして、ｅｘｔ命令（１）では、この数値データの３〜７ビット目を指定し、ｅｘｔ命令（２）では、８〜１２ビット目を指定し、ｅｘｔ命令（３）では、１３ビット目（上位１ビット）を指定する。これにより、ｊｎｚ命令では、ｅｘｔ命令を組み合わせることで、最大１４ビットの数値データを扱うことができる。ここで、１４ビットであるのは、ジャンプ命令のオペランドは、プログラム中のジャンプ先の位置すなわちプログラム領域上のメモリアドレスを示すものであり、プログラム領域が１６Ｋバイトであるのでプログラム中の命令コードに割り当てられるメモリアドレスが最大１４ビットで表現されるためである。
【００２１】
なお、ｊｎｚ命令には、オペランドにジャンプ先として相対アドレスを指定する。つまり、ｊｎｚ命令の位置から後方の位置にジャンプする場合には正の数が、先方の位置にジャンプする場合には負の数が、それぞれオペランドに指定される。負の数は２の補数で表現され、最上位ビットが符号ビットとなる。
【００２２】
図１において、処理部１０は、例えばマイクロプロセッサやＡＳＩＣ等によって実現され、記憶部２０に記憶されているプログラムやデータ等に基づき各種の演算処理を実行してアセンブラ装置１の全体制御を行う。本実施形態では、アセンブラプログラム２１を実行することで、アセンブリ言語で記述されたアセンブラソースプログラムをプロセッサ５で実行可能な機械語プログラムに変換するアセンブラ処理を実行する。ここで、アセンブラソースプログラムはソースファイル２２に格納されており、生成された機械語プログラムは、データファイル２３に格納される。
【００２３】
具体的には、処理部１０は、先ず、ソースファイル２２のアセンブラソースプログラムに対する入力データ解析処理を行う。入力データ解析処理では、アセンブラソースプログラムの各行について、種別（コメント（空白）やラベル、制御命令等）を判断し、制御命令行については、プログラムの先頭から順に連続するアドレス（メモリアドレス）を割り当てる。ここで判断した各行の種別やアドレス等のデータは、ライン情報テーブル２４に格納される。ライン情報テーブル２４は、ソースファイル２２のアセンブラソースプログラムを構成する各行（ライン）についてのデータであり、行毎に、種別やアドレス、オペコード、オペランド、変換後の機械語コード等を対応付けて格納している。更に、ラベル行については、ラベル毎に名称（ラベル名）やアドレス等のデータがラベル情報テーブル２５に格納される。ラベル情報テーブル２５は、ソースファイル２２のアセンブラソースプログラムに含まれるラベルについてのデータであり、ラベル毎に、名称やアドレス等を対応付けて格納している。
【００２４】
入力データ解析処理を行うと、処理部１０は、続いて、アセンブラソースプログラムに対する中間コード生成処理を行う。中間コード生成処理では、アセンブラソースプログラム中の拡張マクロ命令を検出し、検出した拡張マクロ命令を、該当する基本命令と拡張命令（ｅｘｔ命令）とに展開する。具体的には、Ｘｌｄ命令については、図２に示したビットインデックスに従って、基本命令であるｌｄ命令と、Ｘｌｄ命令のオペランドに指定される数値データのビット数に応じた数のｅｘｔ命令（１）〜（３）とに展開する。
【００２５】
図３に、Ｘｌｄ命令の展開の一例を示す。同図（ａ）において、このＸｌｄ命令は、ラベル「Ｄａｔａ＿ｓｒｃ」のアドレスの「０〜７ビット目」（８ビットの数値データ）をレジスタ「ｉ０」にロードする命令である。この場合、Ｘｌｄ命令は、ｌｄ命令と１つのｅｘｔ命令（１）とに展開される。ｌｄ命令では、オペランドにラベル「Ｄａｔａ＿ｓｒｃ」のアドレスの０〜２ビット目（下位３ビット）を指定し、ｅｘｔ命令（１）では、３〜７ビット目（上位５ビット）を指定する。
【００２６】
また、同図（ｂ）において、このＸｌｄ命令は、ラベル「Ｄａｔａ＿ｓｒｃ」のアドレスの「８〜１５ビット目」（８ビットの数値データ）をレジスタ「ａ０」にロードする命令である。この場合、Ｘｌｄ命令は、ｌｄ命令と２つのｅｘｔ命令（１），（２）とに展開される。なお、ｌｄ命令のオペランドに指定されるレジスタ「ｄ０」はダミーレジスタであり、プロセッサ５での実行時には無視される。そして、ｅｘｔ命令（１）では、オペランドに、ラベル「Ｄａｔａ＿ｓｒｃ」のアドレスの８〜１２ビット目（下位５ビット）を指定し、ｅｘｔ命令（２）では１３〜１５ビット目（上位３ビット）を指定する。
【００２７】
また、Ｘｊｎｚ命令については、図２に示したビットインデックスに従って、基本命令であるｊｎｚ命令と、最大数である３つのｅｘｔ命令（１）〜（３）とに展開する。ここで最大数（３つ）のｅｘｔ命令（１）〜（３）に展開するのは、ジャンプ先をラベルで指定する場合、展開時点では、このラベルのアドレスが必ずしも確定していないためである。
【００２８】
図４に、Ｘｊｎｚ命令の展開の一例を示す。同図において、Ｘｊｎｚ命令は、ゼロフラグがＯＮでない場合にはラベル「Ｌｏｏｐ」の位置（アドレス）へジャンプする命令である。このＸｊｎｚ命令は、ｊｎｚ命令と３つのｅｘｔ命令（１）〜（３）とに展開される。ｊｚｎ命令では、オペランドに、ラベル「Ｌｏｏｐ」のアドレスの０〜２ビット目（下位３ビット）を指定する。そして、ｅｘｔ命令（１）では３〜７ビット目を指定し、ｅｘｔ命令（２）では８〜１２ビット目を指定し、ｅｘｔ命令（３）では１３ビット目（上位１ビット）を指定する。
【００２９】
アセンブラソースプログラム中の拡張マクロ命令を展開すると、処理部１０は、各制御命令を機械語コード（命令コード）に変換するとともに、制御命令へのメモリアドレスの再割り当てを行い、ライン情報テーブル２４を更新する。また、プログラム中の各ラベルのアドレスを再算出し、ラベル情報テーブル２５を更新する。
【００３０】
中間コード生成処理を行うと、処理部１０は、続いてｅｘｔ最適化処理を行う。ｅｘｔ最適化処理では、アセンブラソースプログラム中の拡張マクロ命令を展開した拡張命令（ｅｘｔ命令）のうち、冗長なｅｘｔ命令を省略する。例えば、図３において、ラベル「Ｄａｔａ＿ｓｒｃ」のアドレスが１６進数表記で「０ｘ１０００」とする。この場合、同図（ａ）において、ラベル「Ｄａｔａ＿ｓｒｃ」の３〜７ビット目は２進数表記で「０ｂ０００００」である。つまり、ｅｘｔ命令（１）は即値「０」の拡張であり、冗長であるとして省略される。また、同図（ｂ）では、Ｄａｔａ＿ｓｒｃの１５〜１３ビット目は２進数表記で「０ｂ０００」である。つまり、ｅｘｔ命令（１）は即値「０」の拡張であり、冗長であるとして省略される。また、Ｄａｔａ＿ｓｒｃの８〜１２ビット目は「０ｂ１００００」であるため、ｅｘｔ命令（２）は省略されない。
【００３１】
ｅｘｔ命令の省略（最適化）を行うと、処理部１０は、制御命令へのメモリアドレスの再割り当てを行い、ライン情報テーブル２４を更新する。また、プログラム中のラベルのアドレスを再算出して、ラベル情報テーブル２５を更新する。
【００３２】
次いで、ｅｘｔ命令の最適化によって、拡張マクロ命令のオペランドに指定されているラベルのアドレスが変更されたかを判断し、アドレスが変更されたラベルが有るならば、再度、ｅｘｔ命令の最適化を行う。なお、このｅｘｔ命令の最適化を行う最大回数は、所定回数（例えば、５回）に定められている。
【００３３】
以上の処理を行うと、ライン情報テーブル２４に格納されている、アセンブラソースプログラムの各制御命令を変換した機械語コードから構成される機械語プログラムが、アセンブラ結果としてデータファイル２３に格納される。このデータファイル２３は、例えばＩＣメモリや光学ディスク等の情報記憶媒体に記録され、プロセッサ５において読み込まれることで実行される。
【００３４】
図１に戻り、記憶部２０は、例えばＲＯＭやＲＡＭ等のＩＣメモリ、ハードディスク等の磁気ディスク、光学ディスク等によって実現され、処理部１０がアセンブラ装置１を統合的に制御するための諸機能を実現するためのシステムプログラムや、アセンブラとして機能させるための各種プログラムやデータを記憶するとともに、処理部１０の作業領域として用いられる。本実施形態では、プログラムとして、アセンブラ装置１をアセンブラとして機能させるためのアセンブラプログラム２１を記憶し、データとして、ソースファイル２２と、データファイル２３と、ライン情報テーブル２４と、ラベル情報テーブル２５とを記憶する。
【００３５】
［処理の流れ］
図５は、アセンブラ処理の流れを説明するためのフローチャートである。この処理は、処理部１０がアセンブラプログラム２１を実行することで実現される。同図によれば、処理部１０は、先ず、ソースファイル２２に格納されているアセンブラソースプログラムに対する入力データ解析処理を行う（ステップＳ１）。入力データ解析処理では、アセンブラソースプログラムの先頭から順に１行分の文字列を読み込み、読み込んだ行の種別（コメントや制御命令、ラベル等）を判断し、制御命令については、プログラムの先頭から順にメモリアドレスを割り当てる。そして、各行について、種別やアドレス等を対応付けてライン情報テーブル２４に格納する。また、ラベル行については、その名称（ラベル名）とアドレス等を対応付けて、ラベル情報テーブル２５に格納する。
【００３６】
次いで、処理部１０は、中間コード生成処理を行う。中間コード生成処理では、アセンブラソースプログラムから１行分の文字列を読み込み（ステップＳ３）、当該行が最終行でないならば（ステップＳ５：ＮＯ）、制御命令行であるかを判断する。制御命令行ならば（ステップＳ７：ＹＥＳ）、更に、当該行が拡張マクロ命令であるかを判断し、拡張マクロ命令ならば（ステップＳ９：ＹＥＳ）、この拡張マクロ命令を、該当する基本命令（ｌｄ命令或いはｊｎｚ命令）と拡張命令（ｅｘｔ命令）とに展開する（ステップＳ１１）。このとき、Ｘｌｄ命令ならば、ｌｄ命令と、Ｘｌｄ命令のオペランドに指定される数値データのビット数に応じた数のｅｘｔ命令とに展開し、Ｘｊｎｚ命令ならば、ｊｎｚ命令と、最大数である３つのｅｘｔ命令とに展開する。そして、展開した各制御命令を機械語コード（命令コード）に変換するとともに（ステップＳ１３）、メモリアドレスの再割り当てを行い（ステップＳ１５）、ライン情報テーブル２４及びラベル情報テーブル２５を更新する。
【００３７】
一方、拡張マクロ命令でないならば（ステップＳ９：ＮＯ）、当該行の制御命令を機械語コードに変換するとともに（ステップＳ１３）、メモリアドレスの再割り当てを行い（ステップＳ１５）、ライン情報テーブル２４及びラベル情報テーブル２５を更新する。その後、ステップＳ３に戻り、アセンブラソースプログラムから次の１行分の文字列を読み込んで、同様の処理を行う。そして、読み込んだ行が最終行ならば（ステップＳ５：ＹＥＳ）、続いて、ｅｘｔ最適化処理を行う。
【００３８】
ｅｘｔ最適化処理では、アセンブラソースプログラム中の拡張マクロ命令を展開した拡張命令（ｅｘｔ命令）のうち、冗長な拡張命令を省略するｅｘｔ命令の最適化を行う（ステップＳ１７）。このｅｘｔ命令の最適化は、上述したように「０」を拡張するｅｘｔ命令を冗長であるとして省略する処理である。すなわち、オペランドに指定される数値データが正の数（すなわち、符合ビットが「０」）ならば全てのビットが「０」であるｅｘｔ命令を省略し、負の数（すなわち、符号ビットが「１」）ならば全てのビットが「１」であるｅｘｔ命令を省略する。そして、ｅｘｔ命令の最適化による制御命令の減少に応じて、再度、制御命令へのアドレスの割り当てを行い（ステップＳ１９）、ライン情報テーブル２４及びラベル情報テーブル２５を更新する。
【００３９】
その結果、拡張マクロ命令のオペランドに指定されたラベルのアドレスが変更されたかを判断し、変更されたラベルがあるならば（ステップＳ２１：ＹＥＳ）、ここまでのｅｘｔ命令の最適化を行った回数（実施回数）を所定回数（例えば、５回）と比較する。そして、実施回数が所定回数未満ならば（ステップＳ２３：ＮＯ）、ステップＳ１７に戻り、再度、ｅｘｔ命令の最適化を行う。
【００４０】
一方、実施回数が所定回数以上ならば（ステップＳ２３：ＹＥＳ）、ライン情報テーブル２４を参照し、アセンブラソースプログラムの各制御命令を変換した機械語コードから構成される機械語プログラムをアセンブラ結果としてデータファイル２３に格納した後（ステップＳ２５）、アセンブラ処理を終了する。
【００４１】
［適用例］
図６は、拡張マクロ命令を使用したアセンブラソースプログラムの一例である。同図において、プログラムの左側には、各行の行番号を示している。このアセンブラソースプログラムの処理内容は、ラベル「Ｄａｔａ＿ｓｒｃ」が示すメモリ領域に格納されているデータを、ラベル「Ｄａｔａ＿ｄｓｔ」が示すメモリ領域にコピーするものである。
【００４２】
同図において、アセンブラソースプログラム中の拡張マクロ命令を展開すると、次のようになる。すなわち、６行目の拡張マクロ命令「Ｘｌｄ命令」は、ラベル「Ｄａｔａ＿ｓｒｃ」のアドレスの８〜１５ビット目（８ビットデータ）をレジスタ「ａ０」にロードする命令であり、基本命令であるｌｄ命令と、拡張命令である２つのｅｘｔ命令（Ａ１），（Ａ２）とに展開される。なお、展開後のｌｄ命令のオペランドのレジスタ「ｄ０」は、ダミーレジスタである。そして、ｅｘｔ命令（Ａ１）は、ラベル「Ｄａｔａ＿ｓｒｃ」の８〜１２ビット目（下位５ビット）を拡張し、ｅｘｔ命令（Ａ２）は、１３〜１５ビット目（上位３ビット）を拡張する。
【００４３】
また、７行目の拡張マクロ命令「Ｘｌｄ命令」は、ラベル「Ｄａｔａ＿ｓｒｃ」のアドレスの０〜７ビット目（８ビットデータ）をレジスタ「ｉ０」にロードする命令であり、ｌｄ命令と１つのｅｘｔ命令（Ｂ１）とに展開される。
【００４４】
また、１０行目の拡張マクロ命令「Ｘｌｄ命令」は、ラベル「Ｄａｔａ＿ｄｓｔ」のアドレスの８〜１５ビット目（８ビットデータ）をレジスタ「ａ１」にロードする命令であり、ｌｄ命令と２つのｅｘｔ命令（Ｃ１），（Ｃ２）とに展開される。
【００４５】
また、１１行目の拡張マクロ命令「Ｘｌｄ命令」は、ラベルＤａｔａ＿ｄｓｔ」のアドレスの０〜７ビット目（８ビットデータ）をレジスタ「ｉ１」にロードする命令であり、ｌｄ命令と１つのｅｘｔ命令（Ｄ１）とに展開される。
【００４６】
また、１３行目の拡張マクロ命令「Ｘｌｄ命令」は、即値「１６」をレジスタ「ｄ０」にロードする命令であり、即値「１６」は２進数表記で「０ｂ１００００」の５ビットのデータであるので、ｌｄ命令と１つのｅｘｔ命令（Ｅ１）とに展開される。
【００４７】
また、２１行目の拡張マクロ命令「Ｘｊｎｚ命令」は、直前のレジスタ「ｄ０」の格納値「０」でないならば、ラベル「Ｌｏｏｐ」の位置（１４行目）にジャンプする命令であり、ｊｎｚ命令と、最大数の３つのｅｘｔ命令（Ｆ１）〜（Ｆ３）とに展開される。
【００４８】
従って、図６に示すアセンブラプログラムは、拡張マクロ命令の展開によって、図７に示すプログラムに変換されることになる。同図では、不要なコメント行及び空白行を削除している。そして、左側に、各制御命令について、拡張マクロ命令の展開直後のアドレスと、ｅｘｔ命令の最適化を行った後のアドレスとを示している。
【００４９】
同図において、展開されたｅｘｔ命令の最適化を行うと、次のようになる。すなわち、ラベル「Ｄａｔａ＿ｓｒｃ」のアドレスは、１６進数表記で「０ｘ１０００」であり、これを２進数表記すると「０ｂ０００１００００００００００００」である。つまり、「Ｄａｔａ＿ｓｒｃ［１５：１３］」は２進数表記で「０ｂ０００」あり、ｅｘｔ命令（Ａ２）は、即値「０」の拡張命令となるため冗長な命令として省略される、また、「Ｄａｔａ＿ｓｒｃ［１２：８］」は２進数表記で「０ｂ１００００」であるため、ｅｘｔ命令（Ａ１）は省略されない。従って、ｅｘｔ命令の最適化によって、アセンブラソースプログラムの６行目のＸｌｄ命令は、ｌｄ命令と１つのｅｘｔ命令（Ａ１）とに展開されることになる。
【００５０】
また、「Ｄａｔａ＿ｓｒｃ［７：３］」は２進数表記で「０ｂ０００００」であり、ｅｘｔ命令（Ｂ１）は、即値「０」の拡張命令となるため冗長な命令として省略される。従って、ｅｘｔ命令の最適化によって、アセンブラソースプログラムの７行目のＸｌｄ命令は、ｌｄ命令のみに展開されることになる。
【００５１】
また、ラベル「Ｄａｔａ＿ｄｓｔ」のアドレスは、１６進数表記で「０ｘ１０１０」であり、これを２進数表記すると「０ｂ０００１０００００００１００００」である。つまり、「Ｄａｔａ＿ｄｓｔ［１５：１３］」は２進数表記で「０ｂ０００」であり、ｅｘｔ命令（Ｃ２）は、即値「０」の拡張命令となるため冗長な命令として省略される。また、「Ｄａｔａ＿ｄｓｔ［１２：８］」は２進数表記で「０ｂ１００００」であるため、ｅｘｔ命令（Ｃ２）は省略されない。従って、ｅｘｔ命令の最適化によって、アセンブラソースプログラムの１０行目のＸｌｄ命令は、ｌｄ命令と１つのｅｘｔ命令（Ｃ１）とに展開されることになる。
【００５２】
また、「Ｄａｔａ＿ｄｓｔ［７：３］」は２進数表記で「０ｂ０００１０」であるため、ｅｘｔ命令（Ｄ１）は省略されない。従って、１１行目のＸｌｄ命令は、ｌｄ命令と１つのｅｘｔ命令（Ｄ１）とに展開されることになる。
【００５３】
また、ｅｘｔ命令（Ｅ１）は、該当する拡張マクロ命令「Ｘｌｄ命令」の展開時に最適な数のｅｘｔ命令に展開されているため、省略されない。
【００５４】
また、アセンブラソースプログラムの２１行目の拡張マクロ命令「Ｘｊｎｚ命令」を展開したｊｎｚ命令のアドレスは「０ｘ００１２」であり、ラベル「Ｌｏｏｐ」のアドレスは「０ｘ０００ｃ」である。つまり、このｊｎｚ命令を基準としたラベル「Ｌｏｏｐ」の相対アドレスは「−６」であり、この「−６」は、１６ビットの２の補数で「０ｂ１１１１１１１１１１１１１０１０」と表現される。すなわち、「Ｌｏｏｐ［１３］」は２進数表記で「０ｂ１」であり、ｅｘｔ命令（Ｆ３）は即値「−０」を拡張しているため、冗長な命令として省略される。また、「Ｌｏｏｐ［１２：８］」は２進数表記で「０ｂ１１１１１」であり、ｅｘｔ命令（Ｆ２）は即値「−０」を拡張しているため、冗長な命令として省略される。また、「Ｌｏｏｐ［７：３］は２進数表記で「０ｂ１１１１１」であるが、「−６」を２の補数表現するためには少なくとも４ビット必要であるため、ｅｘｔ命令（Ｆ１）は省略されない。従って、ｅｘｔ命令の最適化によって、このＸｊｎｚ命令は、ｊｎｚ命令と１つのｅｘｔ命令（Ｆ１）とに展開されることになる。
【００５５】
このようなｅｘｔ命令の最適化の結果、ラベル「Ｌｏｏｐ」のアドレスが「０ｘ０００ｃ」から「０ｘ０００９」に変更されている。このため、再度、このラベル「Ｌｏｏｐ」を含むｅｘｔ命令の最適化を行うと、次のようになる。すなわち、この変更後のアドレス「０ｘ０００９」の２進数表記すると「０ｂ００００１００１」である。そして、「Ｌｏｏｐ［７：３］」は２進数表記で「００００１」であるため、このラベル「Ｌｏｏｐ」をオペランドに含むｅｘｔ命令（Ｆ１）は省略されない。
【００５６】
［作用・効果］
このように、本実施形態によれば、アセンブラソースプログラムをプロセッサ５で実行可能な機械語プログラムに変換するアセンブラ装置１では、先ず、アセンブラソースプログラムに含まれる拡張マクロ命令（Ｘｌｄ命令及びＸｊｎｚ命令）を、基本命令（ｌｄ命令及びｊｎｚ命令）と拡張命令（ｅｘｔ命令）とに展開する。次いで、展開したｅｘｔ命令について、オペランドの数値データを判断して冗長な命令を省略するｅｘｔ命令の最適化を行い、このｅｘｔ命令の最適化によってラベルのアドレスが変更された場合、再度、ｅｘｔ命令の最適化を行う。これにより、例えば、Ｘｊｎｚ命令が、ジャンプ先として指定されたラベルの位置（アドレスが）が当該命令の展開時点において確定しないために冗長なｅｘｔ命令に展開された場合であっても、ｅｘｔ命令の最適化が行われるため、最終的には、展開されたｅｘｔ命令は必要な最小数となる。つまり、アセンブラソースプログラムに含まれる拡張マクロ命令を、該当する基本命令と必要最小数のｅｘｔ命令とに展開することができ、生成する機械語プログラムのサイズの最適化を図ることが可能となる。
【００５７】
なお、本発明の適用可能な実施形態は上述の実施形態に限定されることなく、本発明の趣旨を逸脱しない範囲で適宜変更可能なのは勿論である。
【図面の簡単な説明】
【００５８】
【図１】アセンブラ装置の内部構成図。
【図２】ｅｘｔ命令で拡張可能なビットインデックス。
【図３】拡張マクロ命令「Ｘｌｄ命令」の展開例。
【図４】拡張マクロ命令「Ｘｊｎｚ命令」の展開例。
【図５】アセンブラ処理のフローチャート。
【図６】拡張マクロ命令を含むアセンブラソースプログラムの一例。
【図７】図６のプログラムの拡張マクロ命令の展開後のプログラム。
【符号の説明】
【００５９】
１  アセンブラ装置、１０  処理部、２０  記憶部、２１  アセンブラプログラム、
２２  ソースファイル、２３  データファイル、２４  ライン情報テーブル、
２５  ラベル情報テーブル、５  プロセッサ
【図１】
2009134523.tif 000003
【図２】
2009134523.tif 000004
【図３】
2009134523.tif 000005
【図４】
2009134523.tif 000006
【図５】
2009134523.tif 000007
【図６】
2009134523.tif 000008
【図７】
2009134523.tif 000009