キーワード asm は、アセンブリー・コードを表します。コンパイラーは、厳しい言語レベル下でコンパイルされる場合、
宣言内のキーワード asm を認識してそれを無視します。
拡張言語レベルで、コンパイラーは、C ソース・ステートメントと C++ ソース・ステートメント
で指定された組み込みアセンブリー・コード・フラグメントに関する部分的なサポートを提供します。
この拡張機能は、一般的なシステム・プログラミング・コード、
カーネル、および最初は GNU C で開発されたデバイス・ドライバーで使用するためにインプリメントされています。
構文は以下のとおりです。
>>-+-asm-----+--+----------+------------------------------------>
+-__asm---+ '-volatile-'
'-__asm__-'
.-:--------------.
V |
>--(----code_format_string----+------------+-+----)------------><
+-| output |-+
+-| input |--+
'-clobbers---'
input:
.-,------------------------------.
V |
|----constraint--(--C_expression--)-+---------------------------|
output:
.-,------------------------------.
V |
|----constraint--(--C_expression--)-+---------------------------|
ここで、
- volatile
- アセンブラー命令が、
output、input、
または clobbers にリストされていないメモリーを更新する可能性があることを、コンパイラーに指示します。
- code_format_string
- asm 命令のソース・テキストで、
printf フォーマット指定子に類似したストリング・リテラルです。
- input
- コンマで区切られた、入力オペランドのリスト。
- output
- コンマで区切られた、出力オペランドのリスト。
- clobbers
- コンマで区切られた、二重引用符で囲まれた登録名のリスト。
これらは、asm 命令によって更新できる登録です。
- constraint
- オペランドの制約を指定するストリング・リテラルで、制約ごとに 1 文字。
- C_expression
- 値が asm 命令のオペランドとして使用される C または C++ 式。出力オペランドは。変更可能な左辺値でなければなりません。
次の制約がサポートされます。
- =
- 書き込み専用オペランド。
- +
- 読み取りおよび書き込みオペランド。
- &
- 入力オペランドを使用して命令を終了する前に、オペランドは変更される場合があります。
入力として使用されるレジスターは、ここで再利用してはなりません。
- b
- ゼロ以外の汎用レジスターを使用。
- f
- 浮動小数点レジスターを使用。
- g
- 汎用レジスター、メモリー、または即値オペランドを使用。
- i
- 即時整数オペランド。
- m
- マシンによってサポートされるメモリー・オペランド。
- n
- i と同じ方法で処理。
- o
- m と同じ方法で処理。
- r
- 汎用レジスターを使用。
- v
- ベクトル・レジスターを使用。
- 0、1、2、...66
- マッチング制約。対応する入力と同じレジスターを出力で割り振る。
- I、J、K、M、N、O、P、G、S、T
- 定数値。オペランド内の式を折り返し、その値を % 指定子に置換する。
制約事項
アセンブラー命令は、asm
ステートメント内で必要なものを完備していなければなりません。asm
ステートメントは、命令を生成するためにのみ使用できます。
残りのプログラムに対するすべての関連付けは、output および
input オペランド・リストによって設定する必要があります。具体的には以下のとおりです。
- 別の asm ステートメント内のラベルへのブランチはサポートされていません。
- オペランド・リストを経過せずに、外部シンボルを直接参照することはサポートされていません。
- 接尾部 .section、.text、または .data
を持つ命令などの、疑似演算子およびディレクティブは、サポートされていません。
- 1 つの asm ステートメント内の命令の総数が 63 を超えることはできません。
命令カウントには、オペランド・リストのオペランドを処理するためにコンパイラーで生成された命令も組み込む必要があります。
関連参照
