7.23 C および C++ コードのインラインアセンブラの関数呼び出しと分岐

インラインアセンブラで記述された BL 命令と SVC 命令を使用して、通常の命令フィールドの後に 3 つのオプションリストを指定できます。

これらの命令の形式は以下のとおりです。
SVC{cond} svc_num, {input_param_list}, {output_value_list}, {corrupt_reg_list}
BL{cond} function, {input_param_list}, {output_value_list}, {corrupt_reg_list}

RVCT v3.0 では、SWI 命令は SVC という名前に変更されました。インラインアセンブラは引き続き、SVC の代わりに SWI を受け入れます。
アーキテクチャ 5TE 以降を対象にコンパイルする場合、必要に応じてリンカにより BL function 命令が BLX function 命令に変換されます。ただし、インラインアセンブリコード内から直接 BLX function 命令を使用することはできません。
  • input_param_list では、関数呼び出しまたは SVC 命令への入力パラメータとなる、式または変数と、その式または変数を保持する物理レジスタが指定されます。これらは物理レジスタへの引数または物理レジスタ名として指定されます。1 つのリストの中で、入力レジスタをこの 2 種類の方法で指定できます。
    インラインアセンブラを使用することにより、BL または SVC 命令が開始される前に、指定された物理レジスタ内に正しい値が保持されます。引数を取らない物理レジスタ名が指定されることで、同じ名前の仮想レジスタ内の値が、その物理レジスタ内に渡されます。これによって既存のインラインアセンブリ言語コードとの下位互換性が保たれます。
    例えば、以下の命令
    BL foo, { r0=expression1, r1=expression2, r2 }
    
    からは、以下の疑似コードが生成されます。
    MOV (physical) r0, expression1
    MOV (physical) r1, expression2
    MOV (physical) r2, (virtual) r2
    BL foo
    
    デフォルトでは、 input_param_list 入力パラメータを指定しない場合、レジスタ r0r3 が入力パラメータとして使用されます。

    入力パラメータリストでは、lrsp、または pc レジスタを指定できません。
  • output_value_list では、BL または SVC 命令からの出力値を保持する物理レジスタと、それらの出力値をストアする場所が指定されます。これらの出力値は、物理レジスタから修正可能な左辺値式への引数として、または個々の物理レジスタの名前として指定されます。
    インラインアセンブラは、指定された物理レジスタから値を取得し、指定された式にそれらの値を代入します。引数なしで物理レジスタ名が指定されていると、同じ名前の仮想レジスタが、その物理レジスタから取得した値で更新されます。
    例えば、以下の命令
    BL foo, { }, { result1=r0, r1 }
    
    からは、以下の疑似コードが生成されます。
    BL foo
    MOV result1, (physical) r0
    MOV (virtual) r1, (physical) r1
    
    デフォルトでは、 output_value_list 出力値を指定しない場合、レジスタ r0 が出力値に使用されます。

    出力値リストでは、lrsp、または pc レジスタを指定できません。
  • corrupt_reg_list では、呼び出される側の関数により破壊される物理レジスタが指定されます。呼び出される側の関数により条件フラグが変更される場合、破壊レジスタリストに PSR を指定する必要があります。
    BL 命令と SVC 命令は、常に lr の値を破壊します。
    corrupt_reg_list を省略した場合に、BL 命令と SVC 命令を使用すると、レジスタ r0 ~ r3lr、および PSR の値が破壊されます。
    C または C++ の単一の関数内でラベルにジャンプできるのは、分岐命令 B のみです。
    デフォルトでは、 corrupt_reg_list レジスタを指定しない場合、r0r3r14、および PSR の値を破壊することができます。

    破壊レジスタリストでは、lrsp、または pc レジスタを指定できません。
リストが指定されていない場合は、以下のように処理されます。
  • r0 ~ r3 が入力パラメータとして使用されます。
  • r0 が出力値として使用されます。この値は破損している可能性があります。
  • r0r3r14、および PSR は破損している可能性があります。

  • インラインアセンブラでは、BXBLX、および BXJ 命令がサポートされていません。
  • 入力レジスタリスト、出力レジスタリスト、破壊レジスタリストのいずれにおいても、lrsppc のどのレジスタも指定できません。
  • sp レジスタは、SVC 命令または関数呼び出しで変更しないで下さい。
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.