JP2015197821A - アセンブリコード変換装置およびその変換方法 - Google Patents

アセンブリコード変換装置およびその変換方法 Download PDF

Info

Publication number
JP2015197821A
JP2015197821A JP2014075734A JP2014075734A JP2015197821A JP 2015197821 A JP2015197821 A JP 2015197821A JP 2014075734 A JP2014075734 A JP 2014075734A JP 2014075734 A JP2014075734 A JP 2014075734A JP 2015197821 A JP2015197821 A JP 2015197821A
Authority
JP
Japan
Prior art keywords
instruction
register
code
update
address
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2014075734A
Other languages
English (en)
Inventor
淳也 藤田
Junya Fujita
淳也 藤田
輝昭 酒田
Teruaki Sakata
輝昭 酒田
山田 勉
Tsutomu Yamada
山田  勉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2014075734A priority Critical patent/JP2015197821A/ja
Publication of JP2015197821A publication Critical patent/JP2015197821A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

【課題】 アセンブリコード(命令)から変換したコード数を削減するとともに、変換における工数を削減することにある。【解決手段】 マイコンで実行されるアセンブリ言語で記述された命令群を高水準言語で記述されたコード群へ変換するソースコード変換部を有するアセンブリコード変換装置であって、前記命令群から制御フローグラフを生成し、前記制御フローグラフにおける前記マイコン内のレジスタの更新命令と参照命令を抽出し、前記抽出において対応する参照命令の無い更新命令を到達定義として算出するレジスタ参照・更新命令解析部と、前記到達定義に基づき、前記対応する参照命令の無い更新命令から変換されたコードを前記ソースコード変換部の変換した前記コード群から削除するレジスタ更新コード削減部と、を有する。【選択図】 図1

Description

本発明はアセンブリコード変換装置およびその変換方法に関するものである。
ソフトウェアの記述言語としてアセンブリ言語が古くから広く使用されている。アセンブリ言語はマイコンが直接実行可能な機械語を人間に分かりやすい形式で記述するための言語であり、低水準言語等とも呼ばれ、その表現はマイコンのアーキテクチャに依存する。このため、あるマイコンのアセンブリ言語で記述されたアセンブリコードを、別のマイコンで動作できるような形式へ直接変換することは困難であり、アセンブリコードをC言語等の高水準言語への書き直し(逆コンパイル)が必要である。
特許文献1には、あるマイコンのアセンブリ言語で記述されたアセンブリコードを、C言語等の高水準言語へ変換する技術が開示されている。特許文献1に開示された技術によると、アセンブリ言語で記述された一命令(ニーモニック)を、直接対応するC言語形式へ変換することができる。たとえば、”MOV R1, R2”というニーモニック(汎用レジスタR1の内容を汎用レジスタR2へコピーする命令)があれば、以下のようなC言語表記へ当てはめて置き換える。

unsigned long R1, R2;
R2 = R1;

