名前空間
変種
操作

インラインアセンブリ

From cppreference.com
< c‎ | language

インラインアセンブリ(通常は asm キーワードで導入されます)は、Cプログラム内にアセンブリ言語ソースコードを埋め込む機能を提供します。

C++とは異なり、Cではインラインアセンブリは拡張機能として扱われます。これは条件付きでサポートされ、実装定義であるということです。つまり、存在しない場合があり、実装によって提供されている場合でも、固定の意味を持たないということです。

目次

[編集] 構文

asm ( 文字列リテラル ) ;

[編集] 説明

この種のインラインアセンブリ構文はC++標準で受け入れられ、C++では*asm宣言*と呼ばれます。文字列リテラルは通常、アセンブリ言語で書かれた短いプログラムであり、この宣言が実行されるたびに実行されます。異なるCコンパイラは、asm宣言に対して非常に異なる規則を持ち、周囲のCコードとの相互作用についても異なる慣習を持っています。

asm宣言はブロック(関数の本体または別の複合文)内に現れることがあり、他のすべての宣言と同様に、この宣言はブロックの外にも現れることができます。

[編集] 注意

MSVCはARMおよびx64プロセッサではインラインアセンブリをサポートしておらず、x86プロセッサでは__asmで導入された形式のみをサポートしています。

GCCまたはClangでISO Cモード(例:オプション-std=c11)でコンパイルする場合、asmの代わりに__asm__を使用する必要があります。

[編集]

GCCコンパイラが提供する2種類のインラインアセンブリ構文を示します。このプログラムは、Linux上のx86-64プラットフォームでのみ正しく動作します。「標準インラインアセンブリ」もC標準では拡張機能として扱われることに注意してください。

#include <stdio.h>
 
extern int func(void);
// the definition of func is written in assembly language
__asm__(".globl func\n\t"
        ".type func, @function\n\t"
        "func:\n\t"
        ".cfi_startproc\n\t"
        "movl $7, %eax\n\t"
        "ret\n\t"
        ".cfi_endproc");
 
int main(void)
{
    int n = func();
    // gcc's extended inline assembly
    __asm__ ("leal (%0,%0,4),%0"
           : "=r" (n)
           : "0" (n));
    printf("7*5 = %d\n", n);
    fflush(stdout); // flush is intentional
 
    // standard inline assembly in C++
    __asm__ ("movq $60, %rax\n\t" // the exit syscall number on Linux
             "movq $2,  %rdi\n\t" // this program returns 2
             "syscall");
}

出力

7*5 = 35

[編集] 参考文献

  • C23標準 (ISO/IEC 9899:2024)
  • J.5.10 asm キーワード (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • J.5.10 asm キーワード (p: 422)
  • C11標準 (ISO/IEC 9899:2011)
  • J.5.10 asm キーワード (p: 580)
  • C99標準 (ISO/IEC 9899:1999)
  • J.5.10 asm キーワード (p: 512)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • G.5.10 asm キーワード

[編集] 関連項目

C++ ドキュメントasm 宣言について)

[編集] 外部リンク

1.  GCCインラインアセンブリHOWTO
2.  IBM XL C/C++ インラインアセンブリ
3.  Intel C++ インラインアセンブリ
4.  Visual Studio インラインアセンブラ
5.  Sun Studio 12 アセンブリ文
6.  ItaniumベースHP-UX用インラインアセンブリ
English 日本語 中文(简体) 中文(繁體)