ARM Cortex-M3用のIARコンパイラは、インラインアセンブリを提供します。特定の関数のアドレスをスタック上の場所に格納するにはどうすればよいですか?
Cコードはこれを望みます
void tick();
void bar()
{
int x;
// modify a value on stack
(&x)[4] = &tick;
}
これは一般的に機能しますが、リリースビルドのコンパイラによって最適化されます。インラインアセンブリでコーディングしようとしました
void bar()
{
int x;
asm("ldr r0,%0" : : "i" (&tick));
asm("str r0,[sp+#0x10];
}
ldr
命令はIARコンパイラによって受け入れられません。問題は、この命令にはレジスタとオフセットを備えたアドレッシングモードが必要なことです。関数の実際のアドレスは関数のtick
後ろに格納され、ldr
命令は実際のアドレスを保持するメモリ位置へのオフセットのみを保持します。分解は次のようになります。
ldr r0,??tick_address
str r0,[sp+#0x10]
bx lr ; return
??tick_address dd tick
tick
スタック操作に使用するために、レジスタのアドレスをすぐに取得するにはどうすればよいですか?