また、ソフトウェアの最適化は広く行われており、例えば非特許文献1には制御フローグラフのデータフロー解析から到達定義を得て最適化する技術が開示されている。
特開2004-252807号公報 中田育男著、「コンパイラの構成と最適化」、株式会社朝倉書店、 p282-333
特許文献1に開示された技術を用いればアセンブリコードをC言語へ変換することは可能である。しかしながら、マイコン内部処理も含めた動作も完全に再現してしまい、C言語への変換において冗長なコードを生成してしまう可能性がある。
たとえば、MOV命令の実行結果によっては、マイコン内のCPU(Central Processing Unit)が有するステータスレジスタ(コンディションコードレジスタ、フラグレジスタ等とも呼ばれるが、以下、ステータスレジスタとする)の内容を更新する場合がある。ステータスレジスタは、通常、暗黙的にハードウェアで処理され、命令実行終了毎で命令実行結果に応じた値が格納される。一方、ステータスレジスタはマイコン間で互換性がなく、異なるアーキテクチャのマイコン間で対応付けることは困難である。また、ステータスレジスタだけでなく、プログラムカウンタもマイコンに依存する。そして、命令によっては、ステータスレジスタやプログラムカウンタを参照するものもあり、ステータスレジスタやプログラムカウンタの処理を省くことはできない。
特許文献1に開示された技術は、ハードウェアとして再現できない部分についてC言語等の高水準言語を用いてソフトウェアとして記述する技術であり、”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)容量や、処理時間の増大を招いてしまう。そして、移行先のマイコンとして高性能なマイコンを用いることとなり、結果的に移行先マイコンの単価が高くなってしまう。
そこで、本発明の目的は、アセンブリコード(命令)から変換したコード数を削減するとともに、変換における工数を削減することにある。
本発明に係る代表的なアセンブリコード変換装置は、マイコンで実行されるアセンブリ言語で記述された命令群を高水準言語で記述されたコード群へ変換するソースコード変換部を有するアセンブリコード変換装置であって、前記命令群から制御フローグラフを生成し、前記制御フローグラフにおける前記マイコン内のレジスタの更新命令と参照命令を抽出し、前記抽出において対応する参照命令の無い更新命令を到達定義として算出するレジスタ参照・更新命令解析部と、前記到達定義に基づき、前記対応する参照命令の無い更新命令から変換されたコードを前記ソースコード変換部の変換した前記コード群から削除するレジスタ更新コード削減部と、を有することを特徴とする。
また、本発明はアセンブリコードの変換方法としても把握される。
本発明によれば、アセンブリコードから変換したコード数を削減でき、変換における工数を削減できる。
アセンブリコード変換装置の構成の例を示す図である。 命令変換ライブラリの例を示す図である。 レジスタ参照・更新命令解析部の構成の例を示す図である。 アセンブリコード変換装置の処理フローチャートの例を示す図である。 ニーモニックの識別子付与とC言語化の例を示す図である。 制御フローグラフ生成とレジスタ判定の例を示す図である。 到達定義の例を示す図である。 冗長なレジスタ更新を削除する処理フローチャートの例を示す図である。 相対・間接アドレス方式対応のアセンブリコード変換装置の構成の例を示す図である。 アドレス候補決定部の構成の例を示す図である。 相対・間接アドレス方式対応のアセンブリコード変換装置の処理フローチャートの例を示す図である。 相対・間接アドレス方式のアセンブリコードのC言語化の例を示す図である。 I/O制御対応のアセンブリコード変換装置の構成の例を示す図である。 I/O制御に関する命令を抽出する処理フローチャートの例を示す図である。 I/O制御コード抽出部の処理フローチャートの例を示す図である。 I/O制御対応のアセンブリコード変換装置が生成したデータの例を示す図である。 汎用レジスタの生存期間とサブルーチンとの関係の例を示す図である。 サブルーチンを判定する処理フローチャートの例を示す図である。
以下、図面を用いて好ましい実施例を説明する。
(構成の説明)
図1はアセンブリコード変換装置の構成の例を示す図である。なお、以下の説明では高水準言語としてC言語を前提に説明するが、C言語以外の高水準言語であってもよい。図1に示すアセンブリコード変換装置100は、ニーモニック識別部110、レジスタ参照・操作命令解析部120、ソースコード変換部130、レジスタ更新コード削減部140、および命令変換ライブラリ150から構成される。
ニーモニック識別部110は入力されたアセンブリコードIN11のニーモニック(命令)を識別するための識別子(ニーモニック識別子)を付与するものである。レジスタ参照・更新命令解析部120は入力されたアセンブリコードIN11からステータスレジスタやプログラムカウンタを含めたCPU内レジスタのデータ変化(データフロー)を解析するものである。ソースコード変換部130はアセンブリコードIN11のアセンブリコードをC言語で記述されたコード(以降、C言語コード)へ変換するものである。レジスタ更新コード削減部140はレジスタ参照・更新命令解析部120が生成した解析結果を元に、ソースコード変換部130が生成したC言語コードから冗長なレジスタ更新処理を削減し、最適化されたC言語コードOUT12を生成するものである。
命令変換ライブラリ150はニーモニックをC言語形式へ変換するルールを定めたテーブルである。命令変換ライブラリ150の例を図2に示す。命令変換ライブラリ150はニーモニック構文規則151とそれに対応するC言語表記法152の対応表となっており、アセンブリコードIN11中のニーモニックを対応するC言語表記へ変換するための情報である。この情報は予め操作者が図示を省略した入力装置から手動で入力し記憶してもよいし、マイコン製造メーカ等の提供する電子情報を入力し記憶しても良い。
図3にレジスタ参照・更新命令解析部120の構成の例を示す。レジスタ参照・更新命令解析部120は、アセンブリコードIN11の構文を解析して制御フローグラフを生成する制御フローグラフ生成部121と、アセンブリコードIN11で利用されるニーモニックの構文から各命令の実行によって更新されるレジスタまたは参照されるレジスタを判定する参照・更新レジスタ判定部122と、制御フローグラフ生成部121が生成した制御フローグラフから、レジスタの値の更新(定義)や参照処理が実行される可能性を判定するレジスタ操作解析部123を有する。
ここで、レジスタ操作解析部123の解析結果OUTはレジスタの到達定義(以降、到達定義)と呼ばれ、例えば非特許文献1等にも記載されたデータフロー解析アルゴリズムによって決定される。レジスタ操作解析部123が生成した到達定義は、任意の命令実行時において、当命令を実行時におけるレジスタの値を定義する可能性がある命令の情報を有する。加えて、任意の命令実行時に定義したレジスタを参照する命令の情報を有する。すなわち、到達定義によって、ステータスレジスタやプログラムカウンタを含めた任意レジスタが参照される時点における値を決定する命令がどの命令であるかを求めることができる。
レジスタ更新コード削減部140は、レジスタ参照・更新命令解析部120が生成したレジスタの到達定義から、ある命令によって更新されたレジスタの値が、他の命令によって参照されることがないことを確認した後に、ソースコード変換部130が生成したC言語コードから当該参照されることのないレジスタを更新する処理に相当するコードを削除する。
(処理の説明)
以上で説明した構成における処理例を図4に示したフローチャートにしたがい説明する。変換対象であるアセンブリコードIN11を、アセンブリコード変換装置100に入力し、最適化されたC言語コードOUT12を出力するまでの処理のフローチャートの例を図4に示す。本処理例では、アセンブリコード変換装置100がアセンブリコードIN11の入力を受けた際、アセンブリコードIN11に文法上の問題がないか確認(S400)した後、ニーモニック識別部110にてアセンブリコードIN11内のニーモニックに識別子を付与する(S410)。
なお、識別子は独自に設定する処理にしてもよいし、入力されたアセンブリコードIN11の行番号等の入力ファイル固有の情報を用いる処理でもよい。また、アセンブリコード11に文法上の問題がある場合は処理を終了する。ニーモニックの識別子を付与(S410)した後、以下の処理を独立に実行する。図4においてはS420とS430との両方への分岐として示す。
(処理1) ニーモニックを対応するC言語表記へ変換する(S430)。生成したC言語コードは、テキストファイルとして保存する。また、ニーモニックの識別子を元に、変換元のニーモニックと、変換後のC言語コードの対応関係を把握できるようにする。アセンブリコードIN11(test.asm)の入力から識別子を付与するイメージと、C言語コードOUT14(test.c)に変換した後で対応関係を保持するイメージの例を図5に示す。この例では、ニーモニック識別子をC言語コードOUT14(test.c)中にコメントとして残してある。なお、C言語コードOUT14は冗長なコードを含む点においてC言語コードOUT12とは異なる。
(処理2)レジスタ参照・更新命令解析部120にて、制御フローグラフを生成する(S420)。制御フローグラフを生成した後、アセンブラコードIN11中のニーモニックが参照または更新するレジスタを判定する(S421)。たとえば、”MOV R1, R2”というニーモニックがあれば、当命令実行時に参照するレジスタはR1であり、更新されるレジスタはR2の他、ステータスレジスタとプログラムカウンタがある。
ここで、判定に必要な情報はマイコンの仕様書等に規定されている。マイコンの仕様書等が書類であれば操作者がその内容を図示を省略した入力装置から手動で入力してもよいし、マイコンの仕様書等が電子情報であってそのまま判定に使用できるものであれば予め記憶させておいてもよい。このようにして得られた情報は各ニーモニックに紐付けて保持する。S420とS421の処理のイメージの例を図6に示す。図6においてアセンブリコード15ではニーモニックに識別子付与済みと仮定し、更新情報16ではJMP(ジャンプ)命令後にステータスレジスタ(StatReg)を更新すると仮定している。
その後、制御フローグラフを元に到達定義を計算し、得られた到達定義をファイルに出力する(S422)。ファイル出力した到達定義のデータ構成例を図7に示す。カラム710はニーモニック識別部110が各命令に対して割り当てたニーモニック識別子である。このニーモニック識別子の個数とアセンブリコードIN11中のニーモニック数は一致し、アセンブリコードIN11内の並びと同じ順序で並ぶ。カラム720は、ニーモニック識別子に対応するニーモニックの内容が格納される。
カラム730は、当命令すなわちカラム720に示したニーモニック識別子の命令によって更新したレジスタが使用される可能性のあるニーモニックの情報が格納される。カラム730は二つのサブカラム731および732を有している。サブカラム731は、識別子を振り分けられた個々のニーモニックに対して、参照・更新レジスタ判定部122が生成した情報の内、更新されるレジスタの情報が格納される。なお、図7に示したテーブルの例では一つのセルに対して一つのレジスタが割り当てられる。
サブカラム732は、サブカラム731に示したレジスタ毎で、当命令によって更新したレジスタの値が参照される可能性のあるニーモニック一覧をニーモニック識別子として表す。なお、レジスタ毎で参照される可能性があるニーモニックは複数存在することもある。また、レジスタ名を変数名として、レジスタをメモリのアドレスとしてもよい。メモリはマイコンに内蔵されたメモリでもよいし、マイコンの外に接続したメモリでもよい。図7に示すカラム730の内容は、参照・更新レジスタ判定部122にて得られた情報、および到達定義の計算結果に問題が無ければ、容易に導出可能である。
以上の処理1、2が完了した後、処理1で得られたC言語コードOUT14および処理2で得られた到達定義により、C言語コードOUT14から冗長なコードを削除する処理を実行する(S440)。この処理はレジスタ更新コード削減部140にて実行される。
冗長なコードを削減する処理のフローチャートの例を図8に示す。先ず、レジスタ更新コード削減部140は既に説明した処理1および処理2で生成した個々のファイルを読み込む(S800)。読み込んだ後に、C言語コードOUT14内のニーモニック識別子を取得し、最適化対象のニーモニックを処理可能とする(S810)。対象となるニーモニックの識別子から、対応する到達定義を参照し、図7に示したデータを取得する(S820)。
対象ニーモニックの到達定義を参照し、命令の実行によって更新されるレジスタが存在するかどうか判定する(S830)。これは、サブカラム731の内容をチェックすることで判定できる。更新されるレジスタが存在する場合、サブカラム732の内容を判定し、当命令によって更新したレジスタの内容が、他の命令で参照される可能性があるかどうかチェックする(S840)。
参照される可能性がない場合、C言語コードOUT14中の当該レジスタを更新する処理に相当するコードを削除する(S850)。S840およびS850の処理は、同一ニーモニックにおいて、更新されるレジスタすべてに対して実行する(S860)。
以上の処理(S810〜S860)は、ニーモニック単位で実行されC言語コードOUT14中の全ニーモニックに対して実行される(S870)。以上の処理によって、冗長なレジスタ更新処理が削減されたC言語コードOUT12が生成される。
また、S850の処理は、レジスタ単位だけでなく、ビット単位で処理することもできる。これは、図7に示した到達定義のサブカラム731の内容を、ビット単位に拡張することで容易に実現できる。ビット単位でS850を実行することで、ステータスレジスタの更新処理を更に削減でき、さらに冗長処理が少ないコードを生成することができる。
以上は、ステータスレジスタを例に説明したが、プログラムカウンタにおいても、同様の処理を適用でき、命令毎で実行されるプログラムカウンタの冗長な更新処理を削減できる。例えば、アセンブリコードIN11中で、プログラムカウンタをベースとした相対アドレス方式(プログラムカウンタ相対アドレス方式)を利用していないことが、アセンブリ変換装置100から得られた到達定義から判断可能である。したがって、プログラムカウンタが参照される可能性があるニーモニックの存在有無で容易に判断できる。
(効果の説明)
以上の処理によって、C言語化されたアセンブリコードから、ステータスレジスタやプログラムカウンタ等が冗長なレジスタとなった場合に冗長なレジスタ更新処理を削減できる。その効果として、命令単位のC言語コード数を削減することができ、移行先マイコンのCPUクロック数や命令を記録するROM容量を少なくできる。その結果的として、移行先マイコン性能の制限を緩和でき、より安価なマイコンでアセンブリコードの移行を実現できる。
(追加効果)
また、レジスタ値を更新する命令によっては、当レジスタを参照する命令実行時点のレジスタ値を決定することが可能な場合もある。例えば、以下のようなMOV命令があり、MOV命令実行後のR0の内容をステータスフラグに反映するCPUがあるとする。

