7.6 __asm および asm コンパイラキーワードのインラインアセンブラ規則

__asm 、および asm キーワードに適用される規則が数多くあります。

以下の規則があります。
  • 同一行に複数の命令を含める場合、個々の命令をセミコロン(;)で区切る必要があります。
  • 1 つの命令が複数行に及ぶ場合、バックスラッシュ(\)を使用して行が継続することを指定する必要があります。
  • 命令を複数行に記述する形式では、インラインアセンブリ言語ブロック内の任意の場所に C および C++ のコメントを使用できます。ただし、1 行に複数の命令が含まれている場合、その行にコメントを含めることはできません。
  • アセンブリ言語ではコンマ(,)を区切り文字として使用するので、コンマ演算子が含まれた C 言語の式は、式であることを区別するために丸括弧で囲む必要があります。
    __asm
    {
        ADD x, y, (f(), z)
    }
    
  • ラベルの後には、C および C++ のラベルのように、コロン(:)を記述する必要があります。
  • asm ステートメントは C++ 関数内に配置する必要があります。 asm ステートメントは、 C++ ステートメントが記述されるべき場所であればどこでも使用できます。
  • インラインアセンブリコード内のレジスタ名は、C または C++ の変数として処理されます。それらのレジスタ名は、必ずしも同名の物理レジスタと関連するわけではありません。レジスタを C または C++ の変数として宣言していないと、コンパイラにより警告が表示されます。
  • インラインアセンブリコードにレジスタを保存および復元しないで下さい。レジスタの保存および復元は、コンパイラにより行われます。また、インラインアセンブラは物理レジスタに直接アクセスできません。ただし、仮想レジスタとして動作する変数を介して間接アクセスが提供されます。
    ASPRCPSR、および SPSR を除くレジスタが、書き込まれていないのに読み出された場合、エラーメッセージが表示されます。例えば、
    int f(int x)
    {
        __asm
        {
            STMFD sp!, {r0}    // save r0 - illegal: read before write
            ADD r0, x, 1
            EOR x, r0, x
            LDMFD sp!, {r0}    // restore r0 - not needed.
        }
        return x;
    }
    
    上記の関数は以下のように記述する必要があります。
    int f(int x)
    {
        int r0;
        __asm
        {
            ADD r0, x, 1
            EOR x, r0, x
        }
        return x;
    }
    
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.