Namespaces
Variants

Inline assembly

From cppreference.net

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

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

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、リンク先は一切変更していません - C++関連の用語(Syntax、Explanation、Notes、Examples、References、See also、External links)は原文のまま保持しています - 数値や書式設定は完全に維持しています

構文

asm ( string_literal ) ;

説明

この種類のインラインアセンブリ構文はC++標準で受け入れられており、C++では asm-declaration と呼ばれます。 string_literal は通常、アセンブリ言語で記述された短いプログラムであり、この宣言が実行されるたびに実行されます。異なるCコンパイラはasm-declarationに対して大きく異なる規則を持ち、周囲の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++ ドキュメント for asm declaration

外部リンク

1. GCC インラインアセンブリ HOWTO
2. IBM XL C/C++ インラインアセンブリ
3. Intel C++ インラインアセンブリ
4. Visual Studio インラインアセンブラ
5. Sun Studio 12 Asm ステートメント
6. Itaniumベース HP-UX 向けインラインアセンブリ