asm ステートメント

キーワード asm は、アセンブリー・コードを表します。コンパイラーは、厳しい言語レベル下でコンパイルされる場合、 宣言内のキーワード asm を認識してそれを無視します。

Linux

拡張言語レベルで、コンパイラーは、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
アセンブラー命令が、 outputinput、 または 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 オペランド・リストによって設定する必要があります。具体的には以下のとおりです。

関連参照

IBM Copyright 2003