AVRでファンコントローラを作っていたら、いろいろなところで嵌って何時間も無駄にしたので、後学のために何があったかを書いておく。
GCC拡張インラインアセンブラ構文の嵌りどころ
GCCの拡張インラインアセンブラ構文を使うときはマニュアルをよく読まないとこういう目にあう
入力オペランドと出力オペランドは同じレジスタに割り当てられることがある
同じレジスタに割り当てられるとまずい場合は出力オペランドの制約に&
をつける。付け忘れていたら最適化をかけたときに入力と出力が同じレジスタに割り当てられて嵌った。
NG: asm volatile("..." : [output] "=r" (...) : [input] "r" (...));
OK: asm volatile("..." : [output] "=&r" (...) : [input] "r" (...));