インラインアセンブラ
From Wikipedia, the free encyclopedia
コンパイラの一機能を指しており、高水準言語で書かれたソースコードに埋めこまれたアセンブリ言語によるコードも機械語に変換する機能のこと。
この機能があれば、アセンブリ言語で書かれたコードをわざわざ別途アセンブラでアセンブル(機械語に変換)してリンクするという手間が省ける。特定のプロセッサが持つ特殊な拡張命令も使えるというメリットや、高速化が図れるなどのメリットがある[1]。
一方デメリットとして、機種に強く依存したアセンブリ言語のコードをソースコードに含んでしまうことになるため、C言語などの高級言語の強みであるソースレベル互換性が低下する。
インラインアセンブラを利用する目的には次のようなものがある。
- 最適化
- アルゴリズムで最も性能に影響する部分をアセンブリ言語に置き換える。これによりプログラマはコンパイラの制約を受けることなく自由に細工を施すことができる。
- プロセッサ固有の特殊な命令の利用
- コンペア・アンド・スワップやテスト・アンド・セットのような、セマフォやロックを実装するための命令があるプロセッサがあるが、それらの機能を言語拡張などではなく[2]、インラインアセンブラにより直接簡便に利用できる。他には、SIMD拡張命令など具体的にはSPARCのVIS、インテルのMMXやSSE、モトローラのAltivecといった命令はコンパイラからの有効的利用が難しく(研究はさかんに行われているが)、インラインアセンブラを利用してC言語中から直接利用することで高い性能を実現できることがある。
- システムコール
- システムコールのAPIは、現代では通常はC言語のライブラリとして定義されているが、上述の特殊な命令と同様にSVC命令などを直接利用して呼び出すためにアセンブリ言語が利用される。
最適化の例とプロセッサ固有命令の例
x86のFPUを利用して変数xのタンジェントを計算するD言語で記述されたインラインアセンブラの例。x86系プロセッサで利用可能な円周率の近似値を得るためのfldpi命令を利用でき、コンパイラが浮動小数点を用いた場合より高速である。
// 変数xのタンジェントを計算する
real tan(real x)
{
asm
{
fld x[EBP] ; // xをロード
fxam ; // 不正な値の検査
fstsw AX ;
sahf ;
jc trigerr ; // xはNAN(非数)、無限、または空
// 387は非正規化数を扱えない
SC18: fptan ;
fstp ST(0) ; // dump X, which is always 1
fstsw AX ;
sahf ;
jnp Lret ; // C2 = 1 (xは範囲外)
// argument reductionしてxを有効範囲内に収める
fldpi ;
fxch ;
SC17: fprem1 ;
fstsw AX ;
sahf ;
jp SC17 ;
fstp ST(1) ; // piをスタックから除去
jmp SC18 ;
}
trigerr:
return real.nan;
Lret:
;
}