小さなCプログラム用のアセンブリ生成コードavr-gcc
を見ています。以下は、スタック上に100バイトのローカル配列を割り当てることになっています。Avrアセンブリプログラミング:スタック上のアトミック割り当て
extern void foo(char [], int);
void bar()
{
char t[100];
foo(t,100);
}
そして、もちろん、スタックポインタから100を引くことによって行います。
avrは8ビットマシンなので、16ビットスタックポインタを変更するには2つのステップが必要です(SPHとSPLの変更)。また、割り込みを無効にすることによって、ある程度のアトミック性を提供することは良い考えです。それはシーケンスによって行われます
in r28,__SP_L__
in r29,__SP_H__ ; get SP
subi r28,100 ; new SP in R29:R28 = OLD -100
sbc r29,__zero_reg__
in __tmp_reg__,__SREG__ ; save status to r0
cli ; disable interrupts
out __SP_H__,r29 ; update SPH
out __SREG__,__tmp_reg__ ; restore status -- why here ?
out __SP_L__,r28 ; update SPL
復元ステータス命令の位置はまだわかりません。
なぜはありませんはSPLをアップデートした後に完了しますか?
割り込みを有効にした後で、次の命令が完了する前に割り込みがアカウントに取り込まれないという保証はありますか?