7.27 C および C++ の組み込みアセンブラ構文

組み込みアセンブリ言語関数定義は、関数修飾子 __asm (C および C++)または asm (C++)によってマークされます。

関数修飾子 __asm および asm は、以下の関数で使用できます。
  • メンバ関数。
  • 非メンバ関数。
  • テンプレート関数。
  • テンプレートクラスメンバ関数。
__asm または asm で宣言される関数は引数を取ることができ、型を返します。これらの関数は、C や C++ の通常の関数と同じように、C や C++ から呼び出されます。組み込みアセンブリ言語関数の構文は以下のとおりです。
__asm return-type function-name(parameter-list)
{
  // ARM/Thumb アセンブリコード
  instruction{;comment is optional}
  ...
  instruction
}

パラメータリスト内に引数名を指定することができますが、これらの引数名は組み込みアセンブリ関数の本体内では使用できません。例えば、以下の関数では、関数の本体で整数 i が使用されていますが、アセンブリではこの整数は無効となります。
__asm int f(int i)
{
    ADD i, i, #1 // エラー
}
例えば、このような場合は、i の代わりに r0 を使用することができます
以下の例では、まだ完全に最適化されていない組み込みアセンブラルーチンとしての文字列コピールーチンを示します。
#include <stdio.h>
__asm void my_strcpy(const char *src, char *dst)
{
loop
      LDRB  r2, [r0], #1
      STRB  r2, [r1], #1
      CMP   r2, #0
      BNE   loop
      BX    lr
}
int main(void)
{
    const char *a = "Hello world!";
    char b[20];
    my_strcpy (a, b);
    printf("Original string: '%s'\n", a);
    printf("Copied   string: '%s'\n", b);
    return 0;
}
関連する概念
7.26 コンパイラでの組み込みアセンブラのサポート
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.