以下の様な16bit即値をレジスタr0に代入するコードをコンパイルしたところ,エラーとなったので,解決策をメモする.
ターゲットはRaspberry Pi 2.コンパイラはgcc 4.7.2
mov r0, #0xffff
ARMの公式ドキュメントを読んでみると
ARMv6T2 以上のアーキテクチャでは、MOV は 0x0-0xFFFF (0 ~ 65535)範囲内にある任意の 16 ビットの数値をロードできます。
と書かれているので,armv7-aなRaspberry Pi 2では問題ないはずだが……
数分後...
エラーログで調べてみると,stackoverflowに同じ問題で悩んでいる人が居た.
読んでみると,コンパイラにアーキテクチャを教えない場合,armv5としてコンパイルが行われるので,movの範囲が0x00~0xffに制限されてしまうようだ.
ということは,コンパイルオプションに以下を追加してarmv7-aであると知らせるだけで治る...とおもったら,うまくいかなかった.
-march=armv7-a
最終的にmov命令をmovw命令に変更したところ,コンパイルが通った.
movw #0xffff