(57)【要約】【課題】メモリの記憶領域が固定長物理セグメントに分割されている中央処理装置向けのプログラム作成方法およびその装置を提供。【解決手段】ソースプログラムが記述されたソースファイル12を入力するとコンパイラ14は、一時レジスタを利用してデータのストアを命令する擬似命令「H_STORE R1, Array[R2], tenmporary:R0」を含むオブジェクトファイル16を生成し、リンカ22では、固定長物理空間の固有のアドレスを有するセグメント#1、#2を含むメモリ空間に展開する際に、データがセグメント境界を跨ぐか否かを判断し、跨ぐと判別した場合には、コンパイラ14が生成した擬似命令を、メモリ内の物理セグメントを更新するためのセグメントレジスタを更新してデータアクセスを実行する命令コードに自動的に展開する。【選択図】図１
2009211491.tif 000002
【特許請求の範囲】
【請求項１】
メモリが固定長の複数の物理セグメントに分割された中央処理装置向けのソースプログラムから実行イメージのプログラムを作成するプログラム作成方法において、該方法は、
連続データの要素へのアクセスを表す擬似命令を用意する工程と、
前記ソースプログラムをコンパイルして、該ソースプログラムの制御構造に対応する命令コードおよび前記擬似命令をオブジェクトコードとして出力する第１の処理工程と、
前記連続データが前記物理セグメントの境界を跨いで配置されるか否かを判断する判断工程と、
該判断工程にて、前記連続データが前記物理セグメントの境界を跨いで配置されると判断した場合に、アクセス先の前記セグメントを切り替える制御コードを前記オブジェクトコードに付加して、該オブジェクトコードを前記メモリの絶対アドレス空間にリンクする第２の処理工程とを含むことを特徴とするプログラム作成方法。
【請求項２】
請求項１に記載の方法において、前記第１の処理工程は、一時レジスタを利用する擬似命令を用意し、
前記第２の処理工程は、前記一時レジスタを利用して前記セグメントのアドレスを計算することを特徴とするプログラム作成方法。
【請求項３】
メモリが固定長の複数の物理セグメントに分割された中央処理装置向けのソースプログラムから実行イメージのプログラムを作成するプログラム作成装置において、該作成装置は、
前記ソースプログラムをコンパイルして、該ソースプログラムの制御構造に対応する命令コードと連続データの要素へのアクセスを表す擬似命令とをオブジェクトコードとして出力するコンパイラと、
前記連続データが前記物理セグメントの境界を跨いで配置されるか否かを判断し、前記連続データが前記物理セグメントの境界を跨いで配置されると判断した場合に、アクセス先の前記セグメントを切り替える制御コードを前記オブジェクトコードに付加して、該オブジェクトコードを前記メモリの絶対アドレス空間にリンクするリンカとを含むことを特徴とするプログラム作成装置。
【請求項４】
請求項３に記載の作成装置において、前記コンパイラは、一時レジスタを利用する擬似命令を用意し、
前記リンカは、前記一時レジスタを利用して前記セグメントのアドレスを計算することを特徴とするプログラム作成装置。
【請求項５】
メモリが固定長の複数の物理セグメントに分割された中央処理装置向けのソースプログラムから実行イメージのプログラムを作成するプログラム作成方法において、該方法は、
前記ソースプログラムをコンパイルして、該ソースプログラム中の処理の制御構造に対応する命令コードの先頭と末尾を表す擬似命令を含むオブジェクトコードを出力する第１の処理工程と、
前記命令コードが前記物理セグメントの境界を跨がないようにして該命令コードを配置し、前記制御構造の間にセグメントを切り替える分岐命令を挿入する第２の処理工程とを含むことを特徴とするプログラム作成方法。
【請求項６】
メモリが固定長の複数の物理セグメントに分割された中央処理装置向けのソースプログラムから実行イメージのプログラムを作成するプログラム作成装置において、該作成装置は、
前記ソースプログラムをコンパイルして、該ソースプログラム中の処理の制御構造に対応する命令コードの先頭と末尾を表す擬似命令を含むオブジェクトコードを出力するコンパイラと、
前記命令コードが前記物理セグメントの境界を跨がないようにして該命令コードを配置し、前記制御構造の間にセグメントを切り替える分岐命令を挿入するリンカとを含むことを特徴とするプログラム作成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、固定長物理セグメントに分割されたメモリを含む中央処理装置に組み込むプログラムを作成するプログラム作成方法およびその作成装置に関するものである。
【背景技術】
【０００２】
近年、メモリの記憶領域が固定長物理セグメントに分割されて配置されている中央処理装置（Central Processing Unit、以下、CPUと呼ぶ）が利用されている。このようなCPUにおいて、セグメントのベースアドレスからのオフセットを使って、データが配置されたセグメントからデータをロードしたり、データをストアしたりするなどのアクセスを行う。また、命令コードが配置されたセグメントからも、そのセグメントのベースアドレスからのオフセットを使って命令コードをロードし、その命令を実行する。全メモリ空間のアドレスは、セグメントを指定する値と、セグメント内のアドレスを指定する値とで指定する。
【０００３】
メモリに配置された連続データの各要素にアクセスする場合、その要素のアドレスは、連続データの先頭アドレスであるベースアドレスに要素のオフセット値を加算して生成される。ここで、一つの同じセグメント内に配置された連続データにアクセスする場合は、ベースアドレスと要素のオフセット値とを加算して生成されるアドレスはそのセグメント内のアドレスと同じアドレスであるので、データアクセスを行う際には、セグメントと生成したアドレスとの２つを指定することでデータアクセスが可能になる。
【０００４】
しかし、連続データが一つのセグメントを超えて複数のセグメントに配置されている場合は、ベースアドレスと要素のオフセット値とを加算して生成されるアドレスによっては、セグメントを切り替えてアクセスする必要がある。セグメントを切り替える際には切り替え専用の命令が必要になり、そのためにプログラムサイズが大きくなり、プログラムサイズの増大に伴ってプログラムの実行速度が低下する。
【０００５】
対象となる連続データのサイズが一つのセグメントのサイズより小さければ、連続データがセグメント境界を跨がないようにデータを配置し直すことにより、セグメントを切り替えることなく、セグメントと生成したアドレスとの２つを指定する命令でアクセスができる。しかし、連続データのサイズがセグメントのサイズを超える場合には、必ずセグメント境界を跨いで複数のセグメントにデータが配置されることになる。
【０００６】
メモリに連続して配置された命令コードをロードして実行する場合、命令コードのアドレスは、命令コードが配置されているセグメントとそのセグメントの先頭からのオフセット値とを加算して生成される。ロードされた命令が実行される毎にオフセット値が更新され次に実行される命令コードがロードされる。しかし、命令コードが２つのセグメントに跨って配置され、次にロードされる命令が別のセグメント内に配置されている場合は、セグメントを切り替える命令が必要になる。
【０００７】
連続した命令コードのサイズがセグメントのサイズより小さい場合は、連続した命令コードが２つのセグメントを跨がないようにメモリ配置を調整し直すことでこの問題を回避できるが、連続した命令コードのサイズが一つのセグメントのサイズを超える場合は、必ず２つのセグメントを跨ぐことになる。
【０００８】
連続したデータに対してアクセスする命令をソースプログラムから生成する場合、一般的に２つのコンパイラの動作方法がある。第１の方法は、コンパイル時には、どの連続データがセグメント境界を跨ぐか否かが分からないため、すべてのデータアクセスがセグメント境界を跨ぐことを前提としたコードをコンパイラが生成する。
【０００９】
第２の方法は、すべての連続データが一つのセグメント内に配置されることを前提として、コンパイラがデータアクセス命令をオブジェクトファイルに出力する。この場合、コンパイル後にセグメントを超えて配置される連続データがあった場合は、オブジェクトファイルのリンク時にエラーメッセージが出力される。プログラムの作成者、プログラマは、セグメント境界を跨いで連続データが配置される宣言をコンパイラに通知するための拡張キーワードを元のソースプログラムに付加し、再度ソースプログラムをコンパイルする。そしてコンパイラはそのキーワードが付加されたデータアクセスに対しては、セグメントを更新する命令を出力する。
【００１０】
連即した命令コードをソースプログラムから生成する場合は、コンパイル時には連続した命令コードの途中でセグメントを切り替える命令を挿入することはできない。そこで、コンパイラの動作としては、連続した命令コードは２つのセグメントを跨がないことを前提として命令コードを生成する。連続した命令コードが２つのセグメントを跨いで配置される場合は、オブジェクトファイルのリンク時にエラーメッセージが出力される。プログラマはそのエラーメッセージを元に、エラーの対象となった命令コードがセグメントを跨がないようにメモリ配置方法をリンカに設定する。連続した命令コードのサイズがセグメントより小さい場合は、メモリ配置を調整し直すことでこの問題を回避できるが、プログラマは、コンパイラが生成する連続した命令コードが１つのセグメント内に収まるようにソースプログラムを分割することになる。
【特許文献１】特開平５−１００８３９号公報
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかしながら、連続したデータに対してアクセスする命令をソースプログラムから生成する場合、上記第１の方法では、プログラマはデータメモリ空間がリニアであることを前提としたプログラミングが可能であるが、コンパイラはすべての連続したデータのアクセスにおいて、セグメントを更新する命令を出力するため、コード量が増加し、コードの実行速度も低下するという問題が発生する。
【００１２】
また、上記第２の方法では、セグメント境界を跨ぐことが分かっている連続データに対して、ソースプログラム上でそのデータの宣言に対してキーワードを指定することにより、そのデータアクセスに対してのみセグメントを更新する命令コードを生成してコード量の増加を最小限に抑えることができる。しかし、この方法では、プログラマはどのデータがセグメント境界を跨ぐか否かを調査するために、プログラムのコンパイル・リンク処理を繰り返し、セグメント境界を跨ぐ連続データに対するエラーメッセージを検出する必要があるという問題が発生する。さらに、ソースプログラム上のデータの宣言に対して付加するキーワードは、対象アーキテクチャ向けのコンパイラに固有のキーワードであるので、このためソースプログラムの移植性を損なうという問題が発生する。
【００１３】
連続した命令コードをソースプログラムから生成する場合も、プログラマは連続した命令コードがセグメント境界を跨ぐか否かを調査するために、プログラムのコンパイル・リンク処理を繰り返し、セグメント境界を跨いで配置された連続した命令コードに対するエラーメッセージを検出する必要があるという問題が発生する。さらに、連続した命令コードのサイズがセグメントのサイズを超える場合は、ソースプログラムを分割する必要があるのでソースプログラムの移植性を損なうという問題が発生する。
【００１４】
本発明はこのような課題に鑑み、メモリのセグメント境界の問題を解決し、固定長物理セグメントに分割されたメモリを含む中央処理装置に組み込むプログラムを作成するプログラム作成方法およびその装置を提供することを目的とする。
【課題を解決するための手段】
【００１５】
本発明は上述の課題を解決するために、メモリが固定長の複数の物理セグメントに分割された中央処理装置向けのソースプログラムから実行イメージのプログラムを作成するプログラム作成方法において、この方法は、連続データの要素へのアクセスを表す擬似命令を用意する工程と、ソースプログラムをコンパイルして、該ソースプログラムの制御構造に対応する命令コードおよび擬似命令をオブジェクトコードとして出力する第１の処理工程と、連続データが物理セグメントの境界を跨いで配置されるか否かを判断する判断工程と、判断工程にて、連続データ前記物理セグメントの境界を跨いで配置されると判断した場合に、アクセス先のセグメントを切り替える制御コードをオブジェクトコードに付加して、オブジェクトコードをメモリの絶対アドレス空間にリンクする第２の処理工程とを含むことを特徴とする。
【００１６】
また、本発明は上述の課題を解決するために、メモリが固定長の複数の物理セグメントに分割された中央処理装置向けのソースプログラムから実行イメージのプログラムを作成するプログラム作成装置において、この作成装置は、ソースプログラムをコンパイルして、ソースプログラムの制御構造に対応する命令コードと連続データの要素へのアクセスを表す擬似命令とをオブジェクトコードとして出力するコンパイラと、連続データが前記物理セグメントの境界を跨いで配置されるか否かを判断し、連続データが物理セグメントの境界を跨いで配置されると判断した場合に、アクセス先のセグメントを切り替える制御コードをオブジェクトコードに付加して、該オブジェクトコードをメモリの絶対アドレス空間にリンクするリンカとを含むことを特徴とする。
【００１７】
また、本発明は上述の課題を解決するために、メモリが固定長の複数の物理セグメントに分割された中央処理装置向けのソースプログラムから実行イメージのプログラムを作成するプログラム作成方法において、この方法は、ソースプログラムをコンパイルして、ソースプログラム中の処理の制御構造に対応する命令コードの先頭と末尾を表す擬似命令を含むオブジェクトコードを出力する第１の処理工程と、命令コードが前記物理セグメントの境界を跨がないようにして命令コードを配置し、制御構造の間にセグメントを切り替える分岐命令を挿入する第２の処理工程とを含むことを特徴とする。
【００１８】
また、本発明は上述の課題を解決するために、メモリが固定長の複数の物理セグメントに分割された中央処理装置向けのソースプログラムから実行イメージのプログラムを作成するプログラム作成装置において、この作成装置は、ソースプログラムをコンパイルして、ソースプログラム中の処理の制御構造に対応する命令コードの先頭と末尾を表す擬似命令を含むオブジェクトコードを出力するコンパイラと、命令コードが前記物理セグメントの境界を跨がないようにして命令コードを配置し、制御構造の間にセグメントを切り替える分岐命令を挿入するリンカとを含むことを特徴とする。
【発明の効果】
【００１９】
本発明によれば、前記ソースプログラムをコンパイルおよびリンクする処理により、メモリの複数の物理セグメントを跨がないようにオブジェクトコードを配置して実行イメージを作成することができる。
【００２０】
また、ソースプログラム中の処理の制御構造に対応する命令コードの先頭と末尾を表す擬似命令を含むオブジェクトコードを生成し、擬似命令をデータが配置されるセグメントに応じて適切な命令に展開するとともに、命令コードが物理セグメントの境界を跨がないようにして該命令コードを配置し、制御構造の間にセグメントを切り替える分岐命令を挿入して実行イメージを作成することができる。
【００２１】
このように、メモリのセグメント境界の問題を解決し、固定長物理セグメントに分割されたメモリを含む中央処理装置に組み込むプログラムを作成するプログラム作成方法およびその作成装置を提供することができる。
【発明を実施するための最良の形態】
【００２２】
次に添付図面を参照して本発明によるプログラミング方法およびその装置の実施例を詳細に説明する。図１を参照すると、本発明が適用されたプログラム作成装置の実施例が示されている。図示するようにプログラム作成装置10は、ソースプログラムが記述されたソースファイル12を入力してコンパイルするコンパイラ14と、コンパイラにより生成されるオブジェクトコード16を実行可能なイメージである実行プログラム18または20に変換するリンカ22とを含むコンピュータ処理装置にて形成されている。プログラム作成装置10は、生成した実行プログラム18または20を、たとえば図２に示すように複数のセグメント#1、#2を有するメモリ200を有する処理装置（図示せず）のメモリ空間に配置し、実行プログラム18または20はその処理装置にてアクセスされる。
【００２３】
図２に示したメモリ200のメモリ空間は、それぞれ固定長物理空間の固有のアドレス0x000〜0xFFFFを有するセグメント#1、#2を含む。セグメント#1は、i番目の要素を指定する際に、実行プログラムにおいてベースアドレス202と、ベースアドレスからのオフセット204とによりアドレスを指定することができる。また実行プログラムにおいて、セグメントレジスタにキャリを加算する命令を指示することにより、次のセグメントとしてセグメント#2を指定することができる。
【００２４】
図１に戻って本実施例におけるプログラム作成装置10は、連続するデータの要素に対するアクセスにおいて、実行プログラムのコード量をできるだけ削減するために、コンパイル後のオブジェクトファイル16のリンク処理において、連続データがセグメント境界を跨いでいるか否かを判別する機能をリンカ22に有している。
【００２５】
コンパイラ14は、ソースファイル12からオブジェクトコードが記述されたオブジェクトファイル16を生成する際に、一時レジスタを利用してデータのストアを命令するデータアクセス命令を擬似命令としてオブジェクトファイル16内に指示する。このような機能によりソースファイル12のソースコード上へ特別なキーワードを付加することなく実行プログラムを生成することができ、ソースプログラムの移植性を損なうことを防止する。
【００２６】
リンカ22は、対象のデータがセグメント境界を跨いでいると判別した場合には、コンパイラ14が生成した擬似命令を、データメモリ内のセグメントを更新するためのセグメントレジスタを更新してデータアクセスを実行する命令コードに自動的に展開する機能を有している。
【００２７】
本実施例におけるプログラム作成装置10の動作を説明する。まず、ソースファイル12をコンパイラ14に入力すると（S50）、コンパイラ14は、たとえば「要素Array[i]＝１;」が記述されたソースプログラムを命令コードに変換し、オブジェクトコードを生成する。ただしiは自然数である。この例では「MOV R1, 1」、「LOAD R2,i」および擬似命令である「H_STORE R1, Array[R2], tenmporary:R0」が記述されている（S52）。
【００２８】
ここで、コンパイラ14は、ソースプログラム中でアクセスされているすべての連続データが、メモリ200のメモリ空間のセグメント境界を跨いで配置されるか否かが分からないため、コンパイラ14は、連続データの要素へアクセスする命令の代わりに擬似命令を出力している。擬似命令「H_STORE R1, Array[R2], tenmporary:R0」は、Array＋R2(i)のアドレスにデータをストアする命令であり、一時レジスタとしてR0を指定している。
【００２９】
擬似命令のオペランドには、メモリ200上のデータからロードする値またはデータメモリ200上のデータへストアする値が格納されるレジスタ、データアクセスに使用するベースアドレス、オフセット値、さらに、連続データがメモリ200のセグメント境界を跨いでいた場合のアドレス計算のために一時的に使用するレジスタを指定することができる。
【００３０】
このようにしてコンパイラ14にて生成されたオブジェクトファイル16はリンカ22に渡される（S54）。リンカ22では、オブジェクトファイル16内のデータが、メモリ200のメモリ空間に配置され、その絶対アドレスが決定される。したがってリンカ22は、ソースプログラム中で宣言された連続データがセグメント境界を跨いでいるか否かを絶対アドレスに基づいて判断する。そこで、リンカ22は連続データの要素へ直接アクセスするのに使用されている擬似命令を以下に述べるような適切な命令に展開する。
【００３１】
Arrayがセグメント境界を跨いでいない場合には、連続データの要素に対してアクセスする擬似命令は、そのデータ要素が存在するセグメントの値に設定しデータアクセスする命令に展開して実行プログラム18を生成する（S56）。実行プログラム18では、Arrayのi番目の要素への代入（Array[i]＝１）に必要な命令として、擬似命令が展開されて「MOV R1, 1」、「LOAD R2, i」、Arrayのセグメントを設定する「MOV DSR, SEG(Array)」、ベースアドレスを設定する「MOV R0, BASE(Array)」、Array＋iのアドレスを計算する「ADD R0, R2」、データストアを指示する「STORE R1, Array[R2]」が記述される。なお「DSR」はデータアクセス用のセグメントレジスタとする。
【００３２】
「Array」がセグメント境界を跨いで配置される場合は、ベースアドレスとオフセットとを加算した値によってセグメントを更新してデータアクセスを実行する命令に展開して実行プログラム20を生成する（S58）。実行プログラム20では、「MOV R1, 1」、オフセットiを設定する「LOAD R2,i」、「Array」のセグメントを設定する「MOV DSR, SEG(Array)」、ベースアドレスを設定する「MOV R0, BASE(Array)」、Array＋iのアドレスを計算する「ADD R0, R2」、セグメントレジスタにキャリを加算し次のセグメントを指示する「ADDC DSR」、データストアを指示する「STORE R1, [R0]」記述される。なお、Array＋iのアドレスを計算する「ADD R0, R2」の際に、計算後のアドレスがセグメントを超えた場合にキャリをセットする。この場合は、データ要素のアドレス計算（Array＋i）に、一時レジスタが必要になるため、擬似命令で指定された一時レジスタ「R0」を使用している。
【００３３】
このようなコンパイラ14による擬似命令の出力が可能になるのは、データアクセス命令が、ソースプログラム上でデータを直接アクセスしている場合である。たとえばポインタなどを介して間接的にデータをアクセスしている等、ポインタの指し示すデータがセグメント境界を跨ぐか否かを判断できないことが分かっている場合には、コンパイラ14は、S52において擬似命令を出力せずに、ポインタの指し示すベースアドレスとオフセットとを加算した値によってセグメントを更新してデータアクセスする命令に展開する、通常の命令を出力する。
【００３４】
以上説明したように、ソースプログラムに特別なキーワードを指定するなどの変更を加える必要がなく、プログラマはリニアなデータメモリ空間を前提としたプログラミングを行うことが可能であるので、移植性の高いプログラムを作成することができる。さらに、コンパイラ14が出力するデータアクセス命令は擬似命令としておき、リンク時にデータに対するアクセスがセグメント境界を跨ぐか否かに応じてセグメントを切り替える命令の出力を制御することにより、セグメント境界を跨ぐデータを直接アクセスする処理において、生成されるコード量を削減することができる。
【００３５】
次に図４を参照して本発明が連続した命令コードを配置する場合に適用された他の実施例を説明する。本実施例におけるプログラム作成装置300は、図１に示した実施例と同様に、ソースプログラムが記述されたソースファイル302を入力してコンパイルするコンパイラ304と、コンパイラ304により生成されるオブジェクトファイル306を実行可能なイメージである実行プログラム308に変換するリンカ310とを含むコンピュータ処理装置にて形成されている。プログラム作成装置300は、生成した実行プログラム308を、たとえば複数のセグメント#1、#2を有するメモリ312のメモリ空間に配置する。
【００３６】
コンパイラ304は、ソースファイル302からオブジェクトコードを生成してオブジェクトファイル306をリンカ310に出力する。
【００３７】
リンカ310は、オブジェクトファイル内の命令コードがセグメント境界を跨ぐか否かを判別して、命令コードがセグメント境界を跨ぐことを判別すると、メモリ312のセグメント境界の前後に対応する位置で命令コードを分割し、セグメント境界の直前に次のセグメントへの分岐命令を挿入するリンク動作を行う。
【００３８】
通常、コンパイラが出力する命令コードは、条件分岐や、繰り返し処理などの論理的な制御構造を持っている。このような制御構造は、条件分岐処理の組み合わせで構成されるが、これらの分岐がセグメント境界を跨ぐ場合、分岐命令および分岐しなかった場合の処理の途中にセグメントを切り替える処理が必要になる。この場合、セグメント境界を跨ぐすべての分岐命令に対して、セグメントを切り替える処理が追加されるため、コード量が増加することが考えられる。
【００３９】
そこで、コード量の増加を最小限に抑える方法として本実施例では、制御構造の途中で命令コードがセグメント境界を跨がないようにリンカ310が自動的にメモリ配置を調節する。具体的には、リンカ310は、一つの制御構造に含まれる命令コードの集合を単位とした論理ブロックに分割する。次に、論理ブロックがセグメント境界を跨ぐ場合は、ブロックの直前に次のセグメントへの分岐命令を置き、その論理ブロックは次のセグメントへ配置するように変更する。リンカ310がこの論理ブロックを識別できるように、コンパイラ304は、リンク処理に先立って制御構造の先頭と最後とを表す擬似命令を含むオブジェクトファイル306をリンカ310に出力する。
【００４０】
次に図３を参照して本実施例におけるプログラム作成装置300の動作を説明する。まず、ソースプログラムが記述されたソースファイル302をコンパイラ304に入力すると（S400）、コンパイラ304は、ソースプログラムを命令コードに変換し、オブジェクトコードを生成する。このとき一つの制御構造に含まれる命令コードの集合330、332を一つの論理ブロック334、336とみなして、その論理ブロックの先頭および末尾に擬似命令をそれぞれ出力する（S402）。図示の例では、論理ブロック334、336のそれぞれの先頭に「BLOCK_START」を配置し、それらの末尾にそれぞれ「BLOCK_END」を配置している。
【００４１】
次に、リンカ310は、コンパイラ304が出力した擬似命令を検出し、命令コードを論理ブロック単位に分割するとともに、分割された論理ブロック単位で順にメモリ空間への割付けを行う（S404）。この割付け処理において、たとえば論理ブロック336がセグメント境界340を跨ぐことをリンカ310が判断すると、リンカ310は、その論理ブロックの直前の論理ブロック334の末尾に、次のセグメント#2へ制御を切り替える分岐命令「b NEXT」を挿入し（S406）、次の論理ブロック336は、次のセグメント#2へ分岐命令「NEXT：」に挿入した次に続いて配置する（S408）。
【００４２】
以上説明したように、従来のリンカでは、コンパイラがソースプログラム上で記述されたあるまとまった処理単位(関数)ごとに、命令コードのメモリ空間への割付けを行っていたため、命令コードがセグメント境界を跨ぐ場合は、プログラマがメモリ配置を適切に調節するか、または、ソースプログラム上の処理を分割しなければならなかった。しかし上記実施例では、従来の処理単位よりさらに小さい制御構造単位で命令コードを分割し、さらにそれらがセグメント境界を跨がないように自動的にメモリ配置を調節することにより、プログラマがメモリ配置の調整およびソースプログラム上の処理の分割をしなくて済む。これにより、リニアなメモリ空間を前提としたプログラム開発が可能になり、移植性の高いプログラムを作成することができる。
【００４３】
上記実施例では、データおよび命令コードがセグメント境界を跨ぐ場合に、１回のコンパイル・リンク処理で実行イメージのプログラムを作成する方法を述べた。この方法では、１回目のコンパイルの時点ではどのデータおよび命令コードがセグメント境界を跨ぐのか分からないので、擬似命令を出力しておき、リンク時にその擬似命令を適切な命令に展開している。
【００４４】
そこで、コンパイル・リンク処理を２回に分けて行うことによって、同等の結果を得ることができる。すなわち、１回目のコンパイル・リンク処理では、実行イメージを作成するのではなく、コンパイルの結果どのデータおよび命令コードがセグメント境界を跨ぐのかをリンカが判別して情報として出力する。次いで２回目のコンパイル処理にて、その情報をコンパイラの入力に与えることにより、対象となるデータアクセスおよび命令コードに対して、コンパイラがセグメントを切り替える命令を出力するとよい。図１および図４に示した実施例については、各実施例における動作を連続して実行することにより、オブジェクトコードをリンカで実行イメージに、データのアクセスする先のセグメントを切り替える制御コードを付加することにより、データがセグメントを跨いでる場合でもデータにアクセスできるようにするとともに、オブジェクトコードを論理ブロックごとに分割して、実行イメージでは論理ブロックごとに別々のセグメントに配置させるようにすることができる。
【図面の簡単な説明】
【００４５】
【図１】本発明が適用されたプログラム作成装置の処理例およびその内容を示すブロック図である。
【図２】メモリ空間を示す図である。
【図３】命令コードがセグメント境界を跨ぐ場合を説明する図である。
【図４】本発明が適用されたプログラム作成装置の処理例およびその内容を示すブロック図である。
【符号の説明】
【００４６】
10  プログラム作成装置
12  ソースファイル
14  コンパイラ
16  オブジェクトファイル
18、20  実行プログラム
22  リンカ
【図１】
2009211491.tif 000003
【図２】
2009211491.tif 000004
【図３】
2009211491.tif 000005
【図４】
2009211491.tif 000006