インライン・アセンブラとは? わかりやすく解説

Weblio 辞書 > 同じ種類の言葉 > 情報 > コンピュータ > アセンブラ > インライン・アセンブラの意味・解説 

インラインアセンブラ

【英】inline assembler

インラインアセンブラとは、C言語C++言語中に直接アセンブリ言語書けるようにするコンパイラ機能のことである。

アセンブルやリンクを別に実行する必要がなくなるため、独立したアセンブラ用いるよりも利便性が増す。また、メモリ使用量減少させ、マイクロプロセッサが持つ拡張命令利用できたり、加えて実行速度高められるなどのメリットを持つ。ただし、ソースコード一部に、低級言語アセンブリ言語書くことになるため、機種依存性高くなり、結果として移植性低くなるというデメリットも持つ。

プログラミングのほかの用語一覧
開発環境:  アセンブラ  アセンブル  インデント  インラインアセンブラ  インクルード  オプティマイザ  オプティマイズ

インラインアセンブラ

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2025/01/12 15:50 UTC 版)

インラインアセンブラ: inline assembler)は、主にC言語C++などで書かれたプログラムの中にアセンブリ言語によるプログラムを埋め込むことができるようにする、コンパイラの機能である[1]

概要

コンパイラの一機能を指しており、高水準言語で書かれたソースコードに埋めこまれたアセンブリ言語によるコードも機械語に変換する機能のこと。

この機能があれば、アセンブリ言語で書かれたコードをわざわざ別途アセンブラでアセンブル(機械語に変換)してリンクするという手間が省ける。特定のプロセッサが持つ特殊な拡張命令も使えるというメリットや、高速化が図れるなどのメリットがある[1]

一方デメリットとして、機種に強く依存したアセンブリ言語のコードをソースコードに含んでしまうことになるため、C言語などの高級言語の強みであるソースレベル互換性が低下する。

インラインアセンブラを利用する目的には次のようなものがある。

最適化
アルゴリズムで最も性能に影響する部分をアセンブリ言語に置き換える。これによりプログラマはコンパイラの制約を受けることなく自由に細工を施すことができる。
プロセッサ固有の特殊な命令の利用
コンペア・アンド・スワップテスト・アンド・セットのような、セマフォやロックを実装するための命令があるプロセッサがあるが、それらの機能を言語拡張などではなく[2]、インラインアセンブラにより直接簡便に利用できる。他には、SIMD拡張命令など具体的にはSPARCVISインテルMMXSSEモトローラAltivecといった命令はコンパイラからの有効的利用が難しく(研究はさかんに行われているが)、インラインアセンブラを利用してC言語中から直接利用することで高い性能を実現できることがある。
システムコール
システムコールのAPIは、現代では通常はC言語のライブラリとして定義されているが、上述の特殊な命令と同様にSVC命令などを直接利用して呼び出すためにアセンブリ言語が利用される。

最適化の例とプロセッサ固有命令の例

x86FPUを利用して変数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:
   ;
}

システムコールの例

メモリが保護されている環境でOSの機能を直接呼び出すことは一般的に不可能である。OSはユーザーモードより上位の特権モード(カーネルモード)で動作しており、OSにリクエストするためには(ソフトウェア)割り込みを利用する。これを行う機能をもつ高級言語はほとんどなく、システムコールのためのラッパー関数はインラインアセンブラを用いて記述されている。

下記のC言語によるサンプルにはシステムコールのラッパーも含まれる。一般的にはマクロと組み合わせて記述するが、ここでは説明のためにあえてマクロを利用していない。

基本的なインラインアセンブラの形式は非常に単純である。基本形は下記のとおり(GCCのみ、Visual Studio では __asm{ }の形式に直す必要がある)。

asm("アセンブリコード");

例:

asm("movl %ecx, %eax"); /* ecxの中身をeaxに移動する */

または

__asm__("movb %bh, (%eax)"); /* bhから1バイトをeaxが指し示すメモリに移動する */

asm__asm__はいずれも正しい。もしasmというキーワードがソースコード中のほかのキーワードと重複している場合は__asm__を利用してもよい。

extern int errno;

int funcname(int arg1, int *arg2, int arg3)
{
  int res;
  __asm__ volatile(
    "int $0x80"        /* OSに命令を発行する */
    : "=a" (res)       /* eaxの中身("a")を結果として返す */
      "+b" (arg1),     /* arg1をebxに渡す ("b") */
      "+c" (arg2),     /* arg2をecxに渡す ("c") */
      "+d" (arg3)      /* arg3をedxに渡す ("d") */
    : "a"  (128)       /* システムコール番号をeaxに渡す ("a") */
    : "memory", "cc"); /* メモリと条件レジスタが修正されたことをコンパイラに通知する */

  /* エラーが発生した場合、OSは負数を返す。
   * エラーが発生するとラッパー関数は-1を返し、グローバル変数errnoに値をセットする */
  if (-125 <= res && res < 0) {
    errno = -res;
    res   = -1;
  }  
  return res;
}

  1. ^ a b IT用語辞典バイナリ【インラインアセンブラ】[1]
  2. ^ GCCはそれらをサポートする組込み関数を持っている( https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html

外部リンク


インラインアセンブラ

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/13 22:03 UTC 版)

Microsoft Visual C++」の記事における「インラインアセンブラ」の解説

_asmや__asmキーワードによる記述C++標準規格定められているasm文には対応していない。x64/IA64では使用できず、別途アセンブラ記述する組込関数代替する。

※この「インラインアセンブラ」の解説は、「Microsoft Visual C++」の解説の一部です。
「インラインアセンブラ」を含む「Microsoft Visual C++」の記事については、「Microsoft Visual C++」の概要を参照ください。

ウィキペディア小見出し辞書の「インライン・アセンブラ」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



インライン・アセンブラと同じ種類の言葉


英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「インライン・アセンブラ」の関連用語

インライン・アセンブラのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



インライン・アセンブラのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
IT用語辞典バイナリIT用語辞典バイナリ
Copyright © 2005-2025 Weblio 辞書 IT用語辞典バイナリさくいん。 この記事は、IT用語辞典バイナリの【インラインアセンブラ】の記事を利用しております。
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのインラインアセンブラ (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、WikipediaのMicrosoft Visual C++ (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS