コアレジスタセット
すべてのArmプロセッサはロード/ストア・アーキテクチャを採用しており、演算処理はレジスタで行います。命令は16個すべてのレジスタにアクセスできますが、r13〜r15は特別な役割を持っています。
- スタックポインタ
現在のレジスタ値を一時退避するために使用するメモリ領域のアドレスを保持します。 - リンクレジスタ
BL命令の次の命令のアドレスを保持し、関数呼び出しを行う場合のリターンアドレスを保持します。 - プログラムカウンタ
プログラムを実行しているアドレスを保持します。Thumb-2命令の場合は、ワードまたはハーフワード単位に命令が配置され、ビット0は未定義となります。
cpsr(カレントプログラムステータスレジスタ)
プロセッサの演算結果や動作モード・割り込み設定状態を保持し、プログラムの制御などを使用します。
名称 | 意味 |
---|---|
N | 演算結果が負の場合に設定されます。 |
Z | 演算結果が0の場合に設定されます。 |
C | 演算結果がキャリーアウトの場合に設定されます。 |
V | 演算結果がオーバフローの場合に設定されます。 |
Q | 飽和が発生したことを示します。(自動クリアされません) |
J | プロセッサがJazelle状態かどうかを示します。 |
GE[3:0] | いくつかのSIMD命令で使用されます。 |
IT[7:0] | Thumb2-命令のIF-THEN条件付実行で使用します。 |
E | ロード/ストア命令のエンディアン形式を設定します。 |
A | 不正確データアボートを禁止にします。 |
I | IRQ割り込みの設定を行います。(I=1:IRQ割り込み禁止) |
F | FIQ割り込みの設定を行います。(F=1:FIQ割り込み禁止) |
T | T=0:プロセッサはステート/T=1: プロセッサはTHUMBステート |
MODE[4:0] | プロセッサ動作モードを設定します。 |
プログラマから見たレジスタ
プログラムを効率的に作成する場合、C/C++コンパイラが利用する関数への引数や戻り値について、考慮する必要があります。関数への引数や戻り値の仕様は、「AAPCS(Armアーキテクチャのプロシージャコール標準)」で定められています。
AAPCSを考慮したプログラムの作成
Armプロセッサは、64ビットデータを使用することができます。その場合、関数の引数定義の順番を入れ替えることで、パフォーマンスを向上させることが可能となります。64ビット引数は、偶数番のレジスタと連続した奇数番のレジスタを使用して渡します。また、スタックは8バイトアラインメントする必要があります。
関数コールの基本
32ビット引数が4個までの場合は、レジスタで引数を渡すことができるため、関数呼び出しを効率的に行うことができます。
long long型を含む場合
変数bは、64ビット引数となります。
double型を含む場合
レジスタと動作モード
Cortex-Aプロセッサは、動作モード(第5回参照)によって特定のレジスタが自動的に切り替えを行います。(cpsrレジスタは、spsrレジスタに保存されます。)FIQモードのみ、専用レジスタ「r8からr14」を利用することで、スタックの使用量を削減し、高速に動作させることが可能です。
Cortex-A9には、アーキテクチャレジスタと物理レジスタを使用するレジスタリネーミング機能(第2回参照)により、命令セットアーキテクチャを変更することなく、利用できるレジスタを増やし、動作を高速化させることが可能です。
浮動小数点とNEONレジスタ
Cortex-Aプロセッサは、オプションでArm浮動小数点アーキテクチャ(以下:VFP)を搭載し、同時にNEON汎用SIMDエンジン(以下:NEON)を搭載することが可能です。プロセッサによって搭載可能なVFPのバージョンは異なります。
プロセッサシリーズ | VFP型式 |
---|---|
Cortex-A5 | VFPv4 |
Cortex-A7 | VFPv4 |
Cortex-A8 | VFPv3 |
Cortex-A9 | VFPv3-D16 |
Cortex-A12 | VFPv4 |
Cortex-A15 | VFPv4 |
VFPとNEONレジスタは一部レジスタを共有し、コアレジスタ(r0-r15)と異なるレジスタセットを使用します。
s
こちらも是非
“もっと見る” Cortex-A編
初期化処理
リセット例外からmain()関数を呼び出すまでの初期化は、ユーザが作成する部分とArmコンパイラが実行する部分に分けることができます。コードのコピーや初期化変数/未初期化変数の初期化は、リンカのメモリ配置設定を処理系ライブラリが実行します。
PMU(パフォーマンス監視ユニット)
PMUに関連するレジスタは、ユーザモードでのアクセスは禁止されていますので、PMUSERENR(ユーザイネーブルレジスタ)を特権モードでユーザモードアクセス許可を設定します。PMUSERENRについては、 後述の該当項目を参照ください。
TrustZone(セキュリティ拡張機能)
TrustZoneはCortex-Aシリーズの拡張機能で、大規模OSやアプリケーションが動作するノーマルワールドとセキュリティ関連が動作するセキュアワールドを導入しています。TrustZoneでは、ノーマルワールドメモリ空間とセキュアワールドメモリ空間の分離が可能です。