/home/tnishinaga/TechMEMO

日々行ったこと、面白かったことを書き留めます。

ARMアセンブラの16bit即値代入でコンパイルエラーが出た件

以下の様な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に同じ問題で悩んでいる人が居た.

stackoverflow.com

読んでみると,コンパイラアーキテクチャを教えない場合,armv5としてコンパイルが行われるので,movの範囲が0x00~0xffに制限されてしまうようだ.

ということは,コンパイルオプションに以下を追加してarmv7-aであると知らせるだけで治る...とおもったら,うまくいかなかった.

-march=armv7-a

最終的にmov命令をmovw命令に変更したところ,コンパイルが通った.

movw #0xffff