Namespaces
Variants

asm declaration

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous
Inline assembly

asm-declaration は、C++プログラム内にアセンブリ言語のソースコードを埋め込む機能を提供します。この宣言は 条件付きでサポートされ、 (C++11以降) 実装定義されています。 これは、 実装によっては利用できない可能性があり、たとえ実装によって提供されている場合でも、 (C++11以降) 固定された意味を持たないことを意味します。

目次

構文

attr  (オプション) asm ( string-literal ) ; (C++26まで)
attr  (オプション) asm ( balanced-token-seq ) ; (C++26以降)
attr - (C++11以降) 任意の数の 属性
string-literal - 文字列リテラル と同じ、raw文字列リテラルを含む
balanced-token-seq - 括弧、角括弧、波括弧がバランスしているトークンのシーケンス。 balanced-token-seq に対する制限とその意味は実装定義

説明

balanced-token-seq は通常、アセンブリ言語で記述された短いプログラムを表す文字列リテラルであり、この宣言が実行されるたびに実行されます。さまざまなC++コンパイラは、asm宣言に対して大きく異なる規則を持ち、周囲のC++コードとの相互作用についても異なる規約があります。

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

注記

機能テストマクロ 規格 機能
__cpp_constexpr 201907L (C++20) constexpr関数での自明な デフォルト初期化 asm宣言

キーワード

asm

GCC/Clangコンパイラが提供する2種類のインラインアセンブリ構文を示します。このプログラムはLinux環境のx86_64プラットフォームでのみ正しく動作します。

#include <iostream>
extern "C" int func(int x);
// the definition of func is written in assembly language
// raw string literal could be very useful
asm(R"(
.globl func
    .type func, @function
    func:
    .cfi_startproc
    movl %edi, %eax /* x is in RDI, see x86-64 calling convention */
    addl $1, %eax
    ret
    .cfi_endproc
)");
int main()
{
    int n = func(0110);
    // formerly non-standard inline assembly, made comforming by P2361R6
    asm ("leal (%0,%0,4),%0"
         : "=r" (n)
         : "0" (n));
    std::cout << "73*5 = " << n << std::endl; // flush is intentional
    // standard inline assembly
    asm ("movq $60, %rax\n" // the exit syscall number on Linux
         "movq $2,  %rdi\n" // this program returns 2
         "syscall");
}

出力:

73*5 = 365

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
CWG 195 C++98 すべてのasm宣言をサポートする必要があった 条件付きサポートに変更
CWG 2262 C++11 属性をasm宣言に適用できなかった 許可

参考文献

  • C++26標準 (ISO/IEC 14882:2026):
  • 9.10 asm 宣言 [dcl.asm]
  • C++23標準 (ISO/IEC 14882:2024):
  • 9.10 asm 宣言 [dcl.asm]
  • C++20 標準 (ISO/IEC 14882:2020):
  • 9.10 asm 宣言 [dcl.asm]
  • C++17 規格 (ISO/IEC 14882:2017):
  • 10.4 asm 宣言 [dcl.asm]
  • C++14 規格 (ISO/IEC 14882:2014):
  • 7.4 asm 宣言 [dcl.asm]
  • C++11規格 (ISO/IEC 14882:2011):
  • 7.4 asm 宣言 [dcl.asm]
  • C++03規格 (ISO/IEC 14882:2003):
  • 7.4 asm 宣言 [dcl.asm]
  • C++98標準 (ISO/IEC 14882:1998):
  • 7.4 asm 宣言 [dcl.asm]

関連項目

C ドキュメント for インラインアセンブリ

外部リンク

1. GCC インラインアセンブリ HOWTO
2. GCC インライン ASM — Locklessinc.com
3. IBM XL C/C++ インラインアセンブリ
4. Intel C++ インラインアセンブリ
5. Visual Studio インラインアセンブラ
6. Sun Studio 12 Asm ステートメント
7. Itaniumベース HP-UX 向けインラインアセンブリ
8. X86 呼び出し規約 — Wikipedia