MOV H’0000, R0

この場合、ステータスレジスタの値として、ゼロフラグ(StateFlag.Zero)が1となることは明らかである。したがって、ゼロフラグを判定する分岐処理は不要となり、C言語コードでは、StateFlag.Zero=1を必ず実行するようなコードを挿入するだけでよい。レジスタ参照・更新命令解析部120がゼロフラグを判定する分岐命令を抽出し、レジスタ更新コード削減部140が分岐命令を削除し、必ず実行するようなコードを挿入してもよい。このような場合、レジスタ値を絶対値に置き換えたC言語コードを生成する方が、移行先マイコン向けのコンパイラ等でマシンコードに置き換えた際に、より少ないクロック数で実行可能な即値命令として表現できるため、効率的なコードが生成できる。
(本実施例の適用対象)
マイコンのCPUがサポートするアドレッシングモードは、大きく、絶対アドレス方式、相対アドレス方式、間接アドレス方式に分類される。絶対アドレス方式はメモリ番地を直接指定する方式であり、マイコン間でメモリマップの対応が明確である場合は、その対応関係を元に機械的に変換して問題がない。一方、相対アドレス方式と間接アドレス方式は命令実行時点でのレジスタが保持する値が必要となる。また、移行元マイコンにおいて、相対アドレス方式と間接アドレス方式で必要となるレジスタの値は、移行元マイコンのメモリマップを基準としている。例えば、以下に示すアセンブリコードがあるとする。

