関数ポインタの値が THUMB モードで異なる
適用先: ARM 開発ツール
回答
この記事に含まれている情報の適用先:
- ARM ツールの全バージョン
質問
以下の ARM Thumb テスト プログラムに関する質問です。
void (*ptr1)(void);
void main(void){
while(1){
ptr1=main;
}
}
リンカ マップ ファイルでは、関数 main() が 0x15C に配置されていると表示されますが、ptr1 は 0x15D に設定されています。なぜアドレスが異なるのでしょうか?
回答
ARM モード命令は 4 バイト境界で配置されます。Thumb モード命令は 2 バイト境界で配置されます。ARM アーキテクチャにおいて、関数ポインタのビット 0 は、メモリ位置ではなく、呼び出された関数のモード(ARM または Thumb)を示します。ビット 0 = 1 の場合、Thumb モードが選択されます。
詳細
- CARM User's Guide の Thumb Code Example を参照してください。