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

1 つの変換単位内のすべての __asm 関数の本体は、ARM アセンブラに渡される 1 つのファイルに結合されるかのようにアセンブルされます。アセンブラに渡されるアセンブリ言語フイル内の __asm 関数の順序は、テンプレートのインスタンスを使用して生成される関数を除き、ソースファイル内での順序と同じになります。

Note

復帰命令を省略した場合、ファイル内の 1 つの __asm 関数の最後から次の関数に移ることにより、__asm 関数同士で制御を受け渡すことが可能です。

armcc を呼び出す場合、アセンブラによって生成されたオブジェクトファイルがコンパイラのオブジェクトファイルに結合されます。この結合に使用される部分リンクによって 1 つのオブジェクトファイルが生成されます。

コンパイラは、各 __asm 関数に 1 つの AREA ディレクティブを生成します。Example 42 にこの例を示します。

Example 42.  __asm 関数

#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 セクションに配置されます。つまり、組み込みアセンブリ関数がインライン展開されることはありません。ただし、暗黙にインタンス生成されたテンプレート関数と、インライン関数のアウトオブラインコピーは、その関数の名前が付いた、共通であることを示す特別な性が設定されたエリアに配置されます。これにより、この種の関数の特別なセマンティクスが維持されます。

Note

インライン関数とテンプレート関数のアウトオブラインコピーは、使用されるエリアの命名が特殊であるため、定義された順序ではなく、任意の序で配置されます。したがって、コード実行は必ずしもインライン関数またはテンプレート関数から別の __asm 関数に移るとは限りません。

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0472EJ
Non-ConfidentialID081711