MOV H’0124, R1 //汎用レジスタR1に0x0124をコピー
JMP @R1 //R1の内容が表すアドレス番地へジャンプ

上記の例では、JMP命令実行時に、アドレス番地0x0124へジャンプする処理を実行し、アドレス番地0x0124に示す命令を実行する。ところが、メモリマップが異なる他のマイコンでは、ジャンプ後に実行する命令はアドレス番地0x0124にあることは稀であり、他のアドレス番地であることが殆どである。汎用レジスタの値そのものをアドレス番地にするだけではなく汎用レジスタの値にオフセットを加算してアドレス番地とする場合や、専用レジスタであるプログラムカウンタの値にオフセットを加算してアドレス番地とする場合も同様である。したがって、相対アドレス方式や間接アドレス方式を利用した命令実行時は、命令実行時に対応する移行先マイコンのアドレスを決定する必要がある。しかし、相対アドレス方式や間接アドレス方式は、複数のアドレス番地が候補として指定される場合、実際にプログラムを実行しないと決定できないケースもあり、ソースコードのみでアドレス値を決定することは困難である。
(構成の説明)
本実施例におけるアセンブリコード変換装置900の構成例を図9に示す。アセンブリコード変換装置900は、ニーモニック識別部110、ソースコード変換部131、図示を省略したレジスタ更新コード削減部140、命令変換ライブラリ150、アドレス候補決定部910、およびアドレス候補挿入部920から構成される。アセンブリコード変換装置100と同じ符号を付けた構成は、アセンブリコード変換装置100と同じものである。ただし、ソースコード変換部131は、アセンブリコード変換装置100のソースコード変換部130が実行する処理に加え、アドレス候補挿入部920が挿入したアドレス情報を参照し、対応するC言語コードを生成する。
アドレス候補決定部910の構成の例を図10に示す。アドレス候補決定部910は、入力された到達定義から、間接アドレス方式または相対アドレス方式として実行する命令を取得する間接・相対アドレス方式命令取得部911、および内部でカラム720記載のニーモニックの内容を解釈し、解釈したニーモニックに対応するレジスタ値の加減算処理等のCPUの演算処理を解析する命令パーサ(parser)912を有しており、到達定義のカラム720の内容からレジスタが取り得る具体的な値を導出する機能を有する。アドレス候補挿入部920は、アドレス候補決定部910にて得られた候補値をアセンブリコードIN21へ挿入する機能を有する。
(処理の説明)
図9に示した構成による処理例を図11に示す。S1100からS1122までの処理は、それぞれS400からS422までの処理と対応し、同じ処理を実行する。その後、S1122の処理で得られた到達定義を元に、アドレス候補決定部910にて、間接アドレス方式または相対アドレス方式を利用した命令実行時において取り得る値を計算する(S1123)。その際、対象命令実行時において、参照するレジスタの値がどの命令によって決定されたか判断する必要があるが、これは図7に示した到達定義のフォーマットから求めることができる。
参照するレジスタの値が決定された後に、レジスタ参照・更新命令解析部120が生成した到達定義23から、間接アドレス方式で実行する命令または相対アドレス方式で実行する命令の実行時のレジスタが取り得る値を命令パーサ912にて計算し、値の候補を取得する。得られた候補値は、アドレス値候補24として、アドレス候補挿入部920へ渡される。S1123にて得られたアドレス値候補24は、アドレス候補挿入部920にて入力されたアセンブリコードIN21(ニーモニック識別部110の出力)に挿入する(S1130)。挿入の処理は、該当する命令と同じ行にコメントとして挿入する処理や、ニーモニック識別子に紐付けて別ファイルとして管理する処理等がある。前者の処理で生成したコードの例を、図12中のアセンブリコードIN25に示す。
S1140では、間接アドレス方式または相対アドレス方式を用いた命令を、対応するC言語コードへ変換する処理を実行する。実行の入力と出力の例を図12に示す。この例では、”JMP @R1”の命令を、switch文として表しており、レジスタR1の内容に応じて、ジャンプする先を個別に設定している。ここで、L_0xXXXXはアドレス番地0xXXXXに配置された処理に相当する内容が記載されたラベルである。
以上ではジャンプ命令を例に挙げたが、以上の説明は間接アドレス方式または相対アドレス方式を用いたすべての命令においても成り立つ。例えば、以下のような命令の場合、汎用レジスタR1には汎用レジスタR0が保持する値に対応するアドレス番地のメモリ領域に保持された値をコピーする処理を実行する。

MOV @R0, R1

この命令をC言語へ置き換えた場合、以下のようになる。

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)のアドレス値

}
}

