AVRでファンコントローラを作っていたら、いろいろなところで嵌って何時間も無駄にしたので、後学のために何があったかを書いておく。

GCC拡張インラインアセンブラ構文の嵌りどころ

GCCの拡張インラインアセンブラ構文を使うときはマニュアルをよく読まないとこういう目にあう

入力オペランドと出力オペランドは同じレジスタに割り当てられることがある

同じレジスタに割り当てられるとまずい場合は出力オペランドの制約に&をつける。付け忘れていたら最適化をかけたときに入力と出力が同じレジスタに割り当てられて嵌った。

NG: asm volatile("..." : [output] "=r" (...) : [input] "r" (...));
OK: asm volatile("..." : [output] "=&r" (...) : [input] "r" (...));

入力オペランドを割り当てたレジスタが変更されないこと前提で最適化が行われる

続きを読む

プロフィール画像

Kazutoshi Noguchi

🐈🧑‍💻🚩🐧❄️⚡🚐🔧💄👘❤️💜💙🔇

IT Engineer

Japan