7.30 コンパイラによる組み込みアセンブリ言語関数の生成

1 つの変換単位内のすべての __asm 関数の本体は、ARM アセンブラに渡される 1 つのファイルに結合されるかのようにアセンブルされます。

アセンブラに渡されるアセンブリ言語ファイル内の __asm 関数の順序は、テンプレートのインスタンスを使用して生成される関数を除き、ソースファイル内での順序と同じになります。

復帰命令を省略した場合、ファイル内の 1 つの __asm 関数の最後から次の関数に移ることにより、__asm 関数同士で制御を受け渡すことが可能です。
armcc を呼び出す場合、アセンブラによって生成されたオブジェクトファイルがコンパイラのオブジェクトファイルに結合されます。この結合に使用される部分リンクによって 1 つのオブジェクトファイルが生成されます。
コンパイラは、各 __asm 関数に 1 つの AREA ディレクティブを生成します。以下にこの例を示します。
#include <cstddef>
struct X
{
    int x,y;
    void addto_y(int);
};
__asm void X::addto_y(int)
{
    LDR      r2, [r0, #__cpp(offsetof(X, y))]
    ADD      r1, r2, r1
    STR      r1, [r0, #__cpp(offsetof(X, y))]
    BX       lr
}
以下が生成されます。
    AREA ||.emb_text||, CODE, READONLY
    EXPORT |_ZN1X7addto_yEi|
#line num "file"
|_ZN1X7addto_yEi| PROC
    LDR r2, [r0, #4]
    ADD r1, r2, r1
    STR r1, [r0, #4]
    BX lr
    ENDP
    END
offsetof は、cstddef ヘッダファイルから取得される通常の offsetof マクロであるため、__cpp() の中で使用する必要があります。
通常の __asm 関数は、.emb_text という名前の ELF セクションに配置されます。つまり、組み込みアセンブリ関数がインライン展開されることはありません。ただし、暗黙にインスタンス生成されたテンプレート関数と、インライン関数のアウトオブラインコピーは、その関数の名前が付いた、共通であることを示す特別な属性が設定されたエリアに配置されます。これにより、この種の関数の特別なセマンティクスが維持されます。

インライン関数とテンプレート関数のアウトオブラインコピーは、使用されるエリアの命名が特殊であるため、定義された順序ではなく、任意の順序で配置されます。したがって、コード実行は必ずしもインライン関数またはテンプレート関数から別の __asm 関数に移るとは限りません。
関連する概念
7.26 コンパイラでの組み込みアセンブラのサポート
7.29 C および C++ コードの組み込みアセンブリ言語関数の制限
関連情報
ELF for the ARM Architecture
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.