この例ではメモリマップの異なる移行元マイコンの16bitアドレス値から移行先マイコンの32bitアドレス値へ変換してコピーする処理を実行する。そして、このように図11に示す処理によって、アドレスが取り得る値の候補を見積もることで、相対アドレス方式または間接アドレス方式を利用したすべての命令に対応可能となる。以上の例ではアドレス番地の候補が複数の場合を例に説明したが、アドレス番地の候補が一意である場合、絶対アドレス方式と同様に扱う。
(効果の説明)
本構成によると、間接アドレス方式および相対アドレス方式を用いた命令を、機械的に高水準言語へ置き換える処理を実現する。そのため、移行に係る工数を削減することができる。
(本実施例の適用対象)
あるマイコンがI/O制御方式として、メモリマップドI/O方式を採用している場合、I/O制御はメモリ空間にI/O専用レジスタを割り当て、そのレジスタの値を読み書きすることで制御する。この方式は、マイコンのCPU内部回路を簡素化できるため、多くのマイコンで採用されている。
一方、I/O制御はLSI(Large-Scale Integration)チップすなわちハードウェアに依存する部分であり、一般的に高水準言語へ直接変換できない。また、変換できるとしても、デバイスドライバとして記述されるため、結果的に個々のマイコンに依存してしまう。そのため、C言語化する際は、I/O専用レジスタに書き込む値を把握し、その情報を元に、移行先マイコンのI/O仕様に応じて対応する必要がある。しかし、この作業を人手で行った場合、非常に多くの工数がかかる場合がある。
(構成の説明)
本実施例におけるアセンブリコード変換装置1300の構成例を図13に示す。アセンブリコード変換装置1300は、ニーモニック識別部110、レジスタ参照・更新命令解析部120、I/O制御コード抽出部1310、およびI/O制御レジスタライブラリ1320から構成される。ニーモニック識別部110およびレジスタ参照・更新命令解析部120は、アセンブリコード変換装置100内の同じ符号の構成と同じ処理を実行する。
I/O制御コード抽出部1310は、I/O制御に関する命令を抽出する。この抽出は、I/O制御レジスタ単位で行われ、対象のI/O制御レジスタを更新する命令の他、I/O制御レジスタの値の決定に関与する命令も含めて抽出する。また、I/O制御レジスタに代入する値の決定に関与する命令の他、I/O制御レジスタから取得した値を利用する命令も含めて抽出する。
I/O制御レジスタライブラリ1320は、移行元マイコンのI/O制御レジスタの一覧情報が格納されている。具体的には、I/O制御レジスタのアドレス番地や、ラベル名(一つのI/Oレジスタに複数のラベル名が割り当てられている場合もある)が格納されている。また、I/O制御レジスタライブラリ1320の内容は、LSIチップに依存するため、LSIチップのバージョンやロット毎で異なる場合もある。
(処理の説明)
アセンブリコード変換装置1300による処理例を図14に示す。S1400からS1422までの処理は、それぞれ図4のS400からS422までの処理と対応し、同等の処理を実行する。ただし、S1421では、レジスタの値として、I/O制御レジスタも含めて判定する。I/O制御レジスタの一覧情報はI/O制御レジスタライブラリ1320から取得する。S1430ではI/O制御コード抽出部1310にて、S1422で得られた到達定義から、I/O制御レジスタに関する命令を抽出する処理を実行する。
I/O制御コード抽出部1310すなわちS1430の詳細な処理の例を図15に示す。先ず、ニーモニック識別子が付与されたアセンブリコード、および到達定義のファイルをそれぞれ読み込む(S1500)。その後、到達定義からI/O制御レジスタを直接参照、または更新する命令を抽出する(S1510)。抽出した命令が、I/O制御レジスタの値を更新する命令である場合、更新する値を決定する命令を到達定義から導出する(S1520)。これは、更新したレジスタが参照される可能性があるニーモニック(図7におけるカラム730)を辿ることで導出できる。I/O制御レジスタの値を参照する命令の場合も、更新する命令と同様に、到達定義から導出できる。
I/O制御レジスタを参照する命令の抽出条件として、抽出対象の命令が、I/O制御レジスタの情報を有することとする。例えば、以下のようなコードがあるとする。左端の番号はニーモニック識別番号(識別子)とする。

01 MOV @IO_REG, R1 //I/O制御レジスタIO_REGから値を取得し、汎用レジスタR1へ格納
02 MOV R1, R2 //汎用レジスタR2に汎用レジスタR1の値を代入する
03 ADD H’20, R2 //汎用レジスタR2の値に、0x20を加算
04 MOV H’FF, R2 //汎用レジスタR2の値に、0xFFを代入

