5.34 C および C++ コードでの非境界整列データアクセス

命令を使用してメモリ内の非境界整列データに直接アクセスできる CISC アーキテクチャからレガシーコードを移植する場合など、メモリ内の非境界整列データにアクセスすることが必要となる場合があります。

ARMv4 アーキテクチャ、ARMv5 アーキテクチャ、および ARMv6 アーキテクチャ(一部の設定)では、メモリ内の非境界整列データにアクセスする際に、予期しない結果が返されないように注意が必要です。たとえば、C または C++ のソースコード内のワードを読み出すために C または C++ のソースコードが従来のポインタを使用する場合、ARM コンパイラは、LDR 命令を使用してそのワードを読み出すアセンブリ言語コードを生成します。この命令は、アドレスが 4 の倍数である場合(たとえばワード境界上にある場合)には、期待どおりに実行されます。しかし、アドレスが 4 の倍数でない場合、LDR 命令では本来の非境界整列ワードのロードが実行されず、ローテートされた結果が返されます。通常、このローテートはプログラマの予想に反する処理です。
ARMv6 以降のアーキテクチャでは、非境界整列アクセスは完全にサポートされています。
関連する概念
5.30 データ境界整列のタイプ
5.31 自然なデータ境界整列のメリット
5.35 C および C++ コードでの __packed 修飾子と非境界整列型のデータアクセス
関連する参考文書
5.32 コンパイラによる自然なバイト境界整列でのデータオブジェクトの格納
5.33 コンパイル時の自然なデータ境界整列の関連性
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.