インラインアセンブリ
From cppreference.com
インラインアセンブリ(通常は asm キーワードで導入されます)は、Cプログラム内にアセンブリ言語ソースコードを埋め込む機能を提供します。
C++とは異なり、Cではインラインアセンブリは拡張機能として扱われます。これは条件付きでサポートされ、実装定義であるということです。つまり、存在しない場合があり、実装によって提供されている場合でも、固定の意味を持たないということです。
目次 |
[編集] 構文
asm ( 文字列リテラル ) ; |
|||||||||
| このセクションは未完成です 理由:GCC拡張アセンブリ構文に関する注記。これは現在、Intel、IBM、Sun(v12以降)などでもサポートされているため。 |
[編集] 説明
この種のインラインアセンブリ構文はC++標準で受け入れられ、C++では*asm宣言*と呼ばれます。文字列リテラルは通常、アセンブリ言語で書かれた短いプログラムであり、この宣言が実行されるたびに実行されます。異なるCコンパイラは、asm宣言に対して非常に異なる規則を持ち、周囲の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++ ドキュメント (
asm 宣言について) |
[編集] 外部リンク
| 1. | GCCインラインアセンブリHOWTO |
| 2. | IBM XL C/C++ インラインアセンブリ |
| 3. | Intel C++ インラインアセンブリ |
| 4. | Visual Studio インラインアセンブラ |
| 5. | Sun Studio 12 アセンブリ文 |
| 6. | ItaniumベースHP-UX用インラインアセンブリ |