この例の場合、ADD命令実行後の汎用レジスタR2は、取得したI/O制御レジスタの情報を有している。一方、ADD命令の次のMOV命令実行後の汎用レジスタR2は、取得したI/O制御レジスタとは関係がない情報である。このため、I/O制御に関する命令はニーモニック識別番号01から03までの命令が該当する。このような、レジスタ値の影響関係も、到達定義によって導出できる。なお、I/O制御レジスタに関する処理を抽出する際は、そのレジスタの内容を参照する命令と、更新する命令とで切り分けることが望ましい。
S1510からS1530までの処理は、I/O制御レジスタライブラリ1320に記載されたI/O制御レジスタすべてに対して実行される(S1530)。この処理によって出力されたファイルOUT32が含むデータの例を図16に示す。カラム1610はI/O制御レジスタの一覧である。その内容はI/O制御レジスタライブラリから取得する。セル一つあたり、アドレス番地とラベル名の情報を有する。ラベル名が複数ある場合はそれらの情報も有する。
例えば、0xFF01番地に、8ビットタイマの制御レジスタが割り当てられ、それに“8BIT_TIMER”というラベルが付与されている場合、セルにはアドレス番地0xFF01とラベル“8BIT_TIMER”が格納される。0xFF02番地にモータのトルク値を取得するDA変換器の制御レジスタは割り当てられ、“DA_CON1”と“MOTOR_TORQ”というラベルが付与されている場合、セルにはアドレス番地0xFF02とラベル“ DA_CON1”、“ MOTOR_TORQ”が格納される。なお、行数はメモリ空間に割り当てられたI/O制御レジスタの総数と一致する。
カラム1620はカラム1610のI/O制御レジスタを直接参照する命令のニーモニック識別子である。カラム1630はカラム1620のニーモニック識別子が対応するニーモニックの内容を表す。カラム1640は、対象の命令が、I/O制御レジスタの値を参照するか、または更新するかを表すフラグである。カラム1650は対象の命令が関与するI/O制御に関与する命令一覧である。これは関与する命令をニーモニック識別子として網羅している。
カラム1650に網羅された命令は、入力されたアセンブリコードIN3と統合することもできる。統合した際に、当ニーモニックがI/O制御レジスタである諭旨をソースコード変換部130へ通知することができるようになる。
(効果の説明)
カラム1650の内容を参照することで、I/O制御レジスタの操作に関わる命令をすべて抽出できる。これらの情報は、移行先マイコンの周辺回路の仕様に合わせこむ際に、参照可能な命令である。必要な情報を部分的に抽出する作業を自動化できるため、周辺回路の互換仕様を合わせる際の工数を削減することができる。
(本実施例の適用対象)
アセンブリ言語ではローカル変数と呼ばれる概念は存在しないが、C言語等の高水準言語ではローカル変数が扱われる。高水準言語から機械語を生成するツールであるコンパイラが最適化を実行する際、グローバル変数でなく、ローカル変数でなければ、最適化できない場合がある。一方、アセンブリ言語は、汎用レジスタやメモリ空間を直接制御する仕様であり、高水準言語で例えると、グローバル変数として扱っていることと同等である。すなわち、機械的に高水準言語へ変換した場合、汎用レジスタはグローバル変数として定義され、移行先マイコンのコンパイラによる最適化処理の効果を受けにくくなる。
これに対し、以下に説明する処理を適用することで、汎用レジスタの生死状況を把握することができ、最適なサブルーチン化の基準を設けることが可能となる。サブルーチン化の基準を設けることで、C言語化する際に、汎用レジスタのローカル変数化を、各変数の生存期間が最小化できるように設定できる。その結果として、移行先マイコン開発環境のコンパイラを用いた際、より最適なコードを生成でき、移行先マイコンの性能を抑えることができる。
(処理の説明)
ローカル変数化はアセンブリコード変換装置100が生成する到達定義により実現できる。各汎用レジスタの更新と、更新された値が最後に参照される関係をグラフ化した例を図17に示す。図17に示す縦軸はプログラムのステップ数を単位とする汎用レジスタの生存期間とする。ここでは、ステップ数の増加方向を下方向としてある。すなわち、ステップ数はプログラム開始から何ステップ目であるかを表し、この意味ではプログラム内の静的な特定時間や位置を表すとともに、ステップを単位とする時間であるステップ時間を表す。横軸は汎用レジスタの一覧を示してある。これはプログラム中で利用されている汎用レジスタの種類に準ずる。また、図17に示すグラフは、ステップ数と到達定義中のニーモニック識別子で対応付けることで、求めることができる。
点1701は汎用レジスタの値が定義されるポイントを示す。また、点1702は点1701にて定義された値を最後に参照するポイントを示す。点1702は汎用レジスタR0の点1701からの到達定義により取得することができる。このようなポイントを使用し、図17のサブルーチンとなるsub1()1703を例に、サブルーチンを判定する処理例を図18に示す。S1801ではsub1()1703の開始位置と終了位置を変数として初期化し、S1802にて汎用レジスタR0における生存期間(tR0_1)の値を代入する。ここでは、sub1()1703の開始位置にtR0_1の開始位置1704を、sub1()1703の終了位置にtR0_1の終了位置1705を代入する。
次に、他の汎用レジスタ(ここではR1、R2)における生存期間(tR1_1、tR2_1)の開始位置(終了位置)を参照し、それぞれの開始位置(終了位置)がtR0_1時の値を下回る(上回る)場合、値を更新する(S1803〜S1808)。例えばsub1()1703の終了位置が点1705の時点で汎用レジスタR1の参照終了位置である点1706を比較すると(S1806)、点1706の方が点1705よりステップ数の位置としては大きいため、点1706が新たなsub1()1703の終了位置とする(S1807)。
以上の処理を実行した後、次の汎用レジスタの生存期間の開始位置(tRX_2)が、sub1()の終了位置より上回るかどうか確認し、上回ることが確認できた場合は、その点をsub1()の開始位置、終了位置とする。逆に下回った場合は、sub1()の終了位置がN(2,3,・・・,N)番目の汎用レジスタの生存期間(tRX_N)の開始位置を上回るまで、S1804〜S1810の処理を繰り返す(S1812〜S1813)。
以上により、プログラム内で使用される各変数の生存期間を最小とするサブルーチン化の基準(範囲)を決定することができる。その結果として、ローカル変数を効率的に定義した高水準言語で記述されたコードを生成することができ、移行先マイコンの開発環境におけるコンパイラの最適化機構を最大限に活用できる。結果的に、移行先マイコンにとって効率的なマシンコードを生成できる。また、以上の処理は、汎用レジスタに限らず、メモリ空間やステータスレジスタ等のCPU専用レジスタにおいても有効である。
実行されることがない処理をブロック単位で削減することもできる。例えば、以下のような命令がある場合、CMP命令実行時のレジスタ値をアセンブリコード変換装置100の生成した到達定義から予測することで、分岐発生の有無を予め判断できる。この例では0xAAと0xFFの比較となり、Label1に対応する処理は実行することが決してないため、Label1以下の処理を変換する必要がなくなる。

MOV H’00AA, R0 //汎用レジスタR0に0xAAを代入
CMP R0, H’00FF //R0の値と0xFFの差分を取り、処理結果をステータスフラグへ反映
BGT Label1 //R0の内容が0xFFより大きければ、Label1へ分岐

この結果、既に存在するアセンブリコードから冗長な分岐処理を削減することができ、C言語コードのコード数を削減できる。
100、900、1300:アセンブリコード変換装置
110:ニーモニック識別部
120:レジスタ参照・更新命令解析部
130、131:ソースコード変換部
140:レジスタ更新コード削減部
150:命令変換ライブラリ
910:アドレス候補決定部
920:アドレス候補挿入部
1310:I/O制御コード抽出部
1320:I/O制御レジスタライブラリ

Claims (15)

  1. マイコンで実行されるアセンブリ言語で記述された命令群を高水準言語で記述されたコード群へ変換するソースコード変換部を有するアセンブリコード変換装置であって、
    前記命令群から制御フローグラフを生成し、前記制御フローグラフにおける前記マイコン内のレジスタの更新命令と参照命令を抽出し、前記抽出において対応する参照命令の無い更新命令を到達定義として算出するレジスタ参照・更新命令解析部と、
    前記到達定義に基づき、前記対応する参照命令の無い更新命令から変換されたコードを前記ソースコード変換部の変換した前記コード群から削除するレジスタ更新コード削減部と、
    を有することを特徴とするアセンブリコード変換装置。
  2. 前記レジスタ参照・更新命令解析部は前記レジスタの値を前記変換のときに決定できる参照命令を抽出し、
    前記レジスタ更新コード削減部は前記決定できる参照命令から変換されたコードを前記決定できるレジスタの値に固定したコードへ置き換えること
    を特徴とする請求項1に記載のアセンブリコード変換装置。
  3. 前記ソースコード変換部は前記命令群からマイコン内のステータスレジスタの更新と参照を含む前記コードへ変換し、
    前記レジスタ参照・更新命令解析部は前記ステータスレジスタの更新を伴う命令と参照を伴う命令を抽出し、対応する参照を伴う命令の無い前記更新を伴う命令と、前記ステータスレジスタの値を前記変換のときに決定できる前記参照を伴う命令とを到達定義として算出し、
    前記レジスタ更新コード削減部は前記対応する参照を伴う命令の無い前記更新を伴う命令から変換されたコードの中の前記ステータスレジスタを更新するコードを前記コード群から削除し、前記決定できる参照を伴う命令から変換されたコードの中の前記ステータスレジスタを参照するコードを前記決定できるステータスレジスタの値に固定したコードへ置き換えること
    を特徴とする請求項1または2に記載のアセンブリコード変換装置。
  4. 前記ソースコード変換部は前記命令群からマイコン内のプログラムカウンタの更新と参照を含む前記コードへ変換し、
    前記レジスタ参照・更新命令解析部は前記プログラムカウンタの更新を伴う命令と参照を伴う命令を抽出し、対応する参照を伴う命令の無い前記更新を伴う命令と、前記プログラムカウンタの値を前記変換のときに決定できる前記参照を伴う命令とを到達定義として算出し、
    前記レジスタ更新コード削減部は前記対応する参照を伴う命令の無い前記更新を伴う命令から変換されたコードの中の前記プログラムカウンタを更新するコードを前記コード群から削除し、前記決定できる参照を伴う命令から変換されたコードの中の前記プログラムカウンタを参照するコードを前記決定できるプログラムカウンタの値に固定したコードへ置き換えること
    を特徴とする請求項1〜3のいずれか1項に記載のアセンブリコード変換装置。
  5. 前記レジスタあるいはステータスレジスタの前記更新および参照はビット単位であることを特徴とする請求項1〜4のいずれか1項に記載のアセンブリコード変換装置。
  6. 前記レジスタの代わりに前記マイコン内のメモリ領域あるいは前記マイコン外のメモリ領域であることを特徴とする請求項1〜5のいずれか1項に記載のアセンブリコード変換装置。
  7. 前記命令群に含まれる相対アドレス方式あるいは間接アドレス方式の命令に対してアドレス番地の候補を決定するアドレス候補決定部と、
    前記決定されたアドレス番地の候補を前記命令群に挿入するアドレス候補挿入部と、
    を更に有し、
    前記ソースコード変換部は前記命令群に含まれるアドレス番地の候補を候補数に応じた分岐のコードへ更に変換すること
    を特徴とする請求項1〜6のいずれか1項に記載のアセンブリコード変換装置。
  8. 前記命令群に含まれる相対アドレス方式あるいは間接アドレス方式の命令に対してアドレス番地の候補を決定するアドレス候補決定部と、
    前記決定されたアドレス番地の候補を前記命令群に挿入するアドレス候補挿入部と、
    を更に有し、
    前記ソースコード変換部は前記命令群に含まれるアドレス番地の候補が単一である場合に、前記候補のアドレス番地に応じたコードへ更に変換すること
    を特徴とする請求項1〜6のいずれか1項に記載のアセンブリコード変換装置。
  9. 前記レジスタ参照・更新命令解析部は前記命令群に含まれるI/O制御レジスタの参照命令を抽出し、
    前記抽出した参照命令により得られる前記I/O制御レジスタの値の影響が前記マイコン内のレジスタに残る命令を抽出するI/O制御コード抽出部
    を更に有することを特徴とする請求項1〜8のいずれか1項に記載のアセンブリコード変換装置。
  10. 複数のレジスタを備えるマイコン内のレジスタ毎に更新命令と参照命令の組をすべて抽出し、複数の前記組の中で更新命令から参照命令までのステップ時間が他の組と時間的に一部または全部が重複する組であって、時間的に途切れることのなく重複する組すべてにおける最初のステップ時間の更新命令と最後のステップ時間の参照命令とを抽出すること
    を特徴とする請求項1〜9のいずれか1項に記載のアセンブリコード変換装置。
  11. 前記最初のステップ時間の更新命令から最後のステップ時間の参照命令までの間の命令を1つのサブルーチンへ変換すること
    を特徴とする請求項10に記載のアセンブリコード変換装置。
  12. マイコンで実行されるアセンブリ言語で記述された命令群を高水準言語で記述されたコード群へ変換するアセンブリコードの変換方法であって、
    前記命令群から制御フローグラフを生成するステップと、
    前記制御フローグラフにおける前記マイコン内のレジスタの更新命令と参照命令を抽出するステップと、
    前記抽出において対応する参照命令の無い更新命令を到達定義として算出するステップと、
    前記到達定義に基づき、前記対応する参照命令の無い更新命令から変換されたコードを記コード群から削除するステップと、
    を有することを特徴とするアセンブリコードの変換方法。
  13. 前記命令群に含まれる相対アドレス方式あるいは間接アドレス方式の命令に対してアドレス番地の候補を決定するステップと、
    前記決定されたアドレス番地の候補を前記命令群に挿入するステップと、
    前記ソースコード変換部は前記命令群に含まれるアドレス番地の候補を候補数に応じた分岐のコードへ変換するステップと、
    を更に有することを特徴とする請求項12に記載のアセンブリコードの変換方法。
  14. 前記命令群に含まれるI/O制御レジスタの参照命令を抽出するステップと、
    前記抽出した参照命令により得られる前記I/O制御レジスタの値の影響が前記マイコン内のレジスタに残る命令を抽出するステップと、
    を更に有することを特徴とする請求項12または13に記載のアセンブリコードの変換方法。
  15. 複数のレジスタを備えるマイコン内のレジスタ毎に更新命令と参照命令の組をすべて抽出するステップと、
    複数の前記組の中で更新命令から参照命令までのステップ時間が他の組と時間的に一部または全部が重複する組であって、時間的に途切れることのなく重複する組すべてにおける最初のステップ時間の更新命令と最後のステップ時間の参照命令とを抽出するステップと、
    を更に有することを特徴とする請求項12〜14のいずれか1項に記載のアセンブリコードの変換方法。
JP2014075734A 2014-04-01 2014-04-01 アセンブリコード変換装置およびその変換方法 Pending JP2015197821A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2014075734A JP2015197821A (ja) 2014-04-01 2014-04-01 アセンブリコード変換装置およびその変換方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014075734A JP2015197821A (ja) 2014-04-01 2014-04-01 アセンブリコード変換装置およびその変換方法

Publications (1)

Publication Number Publication Date
JP2015197821A true JP2015197821A (ja) 2015-11-09

Family

ID=54547454

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014075734A Pending JP2015197821A (ja) 2014-04-01 2014-04-01 アセンブリコード変換装置およびその変換方法

Country Status (1)

Country Link
JP (1) JP2015197821A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113302587A (zh) * 2020-10-09 2021-08-24 深圳市大疆创新科技有限公司 汇编指令的资源分析方法、装置和存储介质
CN116501332A (zh) * 2023-06-30 2023-07-28 牛芯半导体(深圳)有限公司 语言转换方法、装置、设备及存储介质

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113302587A (zh) * 2020-10-09 2021-08-24 深圳市大疆创新科技有限公司 汇编指令的资源分析方法、装置和存储介质
WO2022073197A1 (zh) * 2020-10-09 2022-04-14 深圳市大疆创新科技有限公司 汇编指令的资源分析方法、装置和存储介质
CN116501332A (zh) * 2023-06-30 2023-07-28 牛芯半导体(深圳)有限公司 语言转换方法、装置、设备及存储介质
CN116501332B (zh) * 2023-06-30 2023-09-29 牛芯半导体(深圳)有限公司 语言转换方法、装置、设备及存储介质

Similar Documents

Publication Publication Date Title
JP4533682B2 (ja) トレース解析装置およびトレース解析方法
US20090249307A1 (en) Program analysis apparatus, program analysis method, and program storage medium
IE920749A1 (en) Automatic flowgraph generation for program analysis and¹translation
US10459707B2 (en) Instruction-set simulator and its simulator generation method
EP0531522A1 (en) Cross-image referencing of program code
JP4638484B2 (ja) データ処理装置におけるデータ整合性
JPH1139167A (ja) 機械語命令列またはアセンブリ言語命令列を最適化する最適化装置、及び、高級言語で記載されたソースプログラムを機械語またはアセンブリ言語の命令列に変換するコンパイラ
US20090164773A1 (en) Dynamic reconfiguration supporting method, dynamic reconfiguration supporting apparatus, and dynamic reconfiguration system
CN115576608A (zh) 处理器核、处理器、芯片、控制设备和指令融合方法
US8869109B2 (en) Disassembling an executable binary
JP2015197821A (ja) アセンブリコード変換装置およびその変換方法
JP5777843B1 (ja) プロセッサ、処理装置、プログラム作成方法
CN115480871B (zh) 一种通用的tms320c3x处理器指令集虚拟化仿真方法
CN117369830A (zh) 二进制翻译方法、电子设备和可读存储介质
CN114791811B (zh) 一种基于元函数模板的汇编器实现方法
JP2008305337A (ja) プログラム変換装置、プログラム変換方法、プログラム、記憶媒体、デバッグ装置、デバッグ方法及びプログラム開発システム
US6233732B1 (en) Compiling system using intermediate codes to store a plurality of values
US8645758B2 (en) Determining page faulting behavior of a memory operation
CN111399852B (zh) 一种基于dsp处理器特点的指令集静态反汇编方法
WO2011024554A1 (ja) アセンブル装置、構文解析方法、及びアセンブラプログラム
JP2008204023A (ja) プログラマブルコントローラシステム、プログラマブルコントローラのデバッグ方法
CN116775127B (zh) 一种基于RetroWrite框架的静态符号执行插桩方法
CN110262802B (zh) 一种取出机Sequence数据的新型执行方法
JPH11345127A (ja) コンパイラ
CN118012506B (zh) 二进制翻译优化方法、装置、电子设备及存储介质