名前空間
変種
操作

asm 宣言

提供: cppreference.com
< cpp‎ | language
 
 
C++言語
一般的なトピック
フロー制御
条件付き実行文
繰り返し文 (ループ)
ジャンプ文
関数
関数宣言
ラムダ関数宣言
inline 指定子
例外指定(C++20未満)
noexcept 指定子(C++11)
例外
名前空間
指定子
decltype(C++11)
auto(C++11)
alignas(C++11)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点
文字 - 文字列 - nullptr(C++11)
ユーザ定義(C++11)
ユーティリティ
属性(C++11)
typedef 宣言
型エイリアス宣言(C++11)
キャスト
暗黙の変換 - 明示的な変換
static_cast - dynamic_cast
const_cast - reinterpret_cast
メモリ確保
クラス
クラス固有の関数特性
特別なメンバ関数
テンプレート
その他
インラインアセンブリ
 
 

asm 宣言は C++ のプログラム内にアセンブリ言語のソースコードを埋め込む能力を与えます。 この宣言は条件的にサポートされ、処理系定義です。 つまり、存在しないかもしれず、処理系によって提供されるときでも、固定の意味を持ちません。

目次

[編集]構文

asm (string_literal);

[編集]説明

string_literal は、一般的には、この宣言が実行されるときに実行される、アセンブリ言語で書かれた短いプログラムです。 コンパイラによって、 asm 宣言に対するルールが大きく異なり、周囲の C++ コードとのやり取りのための規約が異なります。

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

[編集]

GCC コンパイラによって提供されている2種類のインラインアセンブリ構文をデモンストレーションします。 このプログラムは x86_64 プラットフォームの Linux 上でのみ正しく動作します。

#include <iostream>   extern"C"int func();// func の定義はアセンブリ言語で記述されます。// 生文字列リテラルが非常に便利です。 asm(R"( .globl func .type func, @function func: .cfi_startproc movl $7, %eax ret .cfi_endproc )");   int main(){int n = func();// 拡張インラインアセンブリ。 asm ("leal (%0,%0,4),%0":"=r"(n):"0"(n));std::cout<<"7*5 = "<< n <<std::endl;// 意図的にフラッシュしています。   // 標準インラインアセンブリ。 asm ("movq $60, %rax\n\t"// Linux における exit システムコールの番号。"movq $2,  %rdi\n\t"// このプログラムは 2 を返します。"syscall");}

出力:

7*5 = 35

[編集]外部リンク

close