関数修飾子
__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;
}