7.20 C および C++ コードのインラインアセンブラの式オペランド

インラインアセンブリ言語命令のレジスタオペランドとして、関数の引数、C または C++ の変数、およびその他の C または C++ の式を指定できます。

ARM 整数レジスタの代わりに使用する式は、 long long を除く整数型( char short int long のいずれか)、 またはポインタ型にする必要があります。 char 型または short 型に対する符号拡張は実行されません。そのため、この 2 つの型には、明示的に符号拡張を実行する必要があります。これらの式を評価してレジスタに割り当てるため、コンパイラによってコードが追加される場合があります。
デスティネーションとしてオペランドが使用されているとき、レジスタを修正する場合にオペランドとして使用する式は修正可能な左辺値でなければなりません。たとえば、デスティネーションレジスタまたはベースレジスタが更新されるベースレジスタがこれに当たります。
複数の式オペランドを含む命令において、式オペランドが評価される順序は決まっていません。
条件付き命令の式オペランドは、命令の条件が真である場合に限り評価されます。
インラインアセンブリコードのオペランドとして C または C++ の式を使用すると、1 つの命令が複数の命令に展開される場合があります。展開は、式の値が、『ARM アーキテクチャリファレンスマニュアル』に記載されている命令オペランドの制約を満たしていない場合に行われます。
オペランドとして使用される式により一時領域が作成され、そのレジスタを破棄する必要がある場合、インラインアセンブリ命令を実行した後で破棄が行われます。これは、一時領域を破棄する C++ の規則に似ています。
単純式オペランドは以下のいずれかになります。
  • 変数の値。
  • 変数のアドレス。
  • ポインタ変数の間接参照。
  • コンパイル時の定数。
以下のいずれかを含む式は、単純式オペランドではありません。
  • 除算などでの暗黙の関数呼び出し、または明示的な関数呼び出し。
  • C++ 一時領域の構築。
  • 算術演算または論理演算。
関連する概念
7.21 C および C++ コードのインラインアセンブラのレジスタリストのオペランド
7.22 C および C++ コードのインラインアセンブラのイミディエートオペランド
関連情報
ARM アーキテクチャリファレンスマニュアル
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.