11月
04
アセンブリ言語でプログラミングしたい場合、以下のような方法があります
- インラインアセンブラ
-
- 利点
-
- プロローグ・エピローグを書かなくてよい
- 欠点
-
- 構文がコンパイラによってだいぶ異なる
- Visual C++ で x64 をターゲットにする場合使えない
- intrinsic
-
- 利点
-
- プロローグ・エピローグを書かなくてよい
- コンパイラレベルでの謎技術による最適化がかかる
- C/C++ の構文と intrinsic 関数によるアセンブリ命令とを自然に混在させることができる
- レジスタ割り当てはコンパイラがやってくれる
- 欠点
-
- 一部の命令(主に汎用レジスタ命令)では intrinsic 関数名がコンパイラによって異なる。場合によっては関数自体が無いことがある
- __m128i などの型定義がコンパイラによって異なる
- 関数レベルで VEX プレフィックス命令の使い分けができない(PADDB を使いたいのに VPADDB が使われる、とか)。コンパイルオプションによってファイルレベルで使い分けることはできる
- Visual C++ 2005 だと SSE3 までしか使えない
- 利点
-
- C/C++ としてのコンパイル時には変数でも実行時には定数であるような値を元にした最適化を記述できる
- 欠点
-
- 生成した関数のシンボルはデバッグ情報には当然含まれない
- プロローグ・エピローグを自前で書く必要がある
- ポインタサイズは自分で注意しなければならない
- 利点
-
- 出力される命令を完全に制御できる
- 欠点
-
- プロローグ・エピローグを自前で書く必要がある
- ポインタサイズは自分で注意しなければならない
総合的に見ると intrinsic を使うのが最善(どうしても intrinsic でカバーできない場合は普通のアセンブラを使う)なのですが、もろもろの事情により昔のコンパイラを使っている状態だとそうもいきません。同じように「もろもろの事情により昔のアセンブラを使っている」状態もあり得ますが、私に関していえばそんなことは無いので、全て普通のアセンブラを使うという選択になります。
no comment untill now