Inline assembly
インラインアセンブリ(通常は asm キーワードで導入される)は、Cプログラム内にアセンブリ言語のソースコードを埋め込む機能を提供します。
C++とは異なり、C言語ではインラインアセンブリは拡張機能として扱われます。条件付きでサポートされ、実装定義であるため、存在しない可能性があり、実装によって提供されている場合でも固定された意味を持ちません。
目次 |
構文
asm (
string_literal
)
;
|
|||||||||
|
このセクションは不完全です
理由: GCC拡張アセンブリ構文に関する注記を記述する必要があります(現在はIntel、IBM、Sun(v12以降)などでサポートされているため) |
説明
この種類のインラインアセンブリ構文は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 向けインラインアセンブリ |