7.25 インラインアセンブラと仮想レジスタ

コンパイラのインラインアセンブリコードでは、常に仮想レジスタが指定されます。

コード生成時に、各命令に使用する物理レジスタが選択され、アセンブリコードと周辺の C コードまたは C++ コードが完全に最適化されます。
pcr15)、lrr14)、および spr13)のレジスタにはアクセスできません。これらのレジスタへのアクセスが試行されると、エラーメッセージが生成されます。
仮想レジスタの初期値は定義されていません。したがって、仮想レジスタを読み出すには、その前に書き込みを行う必要があります。コードによって仮想レジスタへの書き込みの前に読み出しが行われると、コンパイラにより警告が生成されます。また、インラインアセンブリコードの最初で物理レジスタ内の特定の値に依存する従来のコードについても、コンパイラは同様の警告を生成します。以下に例を示します。
int add(int i, int j)
{
    int res;
    __asm
    {
        ADD res, r0, r1   //  r0 で渡される i と r1 で渡される j に依存
    }
    return res;
}
上記のコードを実行すると、警告とエラーメッセージが表示されます。
これらのエラーの原因は、仮想レジスタ r0 および r1 が書き込み前に読み出されるためです。また、これらの警告の原因は、r0 および r1 が C または C++ の変数として定義される必要があるためです。正しいコードを以下に示します。
int add(int i, int j)
{
    int res;
    __asm
    {
        ADD res, i, j
    }
    return res;
}
関連する概念
7.14 C および C++ コードのインラインアセンブラおよびレジスタアクセス
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.