asm 宣言
From cppreference.com
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++コードとの相互作用に関する慣習は大きく異なります。
他のブロックスコープ宣言と同様に、この宣言はブロック(関数本体または別の複合文)の内側に現れることができ、他のすべての宣言と同様に、この宣言はブロックの外側にも現れることができます。
| このセクションは未完成です 理由:GCCの拡張アセンブリ構文に関するメモを書く必要がある。なぜなら、Intel、IBM、Sun(v12以降)などが現在サポートしているから。 |
[編集] メモ
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_constexpr |
201907L |
(C++20) | constexpr 関数における自明なデフォルト初期化とasm-declaration |
[編集] キーワード
[編集] 例
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]
- 9.10
- C++23標準 (ISO/IEC 14882:2024)
- 9.10
asm宣言 [dcl.asm]
- 9.10
- C++20 standard (ISO/IEC 14882:2020)
- 9.10
asm宣言 [dcl.asm]
- 9.10
- C++17 standard (ISO/IEC 14882:2017)
- 10.4
asm宣言 [dcl.asm]
- 10.4
- C++14 standard (ISO/IEC 14882:2014)
- 7.4
asm宣言 [dcl.asm]
- 7.4
- C++11 standard (ISO/IEC 14882:2011)
- 7.4
asm宣言 [dcl.asm]
- 7.4
- C++03 標準 (ISO/IEC 14882:2003)
- 7.4
asm宣言 [dcl.asm]
- 7.4
- C++98 標準 (ISO/IEC 14882:1998)
- 7.4
asm宣言 [dcl.asm]
- 7.4
[編集] 関連項目
| 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 |