7.29 C および C++ コードの組み込みアセンブリ言語関数の制限

組み込みアセンブリ言語関数にはいくつかの制約条件があります。

特に、以下のようになります。
  • 前処理の後に __asm 関数が保持できるのは、以下の組み込みアセンブラを除くアセンブリコードのみです。
    __cpp(expr)
    __offsetof_base(D, B)
    __mcall_is_virtual(D, f)
    __mcall_is_in_vbase(D, f)
    __mcall_offsetof_base(D, f)
    __mcall_this_offset(D, f)
    __vcall_offsetof_vfunc(D, f)
    
  • __asm 関数に関しては、コンパイラによって生成される復帰命令はありません。__asm 関数から復帰するには、復帰命令をアセンブリコードで記述し、この関数の本体内に含める必要があります。

    組み込みアセンブラでは、__asm 関数が必ず定義された順序で発行されるため、上記の処理によって 1 つの関数から次の関数へ移ることが可能になります。ただし、インライン関数とテンプレート関数では動作が異なります。コード実行は必ずしもインライン関数またはテンプレート関数から別の組み込みアセンブリ関数に移るとは限りません。
  • 適用される ARM アーキテクチャ向けプロシージャコール標準(AAPCS)規則が __asm 関数によって変更されることはありません。つまり、__asm 関数が使用できるアセンブリコード(状態変更など)に制限がなくても、__asm 関数と通常の C/C++ 関数との間のすべての呼び出しは、AAPCS に準拠している必要があります。
関連する概念
7.26 コンパイラでの組み込みアセンブラのサポート
7.34 組み込みアセンブラの関連ベースクラスの __offsetof_base キーワード
7.35 組み込みアセンブラのクラスメンバ関数を呼び出すためのコンパイラでサポートされているキーワード
7.30 コンパイラによる組み込みアセンブリ言語関数の生成
7.31 組み込みアセンブラからの C および C++ のコンパイル時の定数式へのアクセス
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.