名前空間
変種
操作

asm 宣言

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
インラインアセンブリ
 
 

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 - 文字列リテラル(生文字列リテラルを含む)と同じ
balanced-token-seq - 括弧、角括弧、波括弧が対応するトークンのシーケンス。balanced-token-seqに対する制限とその意味は実装定義です。

[編集] 説明

balanced-token-seqは通常、アセンブリ言語で書かれた短いプログラムを表す文字列リテラルであり、この宣言が実行されるたびに実行されます。C++コンパイラによってasm宣言の規則や、周囲のC++コードとの相互作用に関する慣習は大きく異なります。

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

[編集] メモ

機能テストマクロ 規格 機能
__cpp_constexpr 201907L (C++20) constexpr 関数における自明なデフォルト初期化asm-declaration

[編集] キーワード

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 standard (ISO/IEC 14882:2020)
  • 9.10 asm 宣言 [dcl.asm]
  • C++17 standard (ISO/IEC 14882:2017)
  • 10.4 asm 宣言 [dcl.asm]
  • C++14 standard (ISO/IEC 14882:2014)
  • 7.4 asm 宣言 [dcl.asm]
  • C++11 standard (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言語のドキュメントインラインアセンブリについて)

[編集] 外部リンク

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
English 日本語 中文(简体) 中文